做過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模式引入前後的差別: