什么时候我们应该使用'return this'和在页面对象中“返回新对象”?

时间:2015-08-06 14:43:53

标签: selenium 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()会返回new LoginPage(driver)而不是仅返回this? 两者都不会导航到另一个页面对象。

3 个答案:

答案 0 :(得分:2)

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

无需为登录页面创建新对象。他们正在检查

 // 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");
        }

在构造函数中。相反,他们可以调用一个函数来实现。这是一种设计方式而不是更多。

答案 1 :(得分:1)

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

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");
    }
}

}

答案 2 :(得分:1)

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

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

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

回答一般问题:

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

我写了更多关于状态和页面对象的内容,并分别进行了自我检查'在我的blog和相应的ACM队列文件beyond page objects上。