我在读: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
?
两者都不会导航到另一个页面对象。
答案 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上。