selenium - 在页面对象模型框架的构造函数中使用页面工厂类
问题描述
我一直在使用页面对象模型框架和测试来运行我们的自动化测试,并且正在使用页面工厂类来初始化页面对象的 Web 元素。为了初始化一个类的 web 元素,我在我的页面对象构造函数中使用以下语句 - objectname = PageFactory.initElements(driver, Page.class); 除了这段代码,我还有另一个语句来在构造函数中初始化我的驱动程序。像 driver = new firefoxdriver(); 我知道这不是正确的做事方式,但是当我执行调用此页面的测试时,我的浏览器会一次又一次地打开。但是,当我使用此方法时 - PageFactory.initElements(driver, this); 这个问题不会发生,我的测试执行得很好。有人可以解释一下 PageFactory.initElements(driver, Page. 班级); 完全有效,为什么我看到我看到的?
这是我的代码
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" );
}
解决方案
无论您将其放在何处,都会发生以下情况:
this.driver = new FirefoxDriver();
每次执行此行时,您都会使 selenium 打开一个新的浏览器窗口。如果您在构造函数中有这一行,那么每次创建类的对象时都会打开一个浏览器(SNMPPage
在您的情况下)
当你这样做PageFactory.initElements(driver, SNMPPage.class);
会发生以下情况:
- 该类
SNMPPage.class
被加载并使用反射检查以找到一个以 aWebDriver
作为参数的构造函数。如果找到该构造函数,则将其用于实例化对象。如果未找到该构造函数,则调用默认构造函数,并SNMPPage
在执行以下后续步骤后最终返回一个类型的对象。 Selenium 使用反射来初始化新创建的页面对象。当我说初始化时,我基本上是指以下内容:
- 对于每个类,它的公共、私有和受保护字段都被提取出来。
- 对于每个这样的字段,装饰器会喷出代理对象值,然后将其注入到页面对象的字段映射中。
- 如果该字段是 WebElement,则创建并使用使用 LocatingElementHandler 实例的代理。
- 如果该字段是 WebElement 列表,则创建并使用使用 LocatingElementListHandler 实例的代理。
长话短说:如果您尝试在页面对象的构造函数中初始化自己,请执行以下操作:
public SNMPPage() {
this.driver = new FirefoxDriver();
PageFactory.initElements(driver, this);
}
}
如果您是从页面对象外部执行此操作,那么您可以很好地执行以下操作:
WebDriver driver = new FirefoxDriver();
SNMPPage snmPPage = PageFactory.initElements(driver, SNMPPage.class);
我已经在我的博客中解释了 Page factory 的完整工作。您可以参考它以获取更多详细信息。
推荐阅读
- java - 如何修复“应用程序崩溃并在 mAuth = FirebaseAuth.getInstance(); 上出错”
- python - Pandas fillna() 不适用于 DataFrame 切片
- python - 我怎样才能进入这个类的角度?
- php - One button working, other button gives error of: "Notice: Undefined index: dbconfig.php on line 6"
- python-3.x - Python selenium select option from dropdown
- javascript - 如何将复选框值推送到数组中?
- python - Circular Primes Project Euler #35
- r - 在 R 中绘制时间序列时的日期顺序
- python - 使用 LineairSVM 以整数/双精度值预测情绪得分
- python - 如何在 shell 中模拟给 python 的信号?(不使用 kill)