<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在使用 Python 進行編碼的時候,會使用自身自帶的編碼設計格式,比如說最常見的單例模式,稍微抽象一些的抽象工廠模式等等… 在利用 Python 做自動化測試的時候,是不是也有自己的設計模式呢?所以在今天這個小章節裡,需要續瞭解的就是 python 作為自動化測試裡面的一種設計模式,尤其是 UI自動化 的專屬模式 —> “PageObject” 自動化設計模式,簡稱 “PO模式” 。
瞭解並實現 “PageObject” 自動化設計模式
一種在測試自動化中變得流行的設計模式,使得自動化測試指令碼的程式碼量減少,避免程式碼重複,更加易讀,減少維護的成本。
其實簡單來說就是將頁面的操作、指令碼的Case、通用的頁面元素分開的這樣一個模式。
一般 PO 設計模式多數分為三層
第一層:(核心、BasePage層)
第二層:(頁面層、也叫設定層)
第三層:(封裝測試層)
使用單元測試框架對業務邏輯進行封裝測試
UI 頁面的頻繁變化,導致頁面 UI 元素頻繁的變動,PO設計模式便於元素定位改變的維護。
傳統線性自動化,多個用例指令碼中需要反覆的定位同一個元素,PO設計模式可以減少這部分頻繁定位元素的程式碼量
小節:減少重複程式碼的冗餘,便於UI頁面頻繁變更下的元素定位維護。
首先在專案裡建立一個 python package 命名為 pages ,然後在 pages 建立一個模組 base_page.py 用來作為第一層的 base_page核心層 。
如下圖:
嘗試構建最基礎的 base_page 層,程式碼範例如下:
# coding:utf-8 from selenium import webdriver class BasePage(object): """ 1、第一層 - 核心層-BasePage層,定義一個所有頁面都繼承的page層 2、對將要使用的 selenium 的底層方法進行二次封裝 """ def __init__(self, driver, path=None): # 建構函式,類的初始化 """ 為了方便編寫將 driver 初始化, 先使用 "self.driver = webdriver.Chrome()" 後續改為 self.driver = driver """ self.driver = webdriver.Chrome() # self.driver = driver self.driver.implicitly_wait(5) # 定義全域性的預設載入時間 self.load_page(path) # 存取並載入網頁 def load_page(self, path=None): # 存取並載入網頁,如果 path 不為空的話,直接傳給 driver.get() 存取 if path is not None: self.driver.get(path) def by_xpath(self, xpath): # 二次封裝 selenium 的 xpath 元素定位 return self.driver.find_element_by_xpath(xpath) def js_click(self, xpath): # JavaScript 定位元素,並執行 click self.driver.execute_script('arguments[0].click()', self.by_xpath(xpath))
到這裡,base_page 層算是寫完了,這就是一個最底層、最基礎的類,這個類讓我們實現了 selenium 底層的 Xpath 定位方法 與 JavaScript 定位元素方法,這些方法能夠幫助我們更好的去完成後續的定位處理操作。
ok,接下我們再去編寫各個頁面層的東西。
程式碼範例如下:
# coding:utf-8 from selenium import webdriver from pages.base_page import BasePage # 匯入 base_page 層 class HomePage(BasePage): # 定義 FirstPage(繼承 BasePage ) """ 1、第二層 - 各個頁面單獨封裝成層,頁面的元素、操作、流程 """ def direct_to_login(self): # 首頁跳轉至登入頁 return self.by_xpath("//*[@id='app']/div[1]/div[5]/div[3]") def direct_to_product(self): # 登陸成功後,跳轉至首頁 return self.by_xpath("//*[@id='app']/div[1]/div[5]/div[1]") # 方法流程 def cross_to_login(self): self.direct_to_login().click() # 點選 "登入" 按鈕進行登入 def cross_to_product(self): self.direct_to_product().click() # 點選 "首頁" 跳轉至首頁
程式碼範例如下:
# coding:utf-8 from selenium import webdriver from pages.base_page import BasePage # 匯入 base_page 層 class LoginPage(BasePage): # 定義 FirstPage(繼承 BasePage ) """ 1、頁面層(登入頁) - 各個頁面單獨封裝成層,頁面的元素、操作、流程 """ def login_username(self): # 登入頁 - 使用者名稱輸入框 return self.by_xpath("//*[@id='app']/div[1]/form/div[1]/div[2]/div/input") def login_password(self): # 登入頁 - 密碼輸入框 return self.by_xpath("//*[@id='app']/div[1]/form/div[2]/div[2]/div/input") def login_button(self): # 登入頁 - 登入按鈕 return self.by_xpath("//*[@id='app']/div[1]/form/div[3]/button") # 登入Case def login(self, username, password): # 登入方法,傳入 username 與 password self.login_username().send_keys(username) self.login_password().send_keys(password) self.login_button().click()
# coding:utf-8 from time import sleep from pages.base_page import BasePage # 匯入 base_page 層 class OrderPage(BasePage): # 定義 FirstPage(繼承 BasePage ) """ 1、頁面層(登入頁) - 各個頁面單獨封裝成層,頁面的元素、操作、流程 """ def product(self): # 下單 - 第一個產品 return self.by_xpath("//*[@id='app']/div[1]/div[4]/div[2]/a[1]") def ticket_book(self): # 門票 - 預定(按鈕) return self.by_xpath("//*[@id='app']/div[1]/div[5]/div[2]/div[2]/a") def book_date(self): # 門票 - 選擇日期 return self.by_xpath("//*[@id='app']/div[1]/form/div[1]/div[1]/div[2]/div/input") def to_order(self): # 門票下單 return self.by_xpath("//*[@id='app']/div[1]/form/div[4]/div/button") def pay_off(self): # 門票下單 - 支付 return self.by_xpath("//*[@id='app']/div[1]/form/div/div/button") def confirm(self): # 門票下單 - 確認支付 return self.by_xpath("/html/body/div[5]/div[3]/button[2]") # 下單成功Case def place_order(self): self.product().click() self.ticket_book().click() self.book_date().send_keys("2022-06-16") self.to_order().click() sleep(2) element = self.pay_off() self.driver.execute_script('arguments[0].click()', element) sleep(2)
以上,我們準備的所有頁面需要準備的元素定位、基線流程算是寫完了,但是具體的用例,應該如何實現呢?繼續往下看。
程式碼範例如下:
# coding:utf-8 import unittest from time import sleep from selenium import webdriver from pages.home_page import HomePage from pages.login_page import LoginPage from pages.order_page import OrderPage ''' 1、初始化 - 開啟瀏覽器,設定瀏覽器大小 2、最終操作 - 關閉瀏覽器 3、用例部分 - 登入 與 購買操作、下訂單、支付 ''' class TestTravel(unittest.TestCase): @classmethod def setUpClass(cls): # 每個測試類在載入之前執行一次 setUpClass ,初始化方法 cls.driver = webdriver.Chrome() cls.driver.maximize_window() def test_a_order(self): #初始化引數 username = '13500000001' password = 'Success@2020' #初始化介面 home_page = HomePage(driver=self.driver, path="http://django.t.mukewang.com/#/") login_page = LoginPage(driver=self.driver) order_page = OrderPage(driver=self.driver) #跳轉登入 home_page.cross_to_login() #登入 login_page.login(username, password) # 跳轉至訂單頁 home_page.cross_to_product() #下單 order_page.place_order() @classmethod def tearDownClass(cls): cls.driver.quit() # 徹底退出瀏覽器 if __name__ == '__main__': unittest.main()
這裡改造完成之後,記得將 "BasePage 層" 的 '# self.driver = driver' 取消註釋,並將 'self.driver = webdriver.Chrome()' 註釋掉 。
以上就是一個比較完整的通過 PO 的方式來連線三個頁面與基礎的 base_page 來寫出的更簡潔一些的測試用例。
執行結果如下:(速度可能過快,擔待一下,gif 只有15秒的時間)
到此這篇關於一文詳解Python中PO模式的設計與實現的文章就介紹到這了,更多相關Python PO模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45