1. 程式人生 > 其它 >selenium+unittest實現po模型

selenium+unittest實現po模型

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