做过UI自动化的都晓得,在做UI自动化时定位特别依赖页面,一旦页面发生变更就不得不跟着去修改页面定位。
在webdriver中,假设你想对一个元素定位操作,那么你可能会编写下面的代码:
driver.findElement(By.id("ad")).click();
发现问题:
你有10个地方对这个元素做了这个操作,哪天这个控件的元素变了,你就不得不去修改10个地方。
那么,有什么好的方法来解决这个问题呢?
这就是PageObject模式的引入的必要性。
那到底什么是PageObject模式?
PageObject 见名思意思,就是页面对象,也就是把界面定位和业务操作分开,在我现在团队我推行的是三层模式,把UI自动化分为了对象库层,操作层和业务层。PO思想对界面交互细节进行了封装,这样可以使测试案例更关注业务,而非界面细节,提高了测试案例的可读性,同样也可以为我后期BDD(Behavior Driven Deveopment)的推行打好基础。
废话这么多来看个例子吧:
假设我现在要做一个登陆操作,那么我创建一个对象库层:
public class LoginPage{
public static By userName = By.name("userName");
public static By pwd = By.name("passWord");
public static By login=By.id("login");
}
操作层:
public void inputUser(String name, String pwd) {
driver.findElement(LoginPage.userName).sendKeys(name);
driver.findElement(LoginPage.pwd ).sendKeys(pwd);
}
业务层:
@Test
public void login(){
login.inputUser("username","pwd");
tools.click("点击【登录】",login);
}
很容易从上面的案例可以看出,PO模式引入前后的区别:
当然减少UI自动化脚本的维护,提高测试案例的可读性方式很多的,PO不是唯一的,也不是什么真理,根据自己环境拿出一套合适的方案才是目标。