1. PO模式的概念
Page Object是selenium目前比較流行的一種設計模式。它將頁面做爲一個對象,爲每個頁面設計一個類class,這個類中封裝了測試中須要用到的元素的獲取方法和對這些元素的操做方法。寫測試用例時,只要調用頁面對象中的屬性和方法,就能夠操做元素以執行用例。java
Page Object Model很好地利用了java面向對象和封裝的思想,對頁面細節交互的操做進行封裝,那麼咱們在寫測試用例的時候,能夠更加專一於頁面而不是界面細節。設計模式
2. PO模式的優勢
1)提升了測試代碼的可讀性;瀏覽器
2)下降測試代碼的維護成本,當頁面中的測試方法須要調整,咱們只要去對應的頁面類下進行調整便可;而傳統的測試代碼模式,全部頁面的元素獲取、元素操做和測試用例都是在一塊兒的,維護起來相對不方便;函數
3)減小了代碼的重複;測試
3. PO模型代碼示例
以搜索功能的測試用例爲例,如下舉例中,我將該頁面分紅了三個類:this
page類:封裝獲取執行搜索測試時,須要用到的元素的定位方法;spa
pageHandle類:封裝對元素的操做方法,例如,點擊元素、在元素上懸停、在元素中輸入內容等一系列常規操做;設計
pageBusiness類:經過調用pageHandle類中的方法,對測試時具體須要執行的業務操做進行封裝;code
page類:對象
package com.hizuche.page; import com.hizuche.base.BaseDriver; import com.hizuche.util.LocateWay; import org.openqa.selenium.WebElement; /** * @Author mac * @Description: 獲取頁面中各元素的定位方法,並返回出去 * @date: Create in 2018/10/18 16:39 */ /*構造函數傳入建立對象時所指定的瀏覽器驅動driver*/ public class Page extends BasePage { public Page(BaseDriver driver) { super(driver); } /** * 獲取【公司車輛】-搜索條件-車牌號搜索框的元素定位方法 * @return 返回車牌號搜索框的定位方法 */ public WebElement getCarNo() { //爲了減小代碼冗餘,定義了findElement方法爲元素定位方法 return findElement(LocateWay.getLocateWay("car_no")); } /** * 獲取【公司車輛】-搜索條件-車架號搜索框的元素定位方法 * @return 返回車架號搜索框的定位方法 */ public WebElement getVin() { return findElement(LocateWay.getLocateWay("vin")); } /** * 獲取【公司車輛】-搜索按鈕的元素定位方法 * @return 返回搜索按鈕的元素定位方式 */ public WebElement getSearchBtn() { return findElement(LocateWay.getLocateWay("searchCarBtn")); } }
pageHandle類:
package com.hizuche.handle; import com.hizuche.base.BaseDriver; import com.hizuche.page.Page; import org.openqa.selenium.*; import org.openqa.selenium.interactions.Actions; /** * @Author hp // * @Description: CompanyCarPageHandle類,定義了對【公司車輛】頁面中元素的操做,如點擊、輸入等 * @date: Create in 2018/10/18 17:51 */ public class PageHandle { public BaseDriver driver; public Page page; public WebDriver driver1; public Actions action; public PageHandle(BaseDriver driver) { this.driver = driver; page = new Page(driver); } /** * 在【公司車輛】-車牌號搜索框中,輸入搜索內容 * @param car_no 傳入搜索車牌號的關鍵字參數 */ public void inputCarNo(String car_no) { page.sendKeys(page.getCarNo(),car_no); } /** * 在【公司車輛】-車架號搜索框中,輸入搜索內容 * @param vin 傳入搜索車架號的關鍵字參數 */ public void inputVin(String vin) { page.sendKeys(page.getVin(),vin); } /** * 在【公司車輛】中點擊搜索按鈕 */ public void clickSearchBtn() { page.click(page.getSearchBtn()); } }
pageBusiness類:
package com.hizuche.business; import com.hizuche.base.BaseDriver; import com.hizuche.handle.PageHandle; public class PageBH { public BaseDriver driver; public PageHandle pageHandle; public PageBH(BaseDriver driver) { this.driver = driver; pageHandle= new PageHandle(driver); } /** * 封裝【公司車輛】的搜索操做 */ public void searchCompanyCar() throws Exception { /*調用PageHandle類中的方法,在車牌號搜索框中輸入浙A59關鍵字*/ pageHandle.inputCarNo("浙a59"); pageHandle.inputVin("LDp"); /*在頁面中點擊搜索按鈕*/ pageHandle.clickSearchBtn(); Thread.sleep(500); } }
這樣在實際測試的時候,只要直接調用PageHandleBH類,就能夠執行測試用例,對於搜索框、搜索按鈕的元素定位方法,以及業務上的操做,所有封裝在了對應的類中。若是其中一個方法發生變化,只要找到對應頁面的操做層進行改動便可。做爲selenium的初學者來說,PO設計模式是一種分層合理、邏輯清晰的設計方式,推薦在初學時就造成這種良好的用例設計習慣。