PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)
PO模式簡(jiǎn)介
1.什么是PO模式
PO模型是:Page Object Model的簡(jiǎn)寫(xiě) 頁(yè)面對(duì)象模型
作用:就是把測(cè)試頁(yè)面和測(cè)試腳本進(jìn)行分離,即把頁(yè)面封裝成類,供測(cè)試腳本進(jìn)行調(diào)用;
分層機(jī)制,讓不同層去做不同類型的事情,讓代碼結(jié)構(gòu)清晰,增加復(fù)用性。
PO設(shè)計(jì)模式是Selenium自動(dòng)化測(cè)試中最佳的設(shè)計(jì)模式之一,主要體現(xiàn)在對(duì)界面交互細(xì)節(jié)的封裝
2. 不使用PO設(shè)計(jì)會(huì)出現(xiàn)以下幾種情況:
復(fù)用性不太好,擴(kuò)展性不好,易讀性差,不好維護(hù),UI界面頻繁的項(xiàng)目維護(hù)起來(lái)比較麻煩。
3.PO模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 提高代碼的可讀性
- 減少了代碼的重復(fù)
- 提高代碼的可維護(hù)性,特別是針對(duì)UI界面頻繁的項(xiàng)目
缺點(diǎn):
- 造成項(xiàng)目結(jié)構(gòu)比較復(fù)雜,因?yàn)槭歉鶕?jù)流程進(jìn)行了模塊化處理
下面重點(diǎn)看下PO模式在selenium自動(dòng)化測(cè)試框架的優(yōu)勢(shì)。
PO模式是在UI自動(dòng)化測(cè)試過(guò)程當(dāng)中使用非常頻繁的一種設(shè)計(jì)模式,使用這種模式后,可以有效的提升代碼的復(fù)用能力,并且讓自動(dòng)化測(cè)試代碼維護(hù)起來(lái)更加方便。
PO模式的全稱叫page object model(POM),有時(shí)候叫做 page object pattern。最開(kāi)始由馬丁福勒提出,這個(gè)模式受到selenium自動(dòng)化測(cè)試框架大力推廣,因而成為一種非常主流的自動(dòng)化測(cè)試設(shè)計(jì)模式。
在PO模式當(dāng)中,每一個(gè)UI頁(yè)面使用編程語(yǔ)言當(dāng)中的類來(lái)表示。在這個(gè)類當(dāng)中,通過(guò)函數(shù)形式定義頁(yè)面的行為和操作。這讓調(diào)用方不需要關(guān)注具體執(zhí)行的操作到底是點(diǎn)擊還是拖動(dòng),而是關(guān)注具體的業(yè)務(wù),比如登錄、購(gòu)物等等,甚至如果程序員直接把代碼給產(chǎn)品經(jīng)理看,他也是能看懂的。
沒(méi)有使用PO模式時(shí)
在測(cè)試用例中直接編寫(xiě)瀏覽器操作API,對(duì)于代碼編寫(xiě)者并沒(méi)有多高的難度,因?yàn)樗约阂呀?jīng)對(duì)這些API非常熟悉,但是這些瀏覽器操作并不能體現(xiàn)業(yè)務(wù),至少?zèng)]有產(chǎn)品經(jīng)理那么熟悉,因此他很難和產(chǎn)品經(jīng)理進(jìn)行溝通,也難和開(kāi)發(fā)溝通,甚至在半個(gè)月之后,他已經(jīng)忘記了自己到底寫(xiě)了什么東西。
def test_login_mail(self): driver = self.driver driver.get("http://www.xxx.xxx.com") 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è)務(wù),也有利于和其他人進(jìn)行溝通。當(dāng)你把下面這段代碼拿給產(chǎn)品經(jīng)理看的時(shí)候,他也大概能知道你測(cè)的是什么業(yè)務(wù),能幫你糾正你的測(cè)試流程是否正確,或者提出一些更有建設(shè)性的意見(jiàn),這對(duì)于大型項(xiàng)目需要頻繁溝通和梳理業(yè)務(wù)時(shí)非常有用。
def test_login_mail(self): LoginPage(driver).login()
而瀏覽器本身的操作,就會(huì)被分離到一個(gè)更底層的模塊,這些代碼你可以不對(duì)調(diào)用方暴露,產(chǎn)品經(jīng)理并不關(guān)心你這個(gè)頁(yè)面中什么元素定位,他也不懂。
class LoginPage: username_loc=(By.ID,"idInput") password_loc =(By.ID,"pwdInput") submit_loc =(By.ID,"loginBtn") span_loc=(By.CSS_SELECTOR,"div.error-tt>p") dynpw_loc =(By.ID,"lbDynPw") userid_loc =(By.ID,"spnUid") def __init__(self, driver): self.driver = driver def login(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()
這種方式把元素定位方式也分離了。但是這種元素定位的表達(dá)式可讀性也不是很強(qiáng),可以換用 property 方式來(lái)表示元素,所有的元素統(tǒng)一放在一起,修改起來(lái)也比較方便。
class LoginPage: def __init__(self, driver) self.driver = driver @property def username_element(self): return self.driver.find_element('id', 'idInput') def password_element(self): return self.driver.find_element('id', 'pwdInput') def submit_element(self): return self.driver.find_element('id', 'loginBtn') def login(self, name, password): self.username_element.send_keys(name) self.password_element.send_keys(password) self.submit_element.click()
第三種方式可以充分利用Python的描述符特性,你會(huì)發(fā)現(xiàn)很多序列化庫(kù)或者ORM框架都有類似的用法。
class LoginPage: def __init__(self, driver) self.driver = driver username = Element(css='#idInput', desc='用戶名輸入框') password = Element(css='#pwdInput', desc='密碼輸入框') confirm = Element(css='#loginBtn', desc='登錄確認(rèn)按鈕') def login(self, name, password): self.username.send_keys(name) self.password.send_keys(password) self.confirm.click()
而 Element 類可以通過(guò) Python 描述符實(shí)現(xiàn),這里為了方便,只定義了xpath的元素定位方法:
class Element: 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) return el
PO模式和DDD
PO模式是DDD(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))的一個(gè)簡(jiǎn)單實(shí)現(xiàn),但是還不夠徹底。如果要在自動(dòng)化測(cè)試中貫徹DDD,我覺(jué)得還有一些可以優(yōu)化的空間。
首先某一個(gè)業(yè)務(wù)不一定只是單個(gè)頁(yè)面的操作,比如登錄不一定只涉及到LoginPage這個(gè)頁(yè)面,因此直接在LoginPage中編寫(xiě)login函數(shù)就不是很合理。對(duì)于調(diào)用方來(lái)說(shuō),應(yīng)該明確說(shuō)明的是誰(shuí)在登錄,而不是指某個(gè)頁(yè)面。像這樣:
user.login() # or login(user)
我們編寫(xiě)的代碼就像是自然語(yǔ)言,任何懂英語(yǔ)的人都知道代碼在做什么,在DDD中,叫做領(lǐng)域特定語(yǔ)言(DSL), 要實(shí)現(xiàn)這種邏輯,在Page類和調(diào)用中間應(yīng)該還會(huì)有一個(gè)層級(jí)來(lái)封裝user。
其次,Page頁(yè)面會(huì)依賴更底層的資源,比如組件,元素類型。因此在 Page 類的下方應(yīng)該會(huì)使用 InputElement, ButtonElement 、SelectElement 這樣的元素類和 HeaderComponent、FooterComponent 這樣的組件類。
class LoginPage: username_filed = InputElement('xxx') password_filed = PasswordElement('xxx')
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)對(duì)于大型項(xiàng)目梳理業(yè)務(wù)、同步業(yè)務(wù)、溝通業(yè)務(wù)是非常有幫助的,是一種以業(yè)務(wù)為中心的設(shè)計(jì)范式。PO模式對(duì)于DDD的小范圍應(yīng)用,以及具體了足夠多的好處:
- 便于維護(hù)。每一個(gè)頁(yè)面的操作都被單獨(dú)的存放在一個(gè)類文件中,當(dāng)前端頁(yè)面被修改之后,只需要找到對(duì)應(yīng)類文件進(jìn)行修改,其他的代碼并不需要進(jìn)行修改,這符合單一職責(zé)原則。
- 便于重復(fù)使用。在進(jìn)行自動(dòng)化測(cè)試的時(shí)候,一個(gè)測(cè)試由多個(gè)測(cè)試步驟組成,這些測(cè)試步驟可能涉及到多個(gè)頁(yè)面的操作。而用例與用例之間的操作可能重合。PO模式可以重復(fù)利用這些測(cè)試步驟,簡(jiǎn)化代碼的編寫(xiě)。
- 提高了可讀性。頁(yè)面的操作都被以函數(shù)的形式封裝起來(lái)了。函數(shù)名就具備注釋的作用,其他人閱讀代碼時(shí)可以通過(guò)函數(shù)了解業(yè)務(wù)。
到此這篇關(guān)于PO模式在selenium自動(dòng)化測(cè)試框架有什么好處的文章就介紹到這了,更多相關(guān)selenium自動(dòng)化測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python和Excel的完美結(jié)合的常用操作案例匯總
這篇文章主要介紹了Python和Excel的完美結(jié)合的常用操作案例匯總,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09調(diào)試Django時(shí)打印SQL語(yǔ)句的日志代碼實(shí)例
這篇文章主要介紹了調(diào)試Django時(shí)打印SQL語(yǔ)句的日志代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09python機(jī)器學(xué)習(xí)基礎(chǔ)K近鄰算法詳解KNN
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)基礎(chǔ)K近鄰算法詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11PyQt5+QtChart實(shí)現(xiàn)柱狀圖的繪制
QChart是一個(gè)QGraphicScene中可以顯示的QGraphicsWidget。本文將利用QtChart實(shí)現(xiàn)柱狀圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12Python使用pyfinance包進(jìn)行證券收益分析
在查找如何使用Python實(shí)現(xiàn)滾動(dòng)回歸時(shí),發(fā)現(xiàn)一個(gè)很有用的量化金融包——pyfinance。顧名思義,pyfinance是為投資管理和證券收益分析而構(gòu)建的Python分析包,主要是對(duì)面向定量金融的現(xiàn)有包進(jìn)行補(bǔ)充,如pyfolio和pandas等。pyfinance包含六個(gè)模塊,下面將一一介紹2021-11-11分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了
這篇文章主要介紹了分享PyCharm最新激活碼(真永久激活方法)不用每月找安裝參數(shù)或最新激活碼了一勞永逸,需要的朋友可以參考下2020-12-12Python smtplib實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了Python smtplib實(shí)現(xiàn)發(fā)送郵件功能,包含文本、附件、圖片等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05