考慮如下屬性文件prop.properties,為上述代碼例子中的UI元素指定了 “別名”:
admin.username = loginForm:tbUsername
admin.loginbutton = loginForm:btnLogin
admin.events.createnewevent = adminHomeForm:_activitynew
admin.events.cancel = addEditEventForm:_IDcancel
admin.events.viewoldevents = adminHomeForm:_activityold
其中定位信息還是指向頁面的HTML對象,但我們在測試腳本和UI元素之間引入一層抽象層。測試類從屬性文件中讀取定位信息,從而實現(xiàn)UI映射。
頁面對象設(shè)計模式
頁面對象設(shè)計模式,可以提高自動化測試腳本的維護(hù)性、減少代碼重復(fù),越發(fā)流行。頁面對象是一個面向?qū)ο蟮念,作為待測應(yīng)用對外提供的接口。測試代碼在需要和UI頁面交互時,使用此頁面對象類的方法。這樣做的好處是,如果UI頁面發(fā)生變化,測試代碼本身并不需要改變,只需要改變相應(yīng)的頁面對象的代碼。為適應(yīng)新UI頁面的所有更改,都位于一個地方。
頁面對象設(shè)計模式具有以下優(yōu)點:
1、測試代碼和頁面相關(guān)的代碼,比如頁面元素定位信息(若使用UI映射,也包括定位信息的應(yīng)用),頁面布局等,完全分離;
2、可以維護(hù)單一的儲存庫來存儲頁面提供的服務(wù)或操作,而不是把他們分散在測試代碼中。
在這兩種情況下,這使得任何由于UI界面變化導(dǎo)致的修改,都可以在一個地方進(jìn)行修改。關(guān)于該技術(shù)的更多有用信息,可以在眾多的博客上找到。我們也鼓勵讀者去閱讀更多。 許多人寫這樣的設(shè)計模式和超出本用戶指南的范圍,可以提供有用的提示。不過,為了讓你開始,我們將舉例說明頁面對象的一個簡單的例子。
首先,考慮一個例子,典型的自動化測試,不使用頁面對象。
/***
* Tests login feature
*/
public class Login {
public void testLogin() {
selenium.type("inputBox", "testUser");
selenium.type("password", "my supersecret password");
selenium.click("sign-in");
selenium.waitForPageToLoad("PageWaitPeriod");
Assert.assertTrue(selenium.isElementPresent("compose button"),
"Login was unsuccessful");
}
}
這種方法有兩個問題。
1、沒有分離測試代碼和待測應(yīng)用的定位器(在這個例子中是ID);兩者都交織在一個單一方法中。如果待測應(yīng)用UI改變了它的標(biāo)識,布局,或登錄輸入和處理的方式變化,測試代碼本身必須改變。
2、ID定位信息分散在多個測試代碼中,所有的測試不得不使用此登錄頁面。
使用頁面對象技術(shù),上述測試代碼可以按如下方式重寫,為登錄頁面的頁面對象例子:
/**
* Page Object encapsulates the Sign-in page.
*/
public class SignInPage {
private Selenium selenium;
public SignInPage(Selenium selenium) {
this.selenium = selenium;
if(!selenium.getTitle().equals("Sign in page")) {
throw new IllegalStateException("This is not sign in page, current page is: "
+selenium.getLocation());
}
}
/**
* Login as valid user
*
* @param userName
* @param password
* @return HomePage object
*/
public HomePage loginValidUser(String userName, String password) {
selenium.type("usernamefield", userName);
selenium.type("passwordfield", password);
selenium.click("sign-in");
selenium.waitForPageToLoad("waitPeriod");
return new HomePage(selenium);
}
}