web UI自動化之PO模式
阿新 • • 發佈:2021-01-20
PO是什麼:
- PO模式,Page Object的縮寫,頁面物件,設計框架的思想,分層思想
- 在PO下,應用程式的每一個頁面都有一個對應的page class
- 每一個page class維護著該web頁的元素集和操作這些元素的方法
- page class中的方法命名最好根據對應的業務場景進行,例如通常登入後我們需要等待幾秒鐘
PO的優勢:
- PO提供了一種業務流程與頁面元素操作分離的模式,這使得測試程式碼變得更加清晰
- 頁面物件與用例分離,使得我們更好的複用物件
- 可複用的頁面方法程式碼會變得更加優化
- 更加有效的命名方式使得我們更加清晰的知道方法所操作的UI元素
主要的分層方式:
- 兩層:物件邏輯層+業務資料層
- 三層:物件庫層+邏輯層+業務資料層
- 四層:物件庫層+邏輯層+業務層+資料層
一般分為三層:
- 按照頁面劃分,把每個頁面可能涉及到的步驟寫下來 pageObject包,頁面的配置資訊寫在這個包的__init__裡面
- 把頁面的步驟組合在一起形成一個業務 pageAction包
- 測試用例的書寫,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()