- 公共方法代表页面提供的服务
- 尽量不要暴露页面的内部
- 通常不做断言
- 方法返回其他PageObjects
- 无需代表整个页面
- 相同动作的不同结果被建模为不同的方法
例子
public class LoginPage {
private final WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
//检查我们的页面是否正确。
if (!"Login".equals(driver.getTitle())) {
//或者,我们可以导航到登录页面,也许可以先注销
throw new IllegalStateException("This is not the login page");
}
}
//登录页面包含几个HTML元素,这些元素将表示为WebElements。
//这些元素的定位器只应定义一次。
By usernameLocator = By.id("username");
By passwordLocator = By.id("passwd");
By loginButtonLocator = By.id("login");
//登录页面允许用户在用户名字段中键入用户名
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);
}
//登录页面允许用户在知道输入了无效的用户名和/或密码的情况下提交登录表单
public LoginPage submitLoginExpectingFailure() {
//这是唯一提交登录表单的地方,并且由于登录失败,希望目标是登录页面。
driver.findElement(loginButtonLocator).submit();
//返回表示目标的新页对象。用户是否应该在提交带有凭据的登录后导航到主页
//如果登录失败,脚本将在尝试实例化LoginPage PageObject时失败。
return new LoginPage(driver);
}
//从概念上讲,登录页面为用户提供了能够“登录”的服务
//使用用户名和密码的应用程序。
public HomePage loginAs(String username, String password) {
//输入用户名、密码和提交登录名的PageObject方法已定义,此处不应重复。
typeUsername(username);
typePassword(password);
return submitLogin();
}
}