一,什么是Page Object模式
Page Object 見名知意铣墨,就是頁面對象,并將頁面元素定位方法和元素操作進行分離。
在實際自動化測試實戰(zhàn)過程中金刁,我們一般對腳本的實現(xiàn)分為三層:
(1)對象層: 用于存放頁面元素定位和控件操作
(2)邏輯層: 則是一些封裝好的功能用例模塊
? ? ? ?(3)業(yè)務(wù)層: 則是我們真正的測試用例的操作部分
二,PageObject 的優(yōu)點
減少代碼冗余
業(yè)務(wù)和實現(xiàn)分離
降低代碼維護成本
三,PageObject 的六大原則
? ? ? ? 1,The public methods represent the services that the page offers
????????????公共方法表示頁面提供的服務(wù)
? ? ? ? ?2,Try not to expose the internals of the page
????????????不要暴露頁面的細(xì)節(jié)
? ? ? ? 3,Generally don't make assertions
????????????Page設(shè)計中不要出現(xiàn)斷言,應(yīng)該寫在測試用例類中
? ? ? ? 4,Methods return other PageObjects
????????????方法應(yīng)該返回其他的Page對象
? ? ? ? 5,Need not represent an entire page
????????????不要去代表整個page织咧,如果一個頁面中有很多功能胀葱,只需要對重點功能封裝方法即可
? ? ? ? 6,Different results for the same action are modeled as different methods
????????????不同的結(jié)果返回不同的方法,不同的模式
四,原則解讀(很重要)
? ? (1)方法意義:
? ? ? ? ? ? 1.用公共的方法代表UI所提供的功能
? ? ? ? ? ? 2.方法應(yīng)該返回其他的PageObject或者返回用于斷言的數(shù)據(jù)
? ? ? ? ? ? 3.同樣的行為不同的結(jié)果可以建模為不同的方法
? ? ? ? ? ? 4.不要在方法內(nèi)加斷言
? ? (2)字段意義:
? ? ? ? ? ? 1.不要暴露頁面內(nèi)部元素給外部
? ? ? ? ? ? 2.不要建模UI內(nèi)的所有元素
四,示例:在企業(yè)微信添加成員(具體案例實現(xiàn))
步驟一:梳理測試用例;
????我們這里進行自動化的用例:
? ? ? ????? 用例1:在首頁點擊添加成員,填寫完成員信息后,點擊保存,添加成員成功;
? ? ? ? ????用例2:在通訊錄點擊添加成員,填寫完成員信息后,點擊保存,添加成員成功;
步驟二:構(gòu)建PO模型
? ? 根據(jù)步驟一的用例,可以畫出對應(yīng)的時序圖,從而構(gòu)建PO模型:
? ? ? ? 1.黃色方塊代表一個類;
? ? ? ? 2.每條線代表這個頁面提供的操作(即要實現(xiàn)的方法);
? ? ? ? 3.箭頭的開始端為開始頁面
? ? ? ? 4.箭頭的末尾端為跳轉(zhuǎn)頁面
步驟三:構(gòu)造頁面相關(guān)類和方法
? ? ? ?根據(jù)步驟二的時序圖,構(gòu)建頁面相關(guān)的類和放過, 實現(xiàn)暫時為空,如下圖:
步驟四:編寫測試用例
????根據(jù)業(yè)務(wù)邏輯編寫:
? ? 從圖上我們看出,每個頁面都需要實例化,當(dāng)page類多了之后,會多很多代碼,很不科學(xué):
? ?我們需要在對應(yīng)page類的方法中return直接實例化我們需要的末端頁面;
? ? 這樣我們就可以實現(xiàn)鏈?zhǔn)秸{(diào)用:
步驟五:填充具體實現(xiàn)
這一步需要取具體完善PO模型中的具體實現(xiàn)
1,首先需要解決不同pageobject之間不能重復(fù)打開瀏覽器的問題,他們需要使用同一個driver;
? ? 我們可以寫一個基礎(chǔ)類,其他類繼承基礎(chǔ)類,只在基礎(chǔ)類中打開一次瀏覽器,其他子類直接復(fù)用:
? 2,根據(jù)步驟四鏈?zhǔn)秸{(diào)用的邏輯依次寫好類中的具體內(nèi)容:
??? Homepage:
? MembersPage:
AddmembersPage:
3,更改斷言數(shù)據(jù):
4,運行用例:
步驟六:優(yōu)化用例
?? 在前面的五步其實就已經(jīng)達到了我們的目的,但是我們還可以進行優(yōu)化,使代碼更有條例,更易于維護:
????? (1)封裝樣板代碼
?????? 之前都需要在每一個page類都需要引入from selenium.webdriver.common.byimport By,我們可以把查找元素提取出來封裝一個基礎(chǔ)方法:
????? 這樣HomePage就可以變?yōu)?
?????? 同時其他page類不改也支持;
?? (2)提取頁面元素
????? 我們可以把頁面元素全都提取出來,可以直接放在類變量,也可以維護在yaml文件里,或者放在其他類型文件,這里我放在類里面:
????? 添加成員的輸入項被抽離出來以后,用例變?yōu)?
(3)添加起始頁的url
?? 我們按照上面的思路編寫用例二:
? 但是運行卻失敗了,我們看報錯信息是因為找不到元素,實際上實例化memberspage頁面沒有打開通訊錄頁面
? 要解決這個問題,我們可以添加起始頁的url:
? 更改基礎(chǔ)類:
?? MembersPage配置自己的類變量:
?再運行時,就可以了;