最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Python中PO模式的設(shè)計與實現(xiàn)

 更新時間:2022年06月11日 09:49:30   作者:渴望力量的哈士奇  
在使用 Python 進行編碼的時候,會使用自身自帶的編碼設(shè)計格式,比如說最常見的單例模式等。本文將為大家介紹PageObject自動化設(shè)計模式(PO模式)的設(shè)計與實現(xiàn),感興趣的可以了解一下

在使用 Python 進行編碼的時候,會使用自身自帶的編碼設(shè)計格式,比如說最常見的單例模式,稍微抽象一些的抽象工廠模式等等… 在利用 Python 做自動化測試的時候,是不是也有自己的設(shè)計模式呢?所以在今天這個小章節(jié)里,需要續(xù)了解的就是 python 作為自動化測試里面的一種設(shè)計模式,尤其是 UI自動化 的專屬模式 —> “PageObject” 自動化設(shè)計模式,簡稱 “PO模式” 。

了解并實現(xiàn) “PageObject” 自動化設(shè)計模式

什么是PO模式

一種在測試自動化中變得流行的設(shè)計模式,使得自動化測試腳本的代碼量減少,避免代碼重復(fù),更加易讀,減少維護的成本。

其實簡單來說就是將頁面的操作、腳本的Case、通用的頁面元素分開的這樣一個模式。

一般 PO 設(shè)計模式多數(shù)分為三層

PO 三層模式

第一層:(核心、BasePage層)

  • 對 Selenium 的底層進行二次封裝,定義一個所有頁面都繼承的基礎(chǔ)屬性頁面 —> BasePage 。
  • 封裝 Selenium 的基本方法,例如:元素定位、元素等待、導(dǎo)航頁面、頁面跳轉(zhuǎn)等等...
  • PS:其實在使用的過程中不需要全部封裝,用到多少方法就封裝多少方法即可。(之前接觸過其他大佬的自動化框架,他把所有的 selenium 的底層的方法做了一層封裝,這樣做很好,能夠做很多的事情,但是比較繁重。實際上在真實使用的時候用不到那么多,所以不建議全部封裝)。

第二層:(頁面層、也叫配置層)

  • 頁面元素進行分離,每個元素只定位一次,隔離定位。如果頁面改變,只需要改變相應(yīng)的元素定位。
  • 如果存在一些業(yè)務(wù)的屬性、方法,需要將其通過業(yè)務(wù)方法的方式將業(yè)務(wù)與操作元素的動作分離開來。

第三層:(封裝測試層)

使用單元測試框架對業(yè)務(wù)邏輯進行封裝測試

PO 設(shè)計模式的優(yōu)點

UI 頁面的頻繁變化,導(dǎo)致頁面 UI 元素頻繁的變動,PO設(shè)計模式便于元素定位改變的維護。

傳統(tǒng)線性自動化,多個用例腳本中需要反復(fù)的定位同一個元素,PO設(shè)計模式可以減少這部分頻繁定位元素的代碼量

小節(jié):減少重復(fù)代碼的冗余,便于UI頁面頻繁變更下的元素定位維護。

將改寫的腳本轉(zhuǎn)為PO設(shè)計模式

首先在項目里創(chuàng)建一個 python package 命名為 pages ,然后在 pages 創(chuàng)建一個模塊 base_page.py 用來作為第一層的 base_page核心層 。

如下圖:

構(gòu)建基礎(chǔ)的 BasePage 層

嘗試構(gòu)建最基礎(chǔ)的 base_page 層,代碼示例如下:

# coding:utf-8
from selenium import webdriver

