PO模式在selenium自動化測試框架有什么好處

PO模式是在UI自動化測試過程當中使用非常頻繁的一種設計模式,使用這種模式后,可以有效的提升代碼的復用能力,并且讓自動化測試代碼維護起來更加方便。

PO模式的全稱叫page object model(POM),有時候叫做 page object pattern。最開始由馬丁福勒提出,這個模式受到selenium自動化測試框架大力推廣,因而成為一種非常主流的自動化測試設計模式。


在PO模式當中,每一個UI頁面使用編程語言當中的類來表示。在這個類當中,通過函數形式定義頁面的行為和操作。這讓調用方不需要關注具體執行的操作到底是點擊還是拖動,而是關注具體的業務,比如登錄、購物等等,甚至如果程序員直接把代碼給產品經理看,他也是能看懂的。

沒有使用PO模式時
在測試用例中直接編寫瀏覽器操作API,對于代碼編寫者并沒有多高的難度,因為他自己已經對這些API非常熟悉,但是這些瀏覽器操作并不能體現業務,至少沒有產品經理那么熟悉,因此他很難和產品經理進行溝通,也難和開發溝通,甚至在半個月之后,他已經忘記了自己到底寫了什么東西。

def test_login_mail(self):driver = self.driverdriver.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模式有利于梳理業務,也有利于和其他人進行溝通。當你把下面這段代碼拿給產品經理看的時候,他也大概能知道你測的是什么業務,能幫你糾正你的測試流程是否正確,或者提出一些更有建設性的意見,這對于大型項目需要頻繁溝通和梳理業務時非常有用。

def test_login_mail(self):LoginPage(driver).login()

而瀏覽器本身的操作,就會被分離到一個更底層的模塊,這些代碼你可以不對調用方暴露,產品經理并不關心你這個頁面中什么元素定位,他也不懂。

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 = driverdef 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()

這種方式把元素定位方式也分離了。但是這種元素定位的表達式可讀性也不是很強,可以換用 property 方式來表示元素,所有的元素統一放在一起,修改起來也比較方便。

class LoginPage:def __init__(self, driver)self.driver = driver@propertydef username_element(self):return self.driver.find_element('id', 'idInput')@propertydef password_element(self):return self.driver.find_element('id', 'pwdInput')@propertydef 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的描述符特性,你會發現很多序列化庫或者ORM框架都有類似的用法。

class LoginPage:def __init__(self, driver)self.driver = driverusername = Element(css='#idInput', desc='用戶名輸入框')password = Element(css='#pwdInput', desc='密碼輸入框')confirm = Element(css='#loginBtn', desc='登錄確認按鈕')def login(self, name, password):self.username.send_keys(name)self.password.send_keys(password)self.confirm.click()

而 Element 類可以通過 Python 描述符實現,這里為了方便,只定義了xpath的元素定位方法:

class Element:def __init__(self,xpath=None,desc=''):self.xpath = xpathself.desc = descdef __get__(self, instance, owner):driver = instance.browserel = driver.find_element('xpath', self.xpath)return el

PO模式和DDD
PO模式是DDD(領域驅動設計)的一個簡單實現,但是還不夠徹底。如果要在自動化測試中貫徹DDD,我覺得還有一些可以優化的空間。

首先某一個業務不一定只是單個頁面的操作,比如登錄不一定只涉及到LoginPage這個頁面,因此直接在LoginPage中編寫login函數就不是很合理。對于調用方來說,應該明確說明的是誰在登錄,而不是指某個頁面。像這樣:

user.login()
# or
login(user)

我們編寫的代碼就像是自然語言,任何懂英語的人都知道代碼在做什么,在DDD中,叫做領域特定語言(DSL), 要實現這種邏輯,在Page類和調用中間應該還會有一個層級來封裝user。

其次,Page頁面會依賴更底層的資源,比如組件,元素類型。因此在 Page 類的下方應該會使用 InputElement, ButtonElement 、SelectElement 這樣的元素類和 HeaderComponent、FooterComponent 這樣的組件類。

