首页 > 解决方案 > 在页面对象模型框架的构造函数中使用页面工厂类

问题描述

我一直在使用页面对象模型框架和测试来运行我们的自动化测试,并且正在使用页面工厂类来初始化页面对象的 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" );
}

标签: selenium

解决方案


无论您将其放在何处,都会发生以下情况:

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 的完整工作。您可以参考它以获取更多详细信息。


推荐阅读