class BasePage(object):
    """
    1、第一層 - 核心層-BasePage層,定義一個所有頁面都繼承的page層
    2、對將要使用的 selenium 的底層方法進行二次封裝
    """

    def __init__(self, driver, path=None):     # 構(gòu)造函數(shù),類的初始化
        """
        為了方便編寫將 driver 初始化,
        先使用 "self.driver = webdriver.Chrome()" 后續(xù)改為 self.driver = driver
        """
        self.driver = webdriver.Chrome()
        # self.driver = driver
        self.driver.implicitly_wait(5)  # 定義全局的默認加載時間
        self.load_page(path)            # 訪問并加載網(wǎng)頁

    def load_page(self, path=None):     # 訪問并加載網(wǎng)頁,如果 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 定位元素,并執(zhí)行 click
        self.driver.execute_script('arguments[0].click()', self.by_xpath(xpath))

到這里,base_page 層算是寫完了,這就是一個最底層、最基礎(chǔ)的類,這個類讓我們實現(xiàn)了 selenium 底層的 Xpath 定位方法 與 JavaScript 定位元素方法,這些方法能夠幫助我們更好的去完成后續(xù)的定位處理操作。

ok,接下我們再去編寫各個頁面層的東西。

構(gòu)建首頁的 Page 層(HomePage)

代碼示例如下:

# coding:utf-8

from selenium import webdriver
from pages.base_page import BasePage    # 導(dǎo)入 base_page 層

