阅读SeleniumHQ 的 pageobject 文档,他们指定了从不导航到其他页面的方法返回“this”的示例。我的问题是为什么?
我认为页面对象的状态可能是一个原因,但是页面本身(实际的 UI 页面)可能会更改状态或刷新,但页面对象本身不会。带有 @FindBy 注释的页面工厂已经确保每次调用它时都会找到每个 WebElement,因此元素的状态似乎与这种情况无关。
阅读SeleniumHQ 的 pageobject 文档,他们指定了从不导航到其他页面的方法返回“this”的示例。我的问题是为什么?
我认为页面对象的状态可能是一个原因,但是页面本身(实际的 UI 页面)可能会更改状态或刷新,但页面对象本身不会。带有 @FindBy 注释的页面工厂已经确保每次调用它时都会找到每个 WebElement,因此元素的状态似乎与这种情况无关。
考虑他们的例子
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 智能感知更加优雅
它允许方法链接,如 Tarun 的回答所示,但它也捕获流。如果从登录页面登录会将您路由到主页,那么您的登录方法将返回一个主页页面对象。如果该流程发生变化,您将更新您的登录方法以返回一些其他页面对象,这将在 IDE 中导致流程失败的任何地方出现错误。它可以帮助您更快地找到需要修复的地方。
话虽如此,我不会在我的方法中返回页面对象。我不是页面对象的方法链接的忠实粉丝。我认为它掩盖了测试流程,因为通过将太多方法链接在一起,您可能会忘记您所在的页面。
通过返回页面对象,您还必须为错误情况编写额外的方法等。您可以在他们的示例中看到这一点。有一个submitLogin()
返回主页的方法和一个submitLoginExpectingFailure()
返回登录页面的方法,依此类推。对我来说,我没有发现比额外代码和阅读测试流程的困难更重要的好处。