先來看一個在騰訊課堂首頁搜索機構的操作步驟:
1:首先打開騰訊課堂的首頁:https://ke.qq.com
2:點擊課程或機構的下拉選擇圖標
3:選擇機構
4:在搜索框輸入要搜索的機構名稱
5:點擊查找圖標查找機構,跳轉到查找結果頁面
6:檢查查找出的機構名稱
7:點擊機構logo跳轉詳情頁面
上述操作涉及到兩個頁面,騰訊課堂首頁和搜索結果頁,操作圖示如下:
1:騰訊課堂首頁
2:搜索結果頁面
使用webdirver的api完成模擬上述步驟代碼如下:
SearchCase.java
上述代碼簡單而清晰,但如果每個測試用例都這樣去寫的話,將會出現非常多的重復性代碼,可維護性較低,因此,在使用Selenium WebDirver進行自動化開發時,可以使用po(頁面對象)編程的思想,減少重復性代碼、提高代碼的可維護性。
一:po的概念與思想
po是page object的縮寫,即頁面對象。使用po是對頁面進行抽象或者說建模的過程,需要把頁面當作一個對象。
面向對象編程語言中,進行面向對象編程需要考慮以下兩點:
1:對象的屬性(全局變量)
2:對象的行為(函數)
po思想也是一樣,對頁面進行抽象時,把頁面的一個一個的web元素設計為頁面對象的屬性,把頁面上的操作(如點擊、輸入等)設計為頁面對象的行為
二:po中元素的定位
Selenium提供了許多注解和Api可以方便的定位元素和初始化元素,如下是騰訊課堂首頁下拉選擇機構圖標的聲明方式:
三行代碼釋義:
1、@FindBy(css="i[class='icon-font i-v-bottom-small']")
指定了要元素的定位方式,如上表示以cssSelector方式進行定位,還有其他7種寫法@FindBy(id="xxx")、@FindBy(name="xxx")...
2、@CacheLookup
表示緩存查找到元素,重復使用可提高查詢速度
3、public WebElement select_icon;
聲明一個web元素類型的全局變量
三:po中元素的初始化
Po提供了 PageFactory.initElements()來初始化頁面元素,把查找的元素賦值到我們定義的屬性(全局變量)上面
為了非常方便的進行頁面元素的初始化,我們把該方法放置到頁面類型的構造方法中,當調用該構造方法創建頁面對象時,會調用該方法同時初始化頁面的元素
代碼如下:
四:頁面行為抽象
元素初始化后,通過操作元素(如點擊,輸入)即可完成頁面的功能,po中對頁面功能的抽象,則提現為聲明一個一個的對象方法
如下是頁面選擇機構的行為的抽象:
下面是對“騰訊課堂首頁”頁面進行抽象的完整代碼:
KeqqHomePage.java
其中繼承的父類BasePage僅僅只包含一個靜態全局變量driver,方便其他頁面繼承直接使用
BasePage.java
其中BrowerSelector.getWebDriver()方法是封裝好的一個工具類,用來啟動瀏覽器,得到driver對象用的,在后面的源代碼網盤鏈接中可以下載到。
相同的方式對“結果頁面”進行抽象,代碼如下:
SearchResultPage.java
執行測試的類,代碼如下:
Tester.java
總結:
po編程,實質上就是分離頁面元素、封裝頁面元素操作的過程,將可能變化的頁面元素單獨映射到對象屬性、將頁面元素操作抽象成函數,讓我們以面向對象方式理解抽象一個頁面,實際上就是編程中解耦思想的應用,從而簡化測試用例的步驟,提高自動化測試代碼的可維護性。
附公開課視頻和源碼百度雲鏈接:
https://pan.baidu.com/s/1GoZyigdWiHIQY3xy9nE2ww 密碼:1fgl