2

我正在尝试在页面对象模型中构建一个 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); 
}

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

4

1 回答 1

4

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

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;

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

主要区别实际上在于该方法返回下一个 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();地使用方法链接。

于 2019-09-03T08:18:44.660 回答