Selenium Page对象:我为什么要退回?

时间:2017-11-01 16:30:07

标签: selenium pageobjects page-factory

阅读SeleniumHQ's pageobject documentation,他们指定了从不导航到其他页面的方法返回“this”的示例。我的问题是为什么?

我认为页面对象的状态可能是一个原因,但是页面本身(实际的UI页面)可能会改变状态或刷新,但页面对象本身不会。带有@FindBy注释的Page Factory已经确保每次调用时都会找到每个WebElement,因此这种情况下元素的状态似乎并不相关。

2 个答案:

答案 0 :(得分:5)

考虑他们的例子

public LoginPage typeUsername(String username) {
    driver.findElement(usernameLocator).sendKeys(username);
    return this;    
}

public LoginPage typePassword(String password) {
    driver.findElement(passwordLocator).sendKeys(password);
    return this;    
}

public HomePage submitLogin() {
    driver.findElement(loginButtonLocator).submit();
    return new HomePage(driver);    
}

现在假设我们已创建页面对象create page。如果您没有返回任何代码所需的内容

page.typeUsername("tarun");
page.typePassword("lalwani");
HomePage newPage = page.submitLogin()

但是当你返回它时,它允许你进行方法链接。所以我可以像下面那样使用它

HomePage newPage = page.typeUsername("tarun").typePassword("lalwani").submitLogin()

正如您所看到的,它将为您节省一些编码工作,并且使用IDE intellisense可以更加优雅

答案 1 :(得分:0)

它允许方法链接,如Tarun的答案所示,但它也捕获了流量。如果从登录页面登录会将您引导至主页,则您的登录方法将返回主页页面对象。如果该流程发生了变化,您将更新您的登录方法以返回其他一些页面对象,这将导致IDE在流程失败的任何地方出现错误。它可以帮助您找到需要更快修复的地方。

话虽如此,我不会在我的方法中返回页面对象。我不是页面对象方法链的忠实粉丝。我认为它模糊了测试流程,因为你可以通过将太多方法链接在一起来忘记你所在的页面。

通过返回页面对象,您还必须为错误情况等编写额外的方法。您可以在他们的示例中看到这一点。有一个返回主页的submitLogin()方法和一个返回登录页面的submitLoginExpectingFailure()等等。对我来说,我还没有发现好处超过了额外的代码和阅读测试流程的难度。