Python+Selenium+PO模型实现自动化测试
一. PO模型介紹
在自動(dòng)化中,Selenium自動(dòng)化測(cè)試中有一個(gè)名字經(jīng)常被提及PageObject(思想與面向?qū)ο蟮奶卣飨?同),通常PO模型可以大大提高測(cè)試用例的維護(hù)效率
PO模型又叫PO設(shè)計(jì)模式,是selenium自動(dòng)化測(cè)試中最佳的設(shè)計(jì)模式之一,主要體現(xiàn)在對(duì)界面交互細(xì)節(jié)的封裝,將頁(yè)面定位和業(yè)務(wù)操作分開,也就是把對(duì)象的定位和測(cè)試腳本分開,在實(shí)際測(cè)試中只需要關(guān)注業(yè)務(wù)流程,從而提高可維護(hù)性。
優(yōu)點(diǎn):
重用,業(yè)務(wù)和對(duì)象分離,代碼結(jié)構(gòu)清晰,減少了代碼的重復(fù),方便代碼維護(hù)
缺點(diǎn):
造成項(xiàng)目結(jié)構(gòu)比較復(fù)雜(因?yàn)槭歉鶕?jù)流程進(jìn)行了模塊化處理)
總結(jié):PO模型實(shí)現(xiàn)過程是:通過面向?qū)ο蟮姆绞?#xff0c;對(duì)頁(yè)面定位和頁(yè)面操作進(jìn)行分離封裝(解耦合,方便后續(xù)維護(hù))。
二. PageObject設(shè)計(jì)模式
三:PO的核心要素
1.在PO模式中抽離封裝集成一個(gè)BasePage類,該基類應(yīng)該擁有一個(gè)只實(shí)現(xiàn)webdriver實(shí)例的屬性
2.每一個(gè)page都繼承BasePage,通過driver來管理本page中元素,將page中的操作封裝成一個(gè)個(gè)方法
3.TestCase繼承unittest.Testcase類,并依賴page類,從而實(shí)現(xiàn)相應(yīng)的測(cè)試步驟
四:代碼實(shí)現(xiàn)淘寶將手機(jī)加入購(gòu)物車
1.提供一個(gè)basepage類
from selenium.webdriver.common.action_chains import ActionChains # 鼠標(biāo)點(diǎn)擊操作 from selenium.webdriver.support.ui import WebDriverWait # 顯示等待 from selenium.webdriver.support import expected_conditions as EC # 判斷所需要的元素是否已經(jīng)被加載出來'''BasePage封裝所有界面都公用的方法。例如driver,find_element等''' class BasePage():# 實(shí)例化def __init__(self,driver):self.driver=driver# 進(jìn)入網(wǎng)址def get(self,url):self.driver.get(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.iframe(self.driver.find_element(*locator))# 窗口切換def switch_window(self,n):self.driver.switch_to.window(self.driver.window_handles[n])# 顯示等待def find_element_by_wait(self, *locator):element = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_all_elements_located((locator[0], locator[1])))return element2.提供多個(gè)page(界面操作)
page1:在游覽器中訪問百度
from taobao.basepage.base_page import BasePageclass OpenBDPage(BasePage):# 初始化BsePage類的驅(qū)動(dòng)def __init__(self,driver):BasePage.__init__(self,driver)# 打開百度def open_baidu(self,url):self.get(url)page2:在百度輸入淘寶并點(diǎn)擊
from taobao.basepage.base_page import BasePage from selenium.webdriver.common.by import Byclass SearchBDPage(BasePage):# 初始化BsePage類的驅(qū)動(dòng)def __init__(self,driver):BasePage.__init__(self,driver)# 百度的輸入框def input_data(self,text):self.send_text(text,By.ID,'kw')# 點(diǎn)擊百度一下def click_baidu(self):self.left_click(By.ID,'su')# 點(diǎn)擊 淘 我喜歡def click_taobao(self):self.left_click(By.XPATH,".//*[@id='1']/h3/a[1]")page3:多標(biāo)簽處理,點(diǎn)擊登錄掃描二維碼
from po.Base.base_page6 import BasePage from selenium.webdriver.common.by import Byclass WindowBDPage(BasePage):# 初始化BsePage類的驅(qū)動(dòng)def __init__(self,driver):BasePage.__init__(self,driver)# 多標(biāo)簽操作def switch_window_taobao(self,n):self.switch_window(1)# 點(diǎn)擊親,請(qǐng)登錄def click_login(self):self.left_click(By.CSS_SELECTOR,"a.h:nth-child(1)")# 點(diǎn)擊二維碼def click_qrcode(self):self.left_click(By.CSS_SELECTOR,".icon-qrcode")page4:搜索商品,選擇包郵,篩選價(jià)格,選擇手機(jī)
from po.Base.base_page6 import BasePage from selenium.webdriver.common.by import Byclass TaoBaoPage(BasePage):# 初始化BsePage類的驅(qū)動(dòng)def __init__(self,driver):BasePage.__init__(self,driver)# 淘寶內(nèi)的輸入def input_data(self,text):self.send_text(text,By.ID,'q')# 點(diǎn)擊搜索def click_search(self):self.left_click(By.CSS_SELECTOR,".btn-search")# 點(diǎn)擊包郵def click_baoyou(self):self.left_click(By.CSS_SELECTOR,"a.filter:nth-child(1) > span:nth-child(1)")# 輸入最低價(jià)格def send_min_price(self,text):self.send_text(text,By.CSS_SELECTOR,"div.inputs:nth-child(1) > div:nth-child(1) > ul:nth-child(1) > li:nth-child(1) > input:nth-child(1)")# 輸入最高價(jià)格def send_max_price(self,text):self.send_text(text,By.CSS_SELECTOR,"div.inputs:nth-child(1) > div:nth-child(1) > ul:nth-child(1) > li:nth-child(3) > input:nth-child(1)")# 點(diǎn)擊確定def click_confirm(self):self.left_click(By.CSS_SELECTOR,".J_SortbarPriceSubmit")# 點(diǎn)擊選擇手機(jī)def click_phone(self):self.left_click(By.CSS_SELECTOR,"#J_Itemlist_Pic_653968396721")page5:多標(biāo)簽處理,選擇顏色,容量,加入購(gòu)物車并查看
from po.Base.base_page6 import BasePage from selenium.webdriver.common.by import Byclass WindowTBPage(BasePage):# 初始化BsePage類的驅(qū)動(dòng)def __init__(self, driver):BasePage.__init__(self, driver)# 多標(biāo)簽操作def switch_window_phone(self, n):self.switch_window(2)# 點(diǎn)擊機(jī)身顏色def click_color(self):self.left_click(By.CSS_SELECTOR,"li.tb-txt:nth-child(15) > a:nth-child(1) > span:nth-child(1)")# 點(diǎn)擊存儲(chǔ)容量def click_store(self):self.left_click(By.CSS_SELECTOR,"dl.J_Prop:nth-child(3) > dd:nth-child(2) > ul:nth-child(1) > li:nth-child(4) > a:nth-child(1) > span:nth-child(1)")# 點(diǎn)擊加入購(gòu)物車def click_shoping(self):self.left_click(By.CSS_SELECTOR,".J_LinkAdd")# 點(diǎn)擊購(gòu)物車查看def click_shopping_car(self):self.left_click(By.CSS_SELECTOR,"#mc-menu-hd > span:nth-child(2)")3.單元測(cè)試
執(zhí)行測(cè)試用例的前置、后置條件,寫測(cè)試用例,進(jìn)行實(shí)例化,調(diào)用方法
import unittest from selenium import webdriver from taobao.pages.page01 import OpenBDPage from taobao.pages.page02 import SearchBDPage from taobao.pages.page03 import WindowBDPage from taobao.pages.page04 import TaoBaoPage from taobao.pages.page05 import WindowTBPage import timeclass TaoBaoTest(unittest.TestCase):# 執(zhí)行測(cè)試用例的前置條件@classmethoddef setUpClass(cls) -> None:cls.driver=webdriver.Firefox()cls.driver.maximize_window()cls.driver.implicitly_wait(30)def test_01(self):p1=OpenBDPage(self.driver)p1.open_baidu('http://www.baidu.com')def test_02(self):p2=SearchBDPage(self.driver)p2.input_data('淘寶官網(wǎng)')p2.click_baidu()p2.click_taobao()def test_03(self):p3=WindowBDPage(self.driver)p3.switch_window_taobao(1)p3.click_login()p3.click_qrcode()def test_04(self):p4=TaoBaoPage(self.driver)p4.input_data('蘋果13')p4.click_search()p4.click_baoyou()p4.send_min_price(5000)p4.send_max_price(50000)time.sleep(2)p4.click_confirm()p4.click_phone()def test_05(self):p5=WindowTBPage(self.driver)p5.switch_window_phone(2)p5.click_color()p5.click_store()p5.click_shoping()p5.click_shopping_car()# 執(zhí)行測(cè)試用例的后置條件@classmethoddef tearDownClass(cls) -> None:cls.driver.quit()if __name__ == '__main__':unittest.main()4.生成html測(cè)試報(bào)告
import unittest from taobao.testcase.tbtestcase import TaoBaoTest from po.data.HTMLTestRunner import HTMLTestRunner class HtmlClass():def htmlMethod(self):suite = unittest.TestSuite()# 創(chuàng)建測(cè)試套件case_list = ["test_01","test_02","test_03","test_04","test_05"]for case in case_list:suite.addTest(TaoBaoTest(case))with open("../report.html","wb") as f:HTMLTestRunner(stream=f,title="淘寶加入購(gòu)物車",description="測(cè)試一期",verbosity=2).run(suite) htmlclass = HtmlClass() htmlclass.htmlMethod()5.測(cè)試報(bào)告展示
6.組織代碼
五:PO模式的優(yōu)點(diǎn)
1:PO提供了一種業(yè)務(wù)流程與頁(yè)面元素操作分離的模式,這使得測(cè)試代碼變得更加清晰
2:頁(yè)面對(duì)象與用例分離,使得我們更好的復(fù)用對(duì)象
3:可復(fù)用的頁(yè)面方法代碼會(huì)變得更加優(yōu)化
4:更加有效的命令方式使得我們更加清晰的知道方法所操作的UI元素
總結(jié)
以上是生活随笔為你收集整理的Python+Selenium+PO模型实现自动化测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Selenium实现将淘宝商品加入购物车
- 下一篇: ADB移动端测试