版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第PO模式在selenium自動化測試框架的優(yōu)勢PO模型是:PageObjectModel的簡寫頁面對象模型
作用:就是把測試頁面和測試腳本進行分離,即把頁面封裝成類,供測試腳本進行調(diào)用;
分層機制,讓不同層去做不同類型的事情,讓代碼結構清晰,增加復用性。
PO設計模式是Selenium自動化測試中最佳的設計模式之一,主要體現(xiàn)在對界面交互細節(jié)的封裝
2.不使用PO設計會出現(xiàn)以下幾種情況:
復用性不太好,擴展性不好,易讀性差,不好維護,UI界面頻繁的項目維護起來比較麻煩。
3.PO模式的優(yōu)缺點
優(yōu)點:
提高代碼的可讀性減少了代碼的重復提高代碼的可維護性,特別是針對UI界面頻繁的項目
缺點:
造成項目結構比較復雜,因為是根據(jù)流程進行了模塊化處理
下面重點看下PO模式在selenium自動化測試框架的優(yōu)勢。
PO模式是在UI自動化測試過程當中使用非常頻繁的一種設計模式,使用這種模式后,可以有效的提升代碼的復用能力,并且讓自動化測試代碼維護起來更加方便。
PO模式的全稱叫pageobjectmodel(POM),有時候叫做pageobjectpattern。最開始由馬丁福勒提出,這個模式受到selenium自動化測試框架大力推廣,因而成為一種非常主流的自動化測試設計模式。
在PO模式當中,每一個UI頁面使用編程語言當中的類來表示。在這個類當中,通過函數(shù)形式定義頁面的行為和操作。這讓調(diào)用方不需要關注具體執(zhí)行的操作到底是點擊還是拖動,而是關注具體的業(yè)務,比如登錄、購物等等,甚至如果程序員直接把代碼給產(chǎn)品經(jīng)理看,他也是能看懂的。
沒有使用PO模式時
在測試用例中直接編寫瀏覽器操作API,對于代碼編寫者并沒有多高的難度,因為他自己已經(jīng)對這些API非常熟悉,但是這些瀏覽器操作并不能體現(xiàn)業(yè)務,至少沒有產(chǎn)品經(jīng)理那么熟悉,因此他很難和產(chǎn)品經(jīng)理進行溝通,也難和開發(fā)溝通,甚至在半個月之后,他已經(jīng)忘記了自己到底寫了什么東西。
deftest_login_mail(self):
driver=self.driver
driver.get("")
driver.find_element_by_id("idInput").clear()
driver.find_element_by_id("xxxxxxx").send_keys("xxxxx")
driver.find_element_by_id("xxxxxxx").clear()
driver.find_element_by_id("xxxxxxx").send_keys("xxxxxx")
driver.find_element_by_id("loginBtn").click()
使用PO模式
使用PO模式有利于梳理業(yè)務,也有利于和其他人進行溝通。當你把下面這段代碼拿給產(chǎn)品經(jīng)理看的時候,他也大概能知道你測的是什么業(yè)務,能幫你糾正你的測試流程是否正確,或者提出一些更有建設性的意見,這對于大型項目需要頻繁溝通和梳理業(yè)務時非常有用。
deftest_login_mail(self):
LoginPage(driver).login()
而瀏覽器本身的操作,就會被分離到一個更底層的模塊,這些代碼你可以不對調(diào)用方暴露,產(chǎn)品經(jīng)理并不關心你這個頁面中什么元素定位,他也不懂。
classLoginPage:
username_loc=(By.ID,"idInput")
password_loc=(By.ID,"pwdInput")
submit_loc=(By.ID,"loginBtn")
span_loc=(By.CSS_SELECTOR,"div.error-ttp")
dynpw_loc=(By.ID,"lbDynPw")
userid_loc=(By.ID,"spnUid")
def__init__(self,driver):
self.driver=driver
deflogin(self):
self.driver.find_element(*self.username_loc).clear()
self.driver.find_element(*self.username_loc).send_keys("xxxxx")
self.driver.find_element(*self.password_loc).clear()
self.driver.find_element(*self.password_loc).send_keys("xxxxxx")
self.driver.find_element(*self.submit_loc).click()
這種方式把元素定位方式也分離了。但是這種元素定位的表達式可讀性也不是很強,可以換用property方式來表示元素,所有的元素統(tǒng)一放在一起,修改起來也比較方便。
classLoginPage:
def__init__(self,driver)
self.driver=driver
@property
defusername_element(self):
returnself.driver.find_element('id','idInput')
defpassword_element(self):
returnself.driver.find_element('id','pwdInput')
defsubmit_element(self):
returnself.driver.find_element('id','loginBtn')
deflogin(self,name,password):
self.username_element.send_keys(name)
self.password_element.send_keys(password)
self.submit_element.click()
第三種方式可以充分利用Python的描述符特性,你會發(fā)現(xiàn)很多序列化庫或者ORM框架都有類似的用法。
classLoginPage:
def__init__(self,driver)
self.driver=driver
username=Element(css='#idInput',desc='用戶名輸入框')
password=Element(css='#pwdInput',desc='密碼輸入框')
confirm=Element(css='#loginBtn',desc='登錄確認按鈕')
deflogin(self,name,password):
self.username.send_keys(name)
self.password.send_keys(password)
self.confirm.click()
而Element類可以通過Python描述符實現(xiàn),這里為了方便,只定義了xpath的元素定位方法:
classElement:
def__init__(self,xpath=None,desc=''):
self.xpath=xpath
self.desc=desc
def__get__(self,instance,owner):
driver=instance.browser
el=driver.find_element('xpath',self.xpath)
returnel
PO模式和DDD
PO模式是DDD(領域驅(qū)動設計)的一個簡單實現(xiàn),但是還不夠徹底。如果要在自動化測試中貫徹DDD,我覺得還有一些可以優(yōu)化的空間。
首先某一個業(yè)務不一定只是單個頁面的操作,比如登錄不一定只涉及到LoginPage這個頁面,因此直接在LoginPage中編寫login函數(shù)就不是很合理。對于調(diào)用方來說,應該明確說明的是誰在登錄,而不是指某個頁面。像這樣:
user.login()
login(user)
我們編寫的代碼就像是自然語言,任何懂英語的人都知道代碼在做什么,在DDD中,叫做領域特定語言(DSL),要實現(xiàn)這種邏輯,在Page類和調(diào)用中間應該還會有一個層級來封裝user。
其次,Page頁面會依賴更底層的資源,比如組件,元素類型。因此在Page類的下方應該會使用InputElement,ButtonElement、SelectElement這樣的元素類和HeaderComponent、FooterComponent這樣的組件類。
classLoginPage:
username_filed=InputElement('xxx')
password_filed=PasswordElement('xxx')
領域驅(qū)動設計對于大型項目梳理業(yè)務、同步業(yè)務、溝通業(yè)務是非常有幫助的,是一種以業(yè)務為中心的設計范式。PO模式對于DDD的小范圍應用,以及具體了足夠多的好處:
便于維護。每一個頁面的操作都被單獨的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 撈沙船協(xié)議書范本
- 排水養(yǎng)護合同范本
- 攪拌回收合同范本
- 教師裝潢合同范本
- 2025年地方特色美食產(chǎn)業(yè)開發(fā)可行性研究報告
- 旅行社門店協(xié)議書
- 日本買賣合同范本
- 舊改合同補充協(xié)議
- 曠工解除合同范本
- 改姓的協(xié)議合同書
- 場地租賃終止協(xié)議
- 食品加工生產(chǎn)合同協(xié)議
- 內(nèi)分泌試題及答案
- 2025年人民法院聘用書記員考試試題及答案
- 2025安徽交控集團安聯(lián)公司所屬企業(yè)招聘2人筆試考試參考試題及答案解析
- 新疆兵地聯(lián)考試卷及答案
- 2025年急性肺栓塞診斷和治療指南解讀課件
- 小學生女生安全教育課件-1
- 反邪教反滲透課件
- 社區(qū)商業(yè)綜合體商業(yè)計劃書
- 老年人糖尿病課件
評論
0/150
提交評論