class LoginPage:username_filed = InputElement('xxx')password_filed = PasswordElement('xxx')

領域驅動設計對于大型項目梳理業務、同步業務、溝通業務是非常有幫助的,是一種以業務為中心的設計范式。PO模式對于DDD的小范圍應用,以及具體了足夠多的好處:

便于維護。每一個頁面的操作都被單獨的存放在一個類文件中,當前端頁面被修改之后,只需要找到對應類文件進行修改,其他的代碼并不需要進行修改,這符合單一職責原則。
便于重復使用。在進行自動化測試的時候,一個測試由多個測試步驟組成,這些測試步驟可能涉及到多個頁面的操作。而用例與用例之間的操作可能重合。PO模式可以重復利用這些測試步驟,簡化代碼的編寫。
提高了可讀性。頁面的操作都被以函數的形式封裝起來了。函數名就具備注釋的作用,其他人閱讀代碼時可以通過函數了解業務。

總結:

感謝每一個認真閱讀我文章的人!!!

作為一位過來人也是希望大家少走一些彎路,如果你不想再體驗一次學習時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,在這里我給大家分享一些自動化測試的學習資源,希望能給你前進的路上帶來幫助

軟件測試面試文檔

我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有字節大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207965.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網工內推 | 外企、合資公司急招網工,國內外旅游,健身年卡

01 深圳市耐施菲信息科技有限公司 招聘崗位:網絡工程師 職責描述: 1、負責項目的計劃、實施、過程管控、項目驗收等工作; 2、負責大型項目設備實施、安裝調試等售后維護工作; 3、分析、設計網絡拓撲結構、配置H3C、華為等交換機…

SQL FOREIGN KEY 約束- 保障表之間關系完整性的關鍵規則

SQL FOREIGN KEY 約束 SQL FOREIGN KEY 約束用于防止破壞表之間關系的操作。FOREIGN KEY 是一張表中的字段(或字段集合),它引用另一張表中的主鍵。具有外鍵的表稱為子表,具有主鍵的表稱為被引用表或父表。 以下是兩個表的例子&a…

dll動態鏈接庫【C#】

1說明: 在C#中,dll是添加 【類庫】生成的。 2添加C#的dll: (1)在VS中新建一個Windows應用程序項目,并命名為TransferDll。 (2)打開Windows窗體設計器,從工具箱中為窗體…

Unity 性能優化的手段【更新中】

目錄 對象池 減少Draw Calls 批處理 合并網格 貼圖集 LOD 基本原理 應用 優點 挑戰 LightMap 基本概念 如何工作 優點 缺點 對象池 使用對象池:頻繁地創建和銷毀對象會導致性能下降和內存碎片化。對象池可以預先創建一些對象,然后在需要時…

【數據開發】Hive 多表join中的條件過濾與指定分區

1、條件過濾 left join 中 on 后面加條件 where 和 and 的區別 1、 on條件是在生成臨時表時使用的條件,它不管and中的條件是否為真,都會保留左邊表中的全部記錄。2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有le…

Gemini:新一代AI產品的驚人功能和革命性影響

目錄 1 前言2 視頻分析與交互能力3 策劃推理能力4 教育領域的應用能力5 科學領域的論文解讀能力6 結語 1 前言 Google最新推出的AI產品Gemini引發了廣泛關注,其30分鐘的介紹和演示視頻展示了令人驚艷的功能。Gemini以其驚人的藝術創作能力脫穎而出,通過…

TCP一對一聊天

客戶端 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io…

python-04(入門基礎篇4——lists相關的部分語法)

python-04(入門基礎篇4——lists相關的部分語法) 1. 前言1.1 python入門1.2 參考官網 2. 關于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新項 4. 列表是可變類型4.1 更改其中某元素內容4.2 使用切片更改列表大小…

cesium學習記錄

