Python+Selenium+PO模型实现自动化测试
一. PO模型介紹
在自動化中,Selenium自動化測試中有一個名字經常被提及PageObject(思想與面向對象的特征相 同),通常PO模型可以大大提高測試用例的維護效率
PO模型又叫PO設計模式,是selenium自動化測試中最佳的設計模式之一,主要體現在對界面交互細節的封裝,將頁面定位和業務操作分開,也就是把對象的定位和測試腳本分開,在實際測試中只需要關注業務流程,從而提高可維護性。
優點:
重用,業務和對象分離,代碼結構清晰,減少了代碼的重復,方便代碼維護
缺點:
造成項目結構比較復雜(因為是根據流程進行了模塊化處理)
總結:PO模型實現過程是:通過面向對象的方式,對頁面定位和頁面操作進行分離封裝(解耦合,方便后續維護)。
二. PageObject設計模式
三:PO的核心要素
1.在PO模式中抽離封裝集成一個BasePage類,該基類應該擁有一個只實現webdriver實例的屬性
2.每一個page都繼承BasePage,通過driver來管理本page中元素,將page中的操作封裝成一個個方法
3.TestCase繼承unittest.Testcase類,并依賴page類,從而實現相應的測試步驟
四:代碼實現淘寶將手機加入購物車
1.提供一個basepage類
from selenium.webdriver.common.action_chains import ActionChains # 鼠標點擊操作 from selenium.webdriver.support.ui import WebDriverWait # 顯示等待 from selenium.webdriver.support import expected_conditions as EC # 判斷所需要的元素是否已經被加載出來'''BasePage封裝所有界面都公用的方法。例如driver,find_element等''' class BasePage():# 實例化def __init__(self,driver):self.driver=driver# 進入網址def get(self,url):self.driver.get(url)# 元素定位def get_element(self,*locator):return self.driver.find_element(*locator)# 點擊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.提供多個page(界面操作)
page1:在游覽器中訪問百度
from taobao.basepage.base_page import BasePageclass OpenBDPage(BasePage):# 初始化BsePage類的驅動def __init__(self,driver):BasePage.__init__(self,driver)# 打開百度def open_baidu(self,url):self.get(url)page2:在百度輸入淘寶并點擊
from taobao.basepage.base_page import BasePage from selenium.webdriver.common.by import Byclass SearchBDPage(BasePage):# 初始化BsePage類的驅動def __init__(self,driver):BasePage.__init__(self,driver)# 百度的輸入框def input_data(self,text):self.send_text(text,By.ID,'kw')# 點擊百度一下def click_baidu(self):self.left_click(By.ID,'su')# 點擊 淘 我喜歡def click_taobao(self):self.left_click(By.XPATH,".//*[@id='1']/h3/a[1]")page3:多標簽處理,點擊登錄掃描二維碼
from po.Base.base_page6 import BasePage from selenium.webdriver.common.by import Byclass WindowBDPage(BasePage):# 初始化BsePage類的驅動def __init__(self,driver):BasePage.__init__(self,driver)# 多標簽操作def switch_window_taobao(self,n):self.switch_window(1)# 點擊親,請登錄def click_login(self):self.left_click(By.CSS_SELECTOR,"a.h:nth-child(1)")# 點擊二維碼def click_qrcode(self):self.left_click(By.CSS_SELECTOR,".icon-qrcode")page4:搜索商品,選擇包郵,篩選價格,選擇手機
from po.Base.base_page6 import BasePage from selenium.webdriver.common.by import Byclass TaoBaoPage(BasePage):# 初始化BsePage類的驅動def __init__(self,driver):BasePage.__init__(self,driver)# 淘寶內的輸入def input_data(self,text):self.send_text(text,By.ID,'q')# 點擊搜索def click_search(self):self.left_click(By.CSS_SELECTOR,".btn-search")# 點擊包郵def click_baoyou(self):self.left_click(By.CSS_SELECTOR,"a.filter:nth-child(1) > span:nth-child(1)")# 輸入最低價格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)")# 輸入最高價格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)")# 點擊確定def click_confirm(self):self.left_click(By.CSS_SELECTOR,".J_SortbarPriceSubmit")# 點擊選擇手機def click_phone(self):self.left_click(By.CSS_SELECTOR,"#J_Itemlist_Pic_653968396721")page5:多標簽處理,選擇顏色,容量,加入購物車并查看
from po.Base.base_page6 import BasePage from selenium.webdriver.common.by import Byclass WindowTBPage(BasePage):# 初始化BsePage類的驅動def __init__(self, driver):BasePage.__init__(self, driver)# 多標簽操作def switch_window_phone(self, n):self.switch_window(2)# 點擊機身顏色def click_color(self):self.left_click(By.CSS_SELECTOR,"li.tb-txt:nth-child(15) > a:nth-child(1) > span:nth-child(1)")# 點擊存儲容量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)")# 點擊加入購物車def click_shoping(self):self.left_click(By.CSS_SELECTOR,".J_LinkAdd")# 點擊購物車查看def click_shopping_car(self):self.left_click(By.CSS_SELECTOR,"#mc-menu-hd > span:nth-child(2)")3.單元測試
執行測試用例的前置、后置條件,寫測試用例,進行實例化,調用方法
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):# 執行測試用例的前置條件@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('淘寶官網')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()# 執行測試用例的后置條件@classmethoddef tearDownClass(cls) -> None:cls.driver.quit()if __name__ == '__main__':unittest.main()4.生成html測試報告
import unittest from taobao.testcase.tbtestcase import TaoBaoTest from po.data.HTMLTestRunner import HTMLTestRunner class HtmlClass():def htmlMethod(self):suite = unittest.TestSuite()# 創建測試套件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="淘寶加入購物車",description="測試一期",verbosity=2).run(suite) htmlclass = HtmlClass() htmlclass.htmlMethod()5.測試報告展示
6.組織代碼
五:PO模式的優點
1:PO提供了一種業務流程與頁面元素操作分離的模式,這使得測試代碼變得更加清晰
2:頁面對象與用例分離,使得我們更好的復用對象
3:可復用的頁面方法代碼會變得更加優化
4:更加有效的命令方式使得我們更加清晰的知道方法所操作的UI元素
總結
以上是生活随笔為你收集整理的Python+Selenium+PO模型实现自动化测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Selenium实现将淘宝商品加入购物车
- 下一篇: Python+Appium+POM实现A