PageObject模式簡介
眾所周知,UI頁面元素常常是不穩定的,在使用Selenium編寫WebUI自動化測試用例時,隨着測試腳本的增加,維護和更新這些元素便成為一個令人頭疼的問題。
在普通模式下,腳本直接定位並操作元素,一旦有元素變動時,首先我們需要從眾多的用例中找到使用它的用例,然后逐個修改,逐個調試。這是一個非常耗時耗力的過程。
這就像,隨着一個公司的擴大,人員的增多,必然會引入中層管理者,來分組管理零散的人員。
對於元素也是一樣,我們對元素按頁面進行分組,然后引入PageObject頁面對象,來專門負責元素的定位和操作。這樣腳本只需要使用各個頁面對象提供的操作方法即可,無需再關心元素的定位問題。
當元素變動時,只需要維護對應的頁面對象即可,這樣便可以大大降低框架的維護成本,如下圖。
編寫頁面對象
一個基本的頁面對象如下
# baidu_page.py
class BaiduPage(object):
# 1. 列出所需要操作的元素定位器,元素定位器即 定位方式+定位表達式
search_ipt_loc = ('id', 'kw')
search_btn_loc = ('id', 'su')
# 2. 初始化時傳入瀏覽器驅動並綁定對象,以使得內部可以通過driver定位及操作函數
def __init__(self, driver, url=None):
self.driver = driver
self.url = url
def open():
"""打開頁面"""
self.driver.get(self.url)
# 3. 每個元素每種操作封裝一個方法
def input_search_keyword(self, keyword):
"""搜索框輸入搜索詞"""
self.driver.find_element(*self.search_ipt_loc).send_keys(keyword)
def click_search_button(self):
"""點擊百度一下按鈕"""
self.driver.find_element(*self.search_btn_loc).click()
# 4. 也可以封裝一些本頁面常用的組合操作
def search(self, keyword):
"""搜索關鍵詞"""
self.open()
self.input_search_keyword(keyword)
self.click_search_button()
使用頁面對象
新建一個用例文件test_baidu.py,導入該頁面對象使用即可。
from selenium import webdriver
from baidu_page import BaiduPage
def test_baidu_search():
driver = webdriver.Chrome()
baidu = BaiduPage(driver, url='https://www.baidu.com')
baidu.search('美國大選')