selenium+unittest實現po模型
阿新 • • 發佈:2021-06-15
1.PO模型簡介:
PO模型是Page Object Model的簡寫, 頁面物件模型。 PO模型又叫PO設計模式,是selenium自動化測試中最佳的設計模式之一,主要體現在對介面互動細節的封裝,將頁面定位和業務操作分開,也就是把物件的定位和測試指令碼分開,在實際測試中只需要關注業務流程,從而提高可維護性。 PO模型簡單來說:就是通過面向物件的方式,封裝頁面定位和頁面動作操作。與測試的邏輯分開。 通俗解釋一下就是每個頁面當成一個物件,給這些頁面寫一個類,每一個page class維護著該web頁的標籤元素集和操作這些元素的方法;至於測試指令碼則單獨寫,需要什麼就去這些頁面類去呼叫即可。這樣的好處就是如果頁面元素髮生變化,你去維護頁面類即可,測試類你基本不用管。 po 是一種設計思想,不同的人根據這個思想寫出來的程式碼是不一樣的。(重點看如何封裝) 總結:PO模型實現過程是:通過面向物件的方式,對頁面定位和頁面操作進行分離封裝(解耦合,方便後續維護)。 優點: 提高程式碼的可讀性 減少了程式碼的重複 提高程式碼的可維護性, 特別是針對UI介面頻繁變動的專案. (也就是面向物件的優點) 缺點: 造成專案結構比較複雜(因為是根據流程進行了模組化處理)
2.如何實現 PO 模型
PO模型一般首先抽象封裝一個BasePage類,這個基類擁有一些指向Webdriver例項的屬性,然後每一個Page繼承基類BasePage,可以通過driver管理每一個Page中的元素,而且在Page中將這些操作封裝為一個一個的方法。在測試用例中使用這些page類,進行組織測試步驟的工作。
這樣做的好處,就是有元素變化,只需要維護每一個Page就行了,測試步驟變化,只需要維護TestCase即可。
PO實現案例:
點選百度,輸入123,點選搜尋,找到好123的官網,進入,在官網找到百度地圖,點選檢視。
案例分析
page為3,第一頁為百度搜索頁,第二頁為好123搜尋頁,第三頁為百度地圖展示頁。根據PO模型的設計理念,基類的封裝一般包括,定位,點選,輸入傳送請求等。因為是多頁,所以unittest應該使用@classmethod實現,所以如下:
basepage:基類 searchpage:頁數 test_case:測試用例
# base.py # 基類,實際上也就是封裝-------把公共的方法封裝起來,用的時候直接呼叫即可 from selenium.webdriver.common.action_chains import ActionChains # 滑鼠操作 class BasePageClass(object): def __init__(self, driver, url): self.driver = driver self.base_url = url # 進入網址 def get(self): self.driver.get(self.base_url) # 元素定位,替代八大定位 def get_element(self, *locator): return self.driver.find_element(*locator) # 點選 def left_click(self, *locator): ActionChains(self.driver).click(self.get_element(*locator)).perform() # 輸入 def send_text(self, text, *locator): self.driver.find_element(*locator).send_keys(text) # 清除 def clear_text(self, *locator): self.driver.find_element(*locator).clear()
# search01.py
# 繼承基類。業務邏輯的實現。如果有多頁,則有多個該檔案
from basepage.base import BasePageClass
from selenium.webdriver.common.by import By
class SearchPageClass01(BasePageClass):
def __init__(self, driver, url):
BasePageClass.__init__(self, driver, url)
# 1.進入百度
def go_baidu(self):
self.get()
# 2.定位百度輸入框並清空傳送文字
def input(self, text):
self.get_element(By.ID, "kw").click()
self.send_text(text, By.ID, "kw")
# 3.點選搜尋按鈕
def click(self):
self.left_click(By.ID, "su")
# 4.定位好123點選
def hao123(self):
self.get_element(By.XPATH, ".//*[@id='1']/h3/a[1]").click()
# search02.py
# 繼承基類。業務邏輯的實現。如果有多頁,則有多個該檔案
from basepage.base import BasePageClass
from selenium.webdriver.common.by import By
class SearchPageClass02(BasePageClass):
def __init__(self, driver, url):
BasePageClass.__init__(self, driver, url)
# 定位百度地圖並點選
def biumap(self):
self.get_element(By.XPATH, ".//*[@id='userCommonSites']/ul/li[6]/div/a").click()
# search03.py
# 繼承基類。業務邏輯的實現。如果有多頁,則有多個該檔案
from basepage.base import BasePageClass
class SearchPageClass03(BasePageClass):
def __init__(self, driver, url):
BasePageClass.__init__(self, driver, url)
# test_01.py
# 繼承基類。業務邏輯的實現。如果有多頁,則有多個該檔案
from basepage.base import BasePageClass
class SearchPageClass03(BasePageClass):
def __init__(self, driver, url):
BasePageClass.__init__(self, driver, url)
以上就是最簡單的實現PO模型的全部內容
如果要匯入日誌,報告,資料等其他的內容,可以參考部落格:https://www.cnblogs.com/helenMemery/p/6687669.html