做过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模式引入前后的区别:


PageObject模式的层次结构_业务层

 

当然减少UI自动化脚本的维护,提高测试案例的可读性方式很多的,PO不是唯一的,也不是什么真理,根据自己环境拿出一套合适的方案才是目标。