1冠句、PO模式詳解
PO/POM :Page Object Model的簡(jiǎn)稱(chēng)听隐。按照面向?qū)ο蟮乃枷刖猓秧?yè)面看做對(duì)象剃执,把里面的元素進(jìn)行封裝
- 一種設(shè)計(jì)模式,主要用于web UI自動(dòng)化框架設(shè)計(jì)中
-
被測(cè)頁(yè)面作為頁(yè)面對(duì)象懈息,其中包含元素定位和元素操作的方法肾档,將頁(yè)面對(duì)象和真實(shí)網(wǎng)站頁(yè)面一一對(duì)應(yīng)
image.png - 作用:測(cè)試頁(yè)面與測(cè)試腳本進(jìn)行分離,即把頁(yè)面封裝成類(lèi)漓拾,供測(cè)試腳本調(diào)用
- 分層機(jī)制:讓不同層去做不同類(lèi)型的事情阁最,讓代碼結(jié)構(gòu)清晰,增加復(fù)用性
2骇两、PO模式優(yōu)缺點(diǎn)
-
優(yōu)點(diǎn):
提高代碼的可讀性
減少代碼的重復(fù)
增加復(fù)用性
提高代碼的可維護(hù)性,特別是針對(duì)UI界面頻繁的項(xiàng)目 -
缺點(diǎn):
造成項(xiàng)目結(jié)構(gòu)比較復(fù)雜姜盈,因?yàn)楦鶕?jù)流程進(jìn)行了模塊化處理
3低千、PO模式示例
- 用戶注冊(cè)
- 創(chuàng)建class,即登錄頁(yè)面對(duì)象類(lèi)
- 類(lèi)屬性:用戶注冊(cè)框、密碼框、注冊(cè)按鈕的element
- 類(lèi)方法:各種元素操作
a. 方法中對(duì)selenium進(jìn)行二次封裝
b. 用例層直接調(diào)用其中方法即可 - 測(cè)試層從頁(yè)面操作層調(diào)用其中方法示血,實(shí)現(xiàn)用例和元素方法的分離
#-*-coding:utf-8-*-
"""
@author:百草
@file:testcase_selenium.py
@time:2023/08/02 14:52
"""
from selenium import webdriver
import unittest
import time
from selenium.webdriver.common.by import By
class TestCaseDemo(unittest.TestCase):
def setUp(self):
# 前置
self.driver=webdriver.Chrome()
def test_01_login(self):
self.driver.get("https://www.baidu.com/")
self.driver.find_element(By.ID,"u1").find_element(By.NAME,"tj_login").click() # 登錄
self.driver.implicitly_wait(10) # 隱式等待10秒
self.driver.find_element(By.ID,"TANGRAM__PSP_11__userName").send_keys("2944717202@qq.com") # 用戶名/手機(jī)號(hào)/郵箱
# self.driver.find_element(By.NAME, "password").send_keys("***@qq.com") # 密碼 # name非唯一的
# selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
self.driver.find_element(By.ID, "TANGRAM__PSP_11__password").send_keys("***") # 密碼
time.sleep(2) # 等待以便test
self.driver.find_element(By.ID,"TANGRAM__PSP_11__submit").submit() # 登錄 (submit與click?)
time.sleep(20) # 等待以便test
# self.assertIn() # 斷言
# 其他測(cè)試場(chǎng)景:更換賬號(hào)或密碼等多組數(shù)據(jù)
# 線型腳本:代碼冗余棋傍;可維護(hù)性&可擴(kuò)展性低
# => 對(duì)應(yīng)頁(yè)面封裝成一個(gè)對(duì)象/類(lèi),增加復(fù)用性难审、可維護(hù)性瘫拣、可擴(kuò)展性
def tearDown(self):
# 后置
self.driver.quit() # 關(guān)閉瀏覽器,同時(shí)關(guān)閉driver
# self.driver.close() # 僅關(guān)閉瀏覽器
# OSError: [WinError 6] 句柄無(wú)效告喊。
# 原因dirver沒(méi)有關(guān)閉麸拄,或使用driver.close()
# win批量關(guān)閉chromedriver
# taskkill /F /im chromedriver.exe
PO模式分三層
base:封裝每個(gè)頁(yè)面中相同的屬性和方法,如:元素定位黔姜、輸入拢切、點(diǎn)擊
pageobject:每一個(gè)頁(yè)面定義一個(gè)類(lèi),類(lèi)中包含具體元素和操作元素的方法
testcase:業(yè)務(wù)流程及測(cè)試數(shù)據(jù)
參考