1

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

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

4

2 回答 2

6

考虑他们的例子

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 as page。如果您没有返回您的代码想要的任何内容

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

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

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

如您所见,它将为您节省一些编码工作,并且使用 IDE 智能感知更加优雅

于 2017-11-01T16:41:28.100 回答
0

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

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

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

于 2017-11-01T20:05:49.380 回答