Page Objects是一种设计模式,用来将页面上的对象进行模块化。通过消除重复的对象,建立起一个抽象基类,从而使得你在开发浏览器自动化测试脚本时有更好的维护性和更强的健壮性。
Page Objects可以从两个方面来看待:
从测试开发人员的角度来看, 一个Page Object可以看作一个服务。
从开发人员的角度来看, 一个Page Object可以看作良好结构的页面对象。
对于Page Objects来说,一定要理解,它是提供一个服务的对象,而不用更详细的研究它的方法以及结构的细节。
我们来举一个简单的例子,比如一个Web Mail的收件页面, 我们可以把它想象成一个服务,能够提供写信,读信,展示来信的主题等功能,对于我们测试来说,它这些功能是怎么实现的不是我们考虑的范围。
对于Page Objects来说,返回值应该是其他的Page Objects,这意味着我们是在不同的Page Objects中进行数据交互。
我们用login page来做个例子
public class LoginPage {
public HomePage loginAs(String username, String password) {
// ... 成功的login
}
public LoginPage loginAsExpectingError(String username, String password) {
// ...失败的login
}
public String getErrorMessage() {
// 判断一下错误的内容
}
}
从上面我们可以看到,不但要考虑成功的login到下一个page,也得考虑失败的login是转入那个page,还是在page上显示错误信息。考虑的都是page这个整体需要处理的行为。
另外,我们应该考虑的是,我们的测试应该是着重判断page的状态,拿inbox举例子:
public void testMessagesAreReadOrUnread() {
Inbox inbox = new Inbox(driver);
inbox.assertMessageWithSubjectIsUnread("I like cheese");
inbox.assertMessageWithSubjectIsNotUnread("I'm not fond of tofu");
}
我们的断言,是放在page的状态上,也可以这么写:
public void testMessagesAreReadOrUnread() {
Inbox inbox = new Inbox(driver);
assertTrue(inbox.isMessageWithSubjectIsUnread("I like cheese"));
assertFalse(inbox.isMessageWithSubjectIsUnread("I'm not fond of tofu"));
}
当然,我们也要先通过webdriver来判断我们所在的页面是对的,或者说我们要操作的Page Object是已经出现了
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");
}
}
// 理论上讲,login Page Object能提供Login As的服务
public HomePage loginAs(String username, String password) {
// 在这里是的详细操作步骤
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("passwd")).sendKeys(password);
driver.findElement(By.id("login")).submit();
//返回对象应该是一个新的Page Object
return new HomePage(driver);
}
}