我们什么时候应该在页面对象中使用“return this”以及什么时候使用 "return new object"?

When should we use 'return this" and when "return new object" in pageobjects?

我正在阅读:https://github.com/SeleniumHQ/selenium/wiki/PageObjects 在我读到的例子中:

public LoginPage typePassword(String password) {
    // This is the only place that "knows" how to enter a password
    driver.findElement(passwordLocator).sendKeys(password);

    // Return the current page object as this action doesn't navigate to a page represented by another PageObject
    return this;    
}

public LoginPage submitLoginExpectingFailure() {
    // This is the only place that submits the login form and expects the destination to be the login page due to login failure.
    driver.findElement(loginButtonLocator).submit();
    ...
    // Return a new page object representing the destination. Should the user ever be navigated to the home page after submiting a login with credentials 
    // expected to fail login, the script will fail when it attempts to instantiate the LoginPage PageObject.
    return new LoginPage(driver);   
}

为什么方法 submitLoginExpectingFailure() return new LoginPage(driver) 而不是 returning this? 两者都不会导航到另一个页面对象。

我认为我们期望在执行 submitLoginExpectingFailure() 之后的原因是我们仍在 LoginPage 上,并且当我们创建新的 LoginPage 对象时,此检查会在此处的 class 构造函数中自动执行:

public class LoginPage {
private final WebDriver driver;

public LoginPage(WebDriver driver) {
    this.driver = driver;

    // Check that we're on the right page.
    if (!"Login".equals(driver.getTitle())) {
        // Alternatively, we could navigate to the login page, perhaps logging out first
        throw new IllegalStateException("This is not the login page");
    }
}

}

我想这是因为当凭据不正确时,它应该再次重定向到登录页面。因此,根据流程,他们再次创建 LoginPage

无需为登录创建新对象Page.They正在检查

 // Check that we're on the right page.
        if (!"Login".equals(driver.getTitle())) {
         // Alternatively, we could navigate to the login page, perhaps logging out first
            throw new IllegalStateException("This is not the login page");
        }

在 constructor.Instead 中,他们可以调用一个函数来完成 so.It 的设计方式,仅此而已。

需要考虑的一件事是,在所提供的代码中,构造函数会检查浏览器是否确实在登录页面上。因此,正如其他答案所指出的那样,重新创建页面对象的版本做得更多。

我通常在页面对象的 separate 方法中进行这样的检查。然后,此方法仅检查浏览器是否处于页面对象所期望的状态。 我通常在发生某些页面交互时调用此方法,并且我想验证浏览器是否在给定页面上。我倾向于在构造函数中调用此方法,因为有时我发现即使浏览器尚未处于相应状态也能够创建页面对象很方便。

另一件需要考虑的事情是这个代码库可能有点不完整。通常,您会收到有关错误登录的简短通知。这可能对应于一个新状态 (IncorrectLoginPage),这使得返回相应的新页面对象成为错误登录的自然结果。

笼统地回答你的问题:

  • 如果您停留在同一页面上,请使用 'return this'。
  • 如果您的浏览器应导航到新页面(或状态),请使用新页面对象。
  • 考虑让您的构造函数保持简单,并将状态检查分解为单独的方法。

我写了更多关于状态和页面对象的内容,并在我的 blog and corresponding ACM Queue paper beyond page objects 上分开了 'self checks'。