Selenium 页面对象:我为什么要 return 这个?

Selenium Page Objects: Why should I return this?

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

我认为页面对象的状态可能是一个原因,但是页面本身(实际 UI 页面)可能会更改状态或刷新,但页面对象本身不会。 Page Factory 其 @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);    
}

现在假设我们已经将页面对象创建为 page。如果您没有 return 您的代码想要的任何东西

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

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

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

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

更加优雅

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

话虽如此,我的方法中没有 return 页面对象。我不太喜欢页面对象的方法链接。我认为它模糊了测试流程,因为将太多方法链接在一起可能会忘记您所在的页面。

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