有段時間自學了cesium,這里記錄一下自學過程,希望在所需之時查閱~~ 1、cesium源碼獲取與Index頁面介紹 官網網址 www.cesiumjs.org 源代碼下載:Platform-Dowmloads 在index.html右擊open with Live server開啟本地服務 點擊Documentation…

mysql 表分區類型

在MySQL中,有幾種不同類型的分區可以用于對表進行分區。以下是MySQL中常用的分區類型: 1. RANGE分區:基于給定的列范圍進行分區。例如,可以按照日期范圍或數值范圍對表進行分區。 CREATE TABLE sales (id INT NOT NULL AUTO_INC…

VMware安裝OpenEuler(安裝界面)

本文中使用的OpenEuler版本:22.03 LTS SP2 VMware:17.0.0 一、下載鏡像 根據CPU和場景,按需下載 https://www.openeuler.org/zh/download/?versionopenEuler%2022.03%20LTS%20SP2 二、初始化VmWare 三、配置操作系統 四、安裝操作系統 …

Nginx漏洞修復

1、漏洞 去掉在請求響應頭中存在的信息 Server: nginx X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1;modeblock 修復方法 在Nginx的配置文件中的 server 標簽內增加一下配置 server_tokens off; add_header X-Frame-Options SAMEORIGIN; …

Python繪制幾種常見的時序分析圖

時間序列數據是一種按照時間順序排列的觀測值集合,每個觀測值對應于一個特定的時間點。這種數據在許多領域中都具有重要的應用價值,如金融、經濟、氣候科學等。通過分析時間序列數據,可以幫助我們掌握潛在的模式、發現趨勢和季節性波動等重要…

【力扣】160.相交鏈表

160.相交鏈表 這個題目因為我之前在學指針的時候沒學好,所以總感覺有一種畏難,我害怕。但是當真正的開始學習之后,發現現在的腦袋還是能用的,所以不要放棄,你可以的! 題解: 總的來說還是挺簡…

CSGO游戲盲盒開箱源碼 盲盒對戰、幸運開箱、積分商城、Fl盲盒

源碼介紹: CSGO游戲盲盒開箱源碼 盲盒對戰、幸運開箱、積分商城、Fl盲盒。這個是一個新花樣玩法的盲盒程序。 僅供學習,請勿商用!請購買正版程序運營。 代碼下載:百度網盤

2、Linux_遠程操作

遠程操作 1.配置ifconfig 1.1輸入 ifconfig 查看 ip 的命令( ifconfig ) 1.2搜索 ifconfig 命令(yum search ifconfig) 1.3配置網卡 進入如下目錄配置網卡 cd /etc/syscofig/network-scripts編輯 ifcfg-ens33 vi ifcfg-ens33按 i 鍵進入編輯模式 按 …

Java第二十一章

一.網絡程序設計基礎 1.網絡協議 網絡協議規定了計算機之間連接的物理、機械(網線與網卡的連接規定)、電氣(有效的電平范圍)等特征,計算機之間的相互尋址規則,數據發送沖突的解決方式,長數據如何分段傳送與接收等內容.就像不同的國家有不同的…

邏輯漏洞與越權

邏輯漏洞與越權 越權 如果使用A用戶的權限去操作B用戶的數據,A的權限小于B的權限,如果能夠成功操作,則稱之為越權操作。 越權漏洞形成的原因是后臺使用了 不合理的權限校驗規則導致的。 一般越權漏洞容易出現在權限頁面(需要登…

掌握VUE中localStorage的使用

文章目錄 🍁localStorage的使用🌿設置數據🌿獲取數據🌿更新數據🌿刪除數據 🍁代碼示例🍁使用場景🍁總結 localStorage是一種Web瀏覽器提供的本地存儲機制,允許開發者在用…

java中ReentrantLock的實現原理是什么?

ReentrantLock 的實現原理主要涉及到兩個關鍵概念:同步器(Sync)和 AQS(AbstractQueuedSynchronizer,抽象隊列同步器)。 ReentrantLock 使用 AQS 來實現可重入鎖的機制。AQS 是 Java 并發包中的一個抽象基類…