我一直在使用页面对象模型框架进行测试以运行我们的自动化测试,并且正在使用页面工厂类来初始化页面对象的Web元素。要初始化类的Web元素,我在页面对象构造函数中使用以下语句-objectname = PageFactory.initElements(driver,Page.class);除了这段代码外,我还拥有另一条语句来初始化构造函数中的驱动程序。像driver = new firefoxdriver();我知道这不是正确的处理方式,但是当我执行调用此页面的测试时,我的浏览器会不断打开。但是,当我使用此方法时-PageFactory.initElements(driver,this);此问题不会发生,并且我的测试可以正常执行。谁能解释一下函数PageFactory.initElements(driver,Page.class);确实有效,为什么我看到自己看到的东西?
这是我的代码
public class SNMPPage {
static Logger log = Logger.getLogger(SNMPPage.class);
WebDriver driver;
public SNMPPage(){
this.driver = new FirefoxDriver();
PageFactory.initElements(driver, SNMPPage.class);
}
}
public class SNMP_Validations {
static Logger log = Logger.getLogger(SNMP_Validations.class);
SNMPPage snmpPage;
@BeforeClass
public void Initialize_Page_Elements() throws Exception{
ExcelUtils.setExcelFile(Constants.excelLocation, "SNMP Page");
snmpPage = new SNMPPage();
}
@Test`public void Verify_If_Enable_SNMP_Checkbox_Is_Selectable(){`
log.info("Verifying if enable checkbox in the SNMP page is selectable");
ExtentTestManager.getTest().log(Status.INFO,"Verifying if enable checkbox in the SNMP page is selectable" );
snmpPage.clickSnmpOptionInMainMenu();
Assert.assertEquals(snmpPage.checkIfEnableCheckboxIsSelectable(), true, "SNMP enable checkbox is not selectable");
log.info("SNMP enable checkbox is selectable");
ExtentTestManager.getTest().log(Status.INFO,"SNMP enable checkbox is selectable" );
}
@Test public void Verify_Error_Message_On_Submitting_System_Info_With_An_Empty_System_Name(){
log.info("Verifying if an error message is displayed when the user submits system info with an empty system name");
ExtentTestManager.getTest().log(Status.INFO,"Verifying if an error message is displayed when the user submits system info with an empty system name" );
snmpPage.clearSystemNameTextBox();
snmpPage.clickSaveButton();
Assert.assertEquals(snmpPage.verifyErrorMessageOnEmptySystemName(), true, "Error message not displayed when the user submits system info with an empty system name");
log.info("Error message displayed when the user submits system info with an empty system name");
ExtentTestManager.getTest().log(Status.INFO,"Error message displayed when the user submits system info with an empty system name" );
}
答案 0 :(得分:0)
最好创建一个驱动程序工厂,并在每次访问webdriver时都调用它。 并确保一旦驱动程序初始化,您将获得实例,而不创建新实例。
答案 1 :(得分:0)
无论放在哪里,都会发生以下情况:
this.driver = new FirefoxDriver();
每次执行此行时,您都会使硒打开一个新的浏览器窗口。如果构造函数中包含此行,则每次创建类的对象(在本例中为SNMPPage
时)都会打开一个浏览器
当您PageFactory.initElements(driver, SNMPPage.class);
发生以下情况:
SNMPPage.class
,并使用反射进行检查以查找将WebDriver
作为参数的构造函数。如果找到该构造函数,则将其用于实例化该对象。如果未找到该构造函数,则将在执行以下后续步骤后调用默认构造函数,并最终返回类型SNMPPage
的对象。Selenium使用反射来初始化新创建的页面对象。当我说初始化时,我基本上指的是以下内容:
长话短说: 如果您要在页面对象的构造函数中初始化自己,请按照以下步骤进行操作:
public SNMPPage() {
this.driver = new FirefoxDriver();
PageFactory.initElements(driver, this);
}
}
如果您是从页面对象外部执行此操作,则可以很好地执行以下操作:
WebDriver driver = new FirefoxDriver();
SNMPPage snmPPage = PageFactory.initElements(driver, SNMPPage.class);
我在博客here中解释了Page factory的完整工作。您可以参考它以获取更多详细信息。