【问题标题】:Different ways of initializing PageObjects using PageFactory使用 PageFactory 初始化 PageObjects 的不同方法
【发布时间】:2019-09-03 06:49:23
【问题描述】:

我正在尝试在页面对象模型中构建 Cucumber Java 框架。我已经创建了基本框架并且工作正常,但是对如何初始化页面感到困惑。我注意到在大多数教程中,他们已经在构造函数本身中初始化了页面。

例子:

public LoginPage(WebDriver driver)
{
   this.driver = driver;
   PageFactory.initElements(driver, this);
}

同样在所有页面类中,它们在构造函数本身中添加了initElements 方法。

但是有些网站我注意到不是在构造函数中初始化所有页面,而是在构造函数中初始化的第一页以及在某些方法的返回语句中初始化的所有其他页面(最后在当前页面中执行)。如果方法“login”是LoginPage.java 中的最后一个方法,那么它将初始化HomePage 作为返回类型。

例子:

public HomePage login(String un, String pw)
{
   ...
   ...
   return PageFactory. initElements(driver, HomePage.class); 
}

我的疑问:哪一种是正确的实施方法和高效的方法?

【问题讨论】:

    标签: java selenium selenium-webdriver page-factory


    【解决方案1】:

    没有“正确的方法”。 PageFactory.initElements(driver, HomePage.class) 创建给定类的新实例 (HomePage) 然后调用 PageFactory.initElements(driver, instance); PageFactory source code

    public static <T> T initElements(WebDriver driver, Class<T> pageClassToProxy) {
        T page = instantiatePage(driver, pageClassToProxy);
        initElements(driver, page);
        return page;
    }
    
    // translate to
    
    HomePage homePage = new HomePage();
    PageFactory.initElements(driver, homePage);
    return homePage;
    

    这与从 PO 构造函数调用 PageFactory.initElements(driver, this); 相同。

    主要区别实际上在于方法返回下一个PO,这允许使用方法链接。

    使用方法链:

    new LoginPage(driver)
        .login()
        .clickOnButton();
    

    并且没有方法链接:

    LoginPage loginPage = new LoginPage(driver);
    loginPage.login();
    
    HomePage homePage = new HomePage(driver);
    homePage.clickOnButton();
    

    *您可以在构造函数中使用PageFactory.initElements,并简单地使用return new HomePage(); 来使用方法链接。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多