1. 程式人生 > 其它 >web UI自動化之PO模式

web UI自動化之PO模式

技術標籤:WebUIselenium設計模式

PO是什麼:

  1. PO模式,Page Object的縮寫,頁面物件,設計框架的思想,分層思想
  2. 在PO下,應用程式的每一個頁面都有一個對應的page class
  3. 每一個page class維護著該web頁的元素集和操作這些元素的方法
  4. page class中的方法命名最好根據對應的業務場景進行,例如通常登入後我們需要等待幾秒鐘

PO的優勢:

  1. PO提供了一種業務流程與頁面元素操作分離的模式,這使得測試程式碼變得更加清晰
  2. 頁面物件與用例分離,使得我們更好的複用物件
  3. 可複用的頁面方法程式碼會變得更加優化
  4. 更加有效的命名方式使得我們更加清晰的知道方法所操作的UI元素

主要的分層方式:

  • 兩層:物件邏輯層+業務資料層
  • 三層:物件庫層+邏輯層+業務資料層
  • 四層:物件庫層+邏輯層+業務層+資料層

一般分為三層:

  1. 按照頁面劃分,把每個頁面可能涉及到的步驟寫下來 pageObject包,頁面的配置資訊寫在這個包的__init__裡面
  2. 把頁面的步驟組合在一起形成一個業務 pageAction包
  3. 測試用例的書寫,case層,跟單元測試框架結合使用,斷言,引數化,報告 case包
    在這裡插入圖片描述
    普通模式:
import time
import page
from base.baseApi import Base
from base.driver import Driver


class Login(Base)
: def __init__(self): # 定義例項屬性driver self.driver = webdriver.Chrome('E:\\chromedriver.exe') # 視窗最大化 self.driver.maximize_window() # 開啟首頁 def open_index(self): self.driver.get('連結地址') time.sleep(1) # 在首頁點選登入連結 def click_login_link(
self): self.base_click(page.loc_login_link) # 相同名字,只能找到第一個 # 頁面動作劃分 # 輸入使用者名稱 def input_username(self): self.base_input(page.loc_username, 'xueqing') # 輸入密碼 def input_password(self): self.base_input(page.loc_password, '123456') # 點選登入 def click_login(self): self.base_click(page.loc_login) def login_business(self): # 點選登入連結 self.click_login_link() # 輸入使用者名稱 self.input_username() # 輸入密碼 self.input_password() # 點選登入按鈕 self.click_login() # 斷言 def assert_business(self): # 頁面載入速度比較快,程式碼執行速度比較快,所以有時候需要讓程式碼等等頁面 time.sleep(5) assert 'xueqing' in self.driver.page_source # 退出瀏覽器 def close_driver(self): self.driver.close()

PO模式:

頁面操作page_login.py

import pageObject
import allure
from base.baseApi import Base

class PageLogin(Base):

    # 頁面動作劃分
    # 輸入使用者名稱
    @allure.step('輸入使用者名稱')
    def input_username(self, username):
        self.base_input(pageObject.login_username, username)

    # 輸入密碼
    @allure.step('輸入密碼')
    def input_password(self, password):
        self.base_input(pageObject.login_password, password)

    # 點選登入
    @allure.step('點選登入')
    def click_login_button(self):
        self.base_click(pageObject.login_button)

組合業務login_action.py

import time
from pageAction.action_manager import ActionManager

# 繼承ActionsManager,做到了頁面物件類例項化的最大複用性
class Login(ActionManager):
    '''
    組合業務
    1. 登入業務需要哪幾個頁面的哪幾個步驟
    2. 登入頁面 3個步驟
    3. index頁面 1個步驟
    '''

    def login_success(self):
        # 點選登入連結
        self.pageindex.click_login_link()
        # 輸入使用者名稱
        self.pagelogin.input_username('xueqing')
        # 輸入密碼
        self.pagelogin.input_password('123456')
        # 點選登入按鈕
        self.pagelogin.click_login_button()
        time.sleep(1)

    def login_business(self, username, password):
        # 點選登入連結
        self.pageindex.click_login_link()
        # 輸入使用者名稱
        self.pagelogin.input_username(username)
        # 輸入密碼
        self.pagelogin.input_password(password)
        # 點選登入按鈕
        self.pagelogin.click_login_button()

測試用例test_login.py

import pytest
import allure
import time
from base.driver import Driver
from pageAction.login_action import Login
from tool.readData import ReadData
from base.baseApi import Base

data = ReadData().get_yaml('test_login', 'login_data.yml')

@allure.feature('登入功能的測試用例')
class TestLogin():

    def setup_class(self):
        '''
        初始化chrome物件
        :return: 
        '''
        # 建立driver物件
        self.driver = Driver().get_dirver()
        # 建立login的業務物件
        self.login = Login(self.driver)
        # 建立base物件,呼叫page_source方法
        self.base = Base(self.driver)

    @pytest.mark.parametrize('args', data)
    @allure.title('登入功能的正向與逆向用例')
    def test_login(self, args):
        self.login.login_business(args['accounts'], args['pwd'])
        time.sleep(2)
        assert args['assert'] in self.base.base_page_source

    def teardown_class(self):
        '''
        所有測試用例執行完畢,關閉瀏覽器
        :return: 
        '''
        Driver().close_driver()