在自動(dòng)化中, Selenium 自動(dòng)化測(cè)試中有一個(gè)名字經(jīng)常被提及 PageObject( 思想與面向?qū)ο蟮奶卣飨?同 ) ,通常 PO 模型可以大大提高測(cè)試用例的維護(hù)效率
優(yōu)點(diǎn):可重用,業(yè)務(wù)和對(duì)象分離,代碼結(jié)構(gòu)清晰,方便代碼維護(hù)
核心要素
1. 在 PO 模式中抽離封裝集成一個(gè)BasePage 類(lèi),該基類(lèi)應(yīng)該擁有一個(gè)只實(shí)現(xiàn) webdriver 實(shí)例的屬性
2. 每一個(gè) page 都繼承 BasePage ,通過(guò) driver 來(lái)管理本 page 中元素,將 page 中的操作封裝成一個(gè)個(gè)方法
3.TestCase 繼承 unittest.Testcase 類(lèi),并依賴(lài) page 類(lèi),從而實(shí)現(xiàn)相應(yīng)的測(cè)試步驟
PO 實(shí)現(xiàn)進(jìn)入百度頁(yè)面輸入數(shù)據(jù)后進(jìn)入下一個(gè)頁(yè)面
組織代碼
1 :實(shí)現(xiàn) BasePage
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains #鼠標(biāo)操作
class BasePage():
'''
BasePage封裝所有界面都公用的方法。
例如driver,find_element等
'''
# 實(shí)例化BasePage類(lèi)時(shí),事先執(zhí)行的__init__方法,該方法需要傳遞參數(shù)
def __init__(self,driver,url):
self.driver = driver
self.base_url = url
# 進(jìn)入網(wǎng)址
def get(self):
self.driver.get(self.base_url)
#元素定位,替代八大定位
def get_element(self,*locator):
return self.driver.find_element(*locator)
#點(diǎn)擊
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()
# 表單切換
def switch_iframe(self,*locator):
self.driver.switch_to.frame(self.driver.find_element(*locator))
#窗口切換
def switch_window(self,n):
self.driver.switch_to.window(self.driver.window_handles[n])
2 :實(shí)現(xiàn) SearchPage
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class SearchOne(BasePage):
def __init__(self,driver,url):
BasePage.__init__(self,driver,url)
#進(jìn)入百度
def open_baidu(self):
self.get()
#輸入數(shù)據(jù)
def input_search_content(self,text):
self.send_text(text,By.ID,"kw")
# 點(diǎn)擊按鈕
def click_baidu_search(self):
self.left_click(By.ID, "su")
def click_open_hao(self):
self.left_click(By.XPATH,".//*[@id='1']/h3/a[1]")
3 :實(shí)現(xiàn) TestCase
import unittest
from selenium import webdriver
from page.page_one import SearchOne
from page.page_two import SearchTwo
class BaiBu(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(10)
def test001(self):
url="http://www.baidu.com"
s = SearchOne(self.driver,url)
s.open_baidu()
s.input_search_content("123")
s.click_baidu_search()
s.click_open_hao()
self.driver.switch_to.window(self.driver.window_handles[1])
def test002(self):
s=SearchTwo(self.driver,"")
s.open_baidu_map()
def tearDown(self) -> None:
# self.driver.quit()
pass
if __name__ == '__main__':
unittest.main()
PO 模式的優(yōu)點(diǎn)
1:PO 提供了一種業(yè)務(wù)流程與頁(yè)面元素操作分離的模式,這使得測(cè)試代碼變得更加清晰
2 :頁(yè)面對(duì)象與用例分離,使得我們更好的復(fù)用對(duì)象
3 :可復(fù)用的頁(yè)面方法代碼會(huì)變得更加優(yōu)化
4 :更加有效的命令方式使得我們更加清晰的知道方法所操作的 UI 元素
以上就是Python自動(dòng)化測(cè)試PO模型封裝的詳細(xì)內(nèi)容,更多關(guān)于Python自動(dòng)化測(cè)試PO模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- python中Task封裝協(xié)程的知識(shí)點(diǎn)總結(jié)
- Python面向?qū)ο蠓庋b繼承和多態(tài)示例講解
- Python 調(diào)用C++封裝的進(jìn)一步探索交流
- Python如何實(shí)現(xiàn)Paramiko的二次封裝
- 使用Python封裝excel操作指南
- python excel和yaml文件的讀取封裝
- python 使用paramiko模塊進(jìn)行封裝,遠(yuǎn)程操作linux主機(jī)的示例代碼
- Python之根據(jù)輸入?yún)?shù)計(jì)算結(jié)果案例講解