Page Objects是一種設(shè)計(jì)模式,用來(lái)將頁(yè)面上的對(duì)象進(jìn)行模塊化。通過(guò)消除重復(fù)的對(duì)象,建立起一個(gè)抽象基類,從而使得你在開發(fā)瀏覽器自動(dòng)化測(cè)試腳本時(shí)有更好的維護(hù)性和更強(qiáng)的健壯性。
Page Objects可以從兩個(gè)方面來(lái)看待:
從測(cè)試開發(fā)人員的角度來(lái)看, 一個(gè)Page Object可以看作一個(gè)服務(wù)。
從開發(fā)人員的角度來(lái)看, 一個(gè)Page Object可以看作良好結(jié)構(gòu)的頁(yè)面對(duì)象。
對(duì)于Page Objects來(lái)說(shuō),一定要理解,它是提供一個(gè)服務(wù)的對(duì)象,而不用更詳細(xì)的研究它的方法以及結(jié)構(gòu)的細(xì)節(jié)。
我們來(lái)舉一個(gè)簡(jiǎn)單的例子,比如一個(gè)Web Mail的收件頁(yè)面, 我們可以把它想象成一個(gè)服務(wù),能夠提供寫信,讀信,展示來(lái)信的主題等功能,對(duì)于我們測(cè)試來(lái)說(shuō),它這些功能是怎么實(shí)現(xiàn)的不是我們考慮的范圍。
對(duì)于Page Objects來(lái)說(shuō),返回值應(yīng)該是其他的Page Objects,這意味著我們是在不同的Page Objects中進(jìn)行數(shù)據(jù)交互。
我們用login page來(lái)做個(gè)例子
public class LoginPage {
public HomePage loginAs(String username, String password) {
// ... 成功的login
}
public LoginPage loginAsExpectingError(String username, String password) {
// ...失敗的login
}
public String getErrorMessage() {
// 判斷一下錯(cuò)誤的內(nèi)容
}
}
從上面我們可以看到,不但要考慮成功的login到下一個(gè)page,也得考慮失敗的login是轉(zhuǎn)入那個(gè)page,還是在page上顯示錯(cuò)誤信息?紤]的都是page這個(gè)整體需要處理的行為。
另外,我們應(yīng)該考慮的是,我們的測(cè)試應(yīng)該是著重判斷page的狀態(tài),拿inbox舉例子:
public void testMessagesAreReadOrUnread() {
Inbox inbox = new Inbox(driver);
inbox.assertMessageWithSubjectIsUnread("I like cheese");
inbox.assertMessageWithSubjectIsNotUnread("I'm not fond of tofu");
}
我們的斷言,是放在page的狀態(tài)上,也可以這么寫:
public void testMessagesAreReadOrUnread() {
Inbox inbox = new Inbox(driver);
assertTrue(inbox.isMessageWithSubjectIsUnread("I like cheese"));
assertFalse(inbox.isMessageWithSubjectIsUnread("I'm not fond of tofu"));
}
當(dāng)然,我們也要先通過(guò)webdriver來(lái)判斷我們所在的頁(yè)面是對(duì)的,或者說(shuō)我們要操作的Page Object是已經(jīng)出現(xiàn)了
public class LoginPage {
private final WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
// 判斷我們?cè)谡_的頁(yè)面上
if (!"Login".equals(driver.getTitle())) {
//如果不在,那報(bào)錯(cuò)
throw new IllegalStateException("This is not the login page");
}
}
// 理論上講,login Page Object能提供Login As的服務(wù)
public HomePage loginAs(String username, String password) {
// 在這里是的詳細(xì)操作步驟
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("passwd")).sendKeys(password);
driver.findElement(By.id("login")).submit();
//返回對(duì)象應(yīng)該是一個(gè)新的Page Object
return new HomePage(driver);
}
}