物件導向的特性:封裝、繼承、多型。在自動化中一樣適用,selenium自動化測試中有乙個名字常常被提及pageobject(思想與物件導向的特性相同),通過po模式可以大大提高測試用例的維護效率。
##傳統測試指令碼的弊端
測試指令碼分離,維護成本高
可擴充套件性差
復用性低等
pageobject設計模式
selenium自動化測試框架之po設計模式
po的核心要素:
在po模式中抽象封裝成乙個basepage類,該基類應該擁有乙個只實現webdriver例項的屬性。
每個乙個page都繼承basepage,通過driver來管理本page中元素,將page中的操作封裝成乙個個的方法。
testcase繼承unittest.testcase類,並且依賴page類,從而實現相應的測試步驟。
案例基礎案例
前面基礎場景選取的是baidu搜尋頁面(baidu頁面簡單,不需要搭建測試環境)baidu.py
from selenium import webdriver
from time import sleep
driver = webdriver.firefox()
driver.get(「
driver.find_element_by_xpath("//input[@id=『kw』]").send_keys(「bela」)
driver.find_element_by_xpath("//input[@id=『su』]").click()
sleep(5)
driver.quit()
將上面的指令碼放在baidu.py檔案中。
分析通過對baidu.py指令碼的分析,可以提取到:
不同的執行指令碼環境,瀏覽器不同:驅動webdriver.firefox()可以剝離,
請求位址的變化(生產環境與測試環境):url==可以剝離
實際測試場景中,可能有多個測試場景,如果每個測試場景都需要維護url、瀏覽器驅動、元素定位等,效率會非常低。
因此基於對上面的分析,是否可以設計乙個所有測試頁面(selenium本身是對b/s系統開展測試)的基類,來維護一些公共的方法。此處先定義個名字哦basepage.py,用於存放頁面公共方法及webdriver原有方法二次封裝等。
basepage.py內容如下:
from selenium.webdriver.support.wait import webdriverwait
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as ec
class basepage(object):
「」"basepage封裝所有頁面都公用的方法,例如driver, find_element等
「」"# 例項化basepage類時,最先執行的就是__init__方法,該方法的入參,其實就是basepage類的入參。
# __init__方法不能有返回值,只能返回none
def __init__(self,selenium_driver,base_url):
self.driver = selenium_driver
self.base_url = base_url
# self.pagetitle = pagetitle
def on_page(self,pagetitle):
return pagetitle in self.driver.title
def _open(self,url):
self.driver.get(url)
self.driver.maximize_window()
def open(self):
self._open(self.base_url,self.pagetitle)
def find_element(self,*loc): #*loc任意數量的位置引數(帶單個星號引數)
# return self.driver.find_element(*loc)
try:
webdriverwait(self.driver,10).until(ec.visibility_of_element_located(loc))
return self.driver.find_element(*loc)
except:
print("%s 頁面未能找到 %s 元素"%(self,loc))
def script(self,src):
self.driver.excute_script(src)
def send_keys(self, loc, vaule, clear_first=true, click_first=true):
try:
loc = getattr(self, "_%s" % loc) # getattr相當於實現self.loc
if click_first:
self.find_element(*loc).click()
if clear_first:
self.find_element(*loc).clear()
self.find_element(*loc).send_keys(vaule)
except attributeerror:
print("%s 頁面中未能找到 %s 元素" % (self, loc))
測試指令碼的優化
basepage.py提取完畢,其中設計了basepage類,對一些webdriver的方法進行了二次封裝。
baidu.py基於basepage.py進行優化(充分體現po的設計思想,封裝、繼承)
from selenium.webdriver.common.by import by
from podemo.basepage import basepage #假設baidu.py、basepage.py均在podemo.basepage目錄下
from selenium import webdriver
class searchpage(basepage):
# 定位元素
baidubtn.click()
pageobject總結
selenium自動化測試框架之po設計模式
selenium 自動化測試。
第一步安裝 谷歌瀏覽器。第三步編寫測試測試指令碼 第四步 安裝selemium coding utf 8 引入webdriver和unittest所需要的包 from selenium import webdriver from selenium.webdriver.common.by import...
selenium自動化 單元測試框架
單元測試框架 在自動化中,單元測試框架是管理測試用例的,控制測試用例的執行順序和次數 unittest 前置條件 setup 一般是開啟瀏覽器操作 後置條件 teardown 一般是關閉瀏覽器 原始碼 coding utf 8 from selenium import webdriver impor...
selenium自動化測試框架之PO設計模式
物件導向的特性 封裝 繼承 多型。在自動化中一樣適用,selenium自動化測試中有乙個名字常常被提及pageobject 思想與物件導向的特性相同 通過po模式可以大大提高測試用例的維護效率。傳統測試指令碼的弊端 po的核心要素 在po模式中抽象封裝成乙個basepage類,該基類應該擁有乙個只實...