class HomePage(BasePage):      # 定義 FirstPage(繼承 BasePage )
    """
    1、第二層 - 各個頁面單獨封裝成層,頁面的元素、操作、流程
    """
    def direct_to_login(self):      # 首頁跳轉(zhuǎn)至登錄頁
        return self.by_xpath("http://*[@id='app']/div[1]/div[5]/div[3]")

    def direct_to_product(self):    # 登陸成功后,跳轉(zhuǎn)至首頁
        return self.by_xpath("http://*[@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()    # 點擊 "首頁" 跳轉(zhuǎn)至首頁

構(gòu)建登錄頁的 Page 層(LoginPage)

代碼示例如下:

# coding:utf-8
from selenium import webdriver
from pages.base_page import BasePage    # 導(dǎo)入 base_page 層

class LoginPage(BasePage):      # 定義 FirstPage(繼承 BasePage )
    """
    1、頁面層(登錄頁) - 各個頁面單獨封裝成層,頁面的元素、操作、流程
    """
    def login_username(self):    # 登錄頁 - 用戶名輸入框
        return self.by_xpath("http://*[@id='app']/div[1]/form/div[1]/div[2]/div/input")

    def login_password(self):    # 登錄頁 - 密碼輸入框
        return self.by_xpath("http://*[@id='app']/div[1]/form/div[2]/div[2]/div/input")

    def login_button(self):      # 登錄頁 - 登錄按鈕
        return self.by_xpath("http://*[@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()

構(gòu)建 首頁 - 訂單 - 支付 流程的 Page 層(OrderPage)

# coding:utf-8

from time import sleep
from pages.base_page import BasePage    # 導(dǎo)入 base_page 層

class OrderPage(BasePage):      # 定義 FirstPage(繼承 BasePage )
    """
    1、頁面層(登錄頁) - 各個頁面單獨封裝成層,頁面的元素、操作、流程
    """
    def product(self):    # 下單 - 第一個產(chǎn)品
        return self.by_xpath("http://*[@id='app']/div[1]/div[4]/div[2]/a[1]")

    def ticket_book(self):  # 門票 - 預(yù)定(按鈕)
        return self.by_xpath("http://*[@id='app']/div[1]/div[5]/div[2]/div[2]/a")

    def book_date(self):    # 門票 - 選擇日期
        return self.by_xpath("http://*[@id='app']/div[1]/form/div[1]/div[1]/div[2]/div/input")

    def to_order(self):     # 門票下單
        return self.by_xpath("http://*[@id='app']/div[1]/form/div[4]/div/button")

    def pay_off(self):      # 門票下單 - 支付
        return self.by_xpath("http://*[@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)

以上,我們準備的所有頁面需要準備的元素定位、基線流程算是寫完了,但是具體的用例,應(yīng)該如何實現(xiàn)呢?繼續(xù)往下看。

PO 設(shè)計模式下測試Case的改造

代碼示例如下:

# 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、初始化 - 打開瀏覽器,設(shè)置瀏覽器大小
2、最終操作 - 關(guān)閉瀏覽器
3、用例部分 - 登錄 與 購買操作、下訂單、支付
'''

class TestTravel(unittest.TestCase):
    @classmethod
    def setUpClass(cls):                    # 每個測試類在加載之前執(zhí)行一次 setUpClass ,初始化方法
        cls.driver = webdriver.Chrome()
        cls.driver.maximize_window()

    def test_a_order(self):
        #初始化參數(shù)
        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)

        #跳轉(zhuǎn)登錄
        home_page.cross_to_login()

        #登錄
        login_page.login(username, password)

        # 跳轉(zhuǎn)至訂單頁
        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 的方式來連接三個頁面與基礎(chǔ)的 base_page 來寫出的更簡潔一些的測試用例。

運行結(jié)果如下:(速度可能過快,擔(dān)待一下,gif 只有15秒的時間)

到此這篇關(guān)于一文詳解Python中PO模式的設(shè)計與實現(xiàn)的文章就介紹到這了,更多相關(guān)Python PO模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows下python 3.9 Numpy scipy和matlabplot的安裝教程詳解

    windows下python 3.9 Numpy scipy和matlabplot的安裝教程詳解

    這篇文章主要介紹了windows下python 3.9 Numpy scipy和matlabplot的安裝教程詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 搭建pypi私有倉庫實現(xiàn)過程詳解

    搭建pypi私有倉庫實現(xiàn)過程詳解

    這篇文章主要介紹了搭建pypi私有倉庫實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • django 使用 request 獲取瀏覽器發(fā)送的參數(shù)示例代碼

    django 使用 request 獲取瀏覽器發(fā)送的參數(shù)示例代碼

    這篇文章主要介紹了django 使用 request 獲取瀏覽器發(fā)送的參數(shù)示例代碼,獲取數(shù)據(jù)有四種方式,具體內(nèi)容詳情大家跟隨腳本之家小編一起看看吧
    2018-06-06
  • Python實例之wxpython中Frame使用方法

    Python實例之wxpython中Frame使用方法

    本文介紹下wxpython中Frame的用法,不錯的python編程實例,有需要的朋友參考下
    2014-06-06
  • python的unittest測試類代碼實例

    python的unittest測試類代碼實例

    這篇文章主要介紹了python的unittest測試類代碼實例,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • Python for循環(huán)與getitem的關(guān)系詳解

    Python for循環(huán)與getitem的關(guān)系詳解

    這篇文章主要介紹了Python for循環(huán)與getitem的關(guān)系詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 解決pip install psycopg2出錯問題

    解決pip install psycopg2出錯問題

    這篇文章主要介紹了解決pip install psycopg2出錯問題。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 機器學(xué)習(xí)10大經(jīng)典算法詳解

    機器學(xué)習(xí)10大經(jīng)典算法詳解

    這篇文章主要為大家詳細介紹了機器學(xué)習(xí)10大經(jīng)典算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • python版飛機大戰(zhàn)代碼分享

    python版飛機大戰(zhàn)代碼分享

    這篇文章主要為大家詳細介紹了python版飛機大戰(zhàn)的實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python使用pdfminer解析pdf文件的方法示例

    python使用pdfminer解析pdf文件的方法示例

    這篇文章主要介紹了python使用pdfminer解析pdf文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論

乐亭县| 邹城市| 理塘县| 信丰县| 平潭县| 桐城市| 邯郸县| 临颍县| 宁德市| 搜索| 四川省| 遂昌县| 广安市| 汝阳县| 都匀市| 苏尼特右旗| 秦安县| 兴城市| 中阳县| 景东| 湖州市| 朝阳市| 航空| 黄陵县| 揭阳市| 黔江区| 淄博市| 浠水县| 顺昌县| 平原县| 周宁县| 工布江达县| 原平市| 临夏县| 宁波市| 革吉县| 余江县| 定兴县| 眉山市| 佛坪县| 正镶白旗|