阅读SeleniumHQ's pageobject documentation,他们指定了从不导航到其他页面的方法返回“this”的示例。我的问题是为什么?
我认为页面对象的状态可能是一个原因,但是页面本身(实际的UI页面)可能会改变状态或刷新,但页面对象本身不会。带有@FindBy注释的Page Factory已经确保每次调用时都会找到每个WebElement,因此这种情况下元素的状态似乎并不相关。
答案 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()
等等。对我来说,我还没有发现好处超过了额外的代码和阅读测试流程的难度。