Elasticsearch 效能調優總結
阿新 • • 發佈:2021-06-10
在自動化中,Selenium自動化測試中有一個名字經常被提及PageObject(思想與面向物件的特徵相同),通常PO模型可以大大提高測試用例的維護效率
2.為什麼要用PO
基於python selenium2開始ui自動化測試指令碼的編寫不是多麼艱鉅的任務。只需要定位到元素,執行對應元素的操作即可。我們所能做的就是元素的定位,然後進行鍵盤輸入或滑鼠動作。但隨著時間的遷移,測試套件將持續的增長。指令碼也將變的越來越多。如果我們需要維護10個頁面,100個頁面,甚至1000個呢?那麼頁面元素的任何改變都會讓我們的指令碼維護變得繁瑣複雜,而且變得耗時易出錯。那怎麼解決呢?ui自動化中,常用的一種方式,引入Page Object(PO):頁面物件模式來解決,po能讓我們的測試程式碼變得可讀性更好,可維護性高,複用性高。
1、PO提供了一種業務流程與頁面元素操作分離的模式,這使得測試程式碼變得更加清晰。
2、頁面物件與用例分離,使得我們更好的複用物件。
3、可複用的頁面方法程式碼會變得更加優化
4、更加有效的命名方式使得我們更加清晰的知道方法所操作的UI元素。
# 總結:
重用,業務和物件分離,程式碼結構清晰,方便程式碼維護
二、Po的設計模式
三、PO的核心要素
1.在PO模式中抽離封裝整合一個BasePage類,該基類應該擁有一個只實現webdriver例項的屬性
2.每一個page都繼承BasePage,通過driver來管理本page中元素,將page中的操作封裝成一個個方法
3.TestCase繼承unittest.Testcase類,並依賴page類,從而實現相應的測試步驟
# 總結
PO設計模式中的BasePage基類對應案例中的BasePage.py檔案
PO模式中的pages中的案例顯示Search.py
PO模式設計中TestCase對應案例中的TestCase.py
四、非PO實現
# 程式碼展示
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_id( "kw").send_keys("jack")
sleep(1)
driver.find_element_by_id("su").click()
sleep(2)
driver.quit()
# 程式碼分析
不同的執行指令碼環境,遊覽器不同:驅動webdriver.Firefox()可以剝離;
請求地址的變化(生產環境和測試環境):url = http://www.baidu.com可以剝離;
操作元素時,常常要等待元素載入完成方可進行操作:可以把webdriver提供的find_element*方法封裝,在元素操作前,先判斷元素是否可以操作;
實際測試場景中,可能有多個測試場景,如果每個測試場景都需要維護url,遊覽器驅動,元素定位等,效率會非常低;
因此基於以上分析,是否可以設計一個所有測試介面(selenium本身是B/S系統開展測試)的基類,來維護公共的方法,此處定義名字為BasePage.py,用於存放頁面公共方法及webdriver原有方法二次封裝等。
from selenium.webdriver.common.action_chains import ActionChains # 滑鼠操作
class BasePage():
"""初始化方法"""
def __init__(self, dir, url):
self.dir = dir
self.url = url
"""進入網址的方法"""
def enter_url(self):
self.dir.get(self.url)
"""定位元素"""
def find_element(self, *args):
return self.dir.find_element(*args)
"""點選"""
def click_element(self, *args):
ActionChains(self.dir).click(self.find_element(*args)).perform()
"""輸入"""
def send_element(self, text, *args):
self.dir.find_element(*args).send_keys(text)
"""清除"""
def clear_element(self, *args):
self.dir.find_element(*args).clear()
"""表單切換"""
def switch_iframe(self, *args):
self.dir.switch_to.frame(self.dir.find_element(*args))
"""視窗切換"""
def switch_window(self, n):
self.dir.switch_to.window(self.dir.window_handles[n])
2.Pages查詢頁面元素類(hao.py和bddt.py)
# hao.py
from Base.base import BasePage
from selenium.webdriver.common.by import By
from selenium import webdriver
class SearchPage(BasePage):
"""初始化"""
def __init__(self, dir, url):
BasePage.__init__(self, dir, url)
"""進入百度"""
def enter_bd(self):
self.enter_url()
"""輸入搜尋內容"""
def ssnr(self, text):
self.send_element(text, By.ID, "kw")
"""點選百度一下按鈕"""
def clickff(self):
self.click_element(By.ID, "su")
# bddt.py
from Base.base import BasePage
from selenium.webdriver.common.by import By
from selenium import webdriver
class SearchPage2(BasePage):
"""初始化"""
def __init__(self, dir, url):
BasePage.__init__(self, dir, url)
"""點選進入hao123"""
def clickenter(self):
self.click_element(By.CSS_SELECTOR, ".t>a")
"""切換控制代碼hao123"""
def qiehuan(self, n):
self.switch_window(n)
"""點選百度地圖"""
def clickbddt(self):
self.click_element(By.CSS_SELECTOR, ".js_bd > li:nth-child(6) > div:nth-child(1) > a:nth-child(1)")
import unittest
from selenium import webdriver
from Pages.hao import SearchPage
from Pages.bddt import SearchPage2
import time
class Test01Class(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.dir = webdriver.Firefox()
cls.dir.implicitly_wait(30)
def test01(self):
url = "http://www.baidu.com"
s = SearchPage(self.dir, url)
s.enter_bd()
s.ssnr("123")
s.clickff()
# self.dir.switch_to.window(self.dir.window_handles[-1])
def test02(self):
url = ""
b = SearchPage2(self.dir, url)
b.clickenter()
b.qiehuan(1)
time.sleep(10)
b.clickbddt()
@classmethod
def tearDownClass(cls) -> None:
cls.dir.quit()
pass
if __name__ == '__main__':
unittest.main()