在页面对象模型框架的构造函数中使用页面工厂类

时间:2019-07-04 12:41:30

标签: selenium

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

2 个答案:

答案 0 :(得分:0)

最好创建一个驱动程序工厂,并在每次访问webdriver时都调用它。 并确保一旦驱动程序初始化,您将获得实例,而不创建新实例。

答案 1 :(得分:0)

无论放在哪里,都会发生以下情况:

this.driver = new FirefoxDriver();

每次执行此行时,您都会使硒打开一个新的浏览器窗口。如果构造函数中包含此行,则每次创建类的对象(在本例中为SNMPPage时)都会打开一个浏览器

当您PageFactory.initElements(driver, SNMPPage.class);

发生以下情况:

  • 已加载类SNMPPage.class,并使用反射进行检查以查找将WebDriver作为参数的构造函数。如果找到该构造函数,则将其用于实例化该对象。如果未找到该构造函数,则将在执行以下后续步骤后调用默认构造函数,并最终返回类型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);

我在博客here中解释了Page factory的完整工作。您可以参考它以获取更多详细信息。