做過web自動化測試的同學,對Page object設計模式應該不陌生。

Page object庫應該根據以下目標開發:
-
Page object應該易於使用
-
清晰的結構
-
PageObjects 對於頁面對象
-
PageModules對於頁面內容
-
-
只寫測試,而不是基礎。
-
在可能的情況下防止樣板代碼。
-
不需要自己管理瀏覽器。
-
在運行時選擇瀏覽器,而不是在類級別。
-
不需要直接接觸selenium。
這只是一種設計模式,只要遵循它有思想,不借助第三方庫,我們一樣可以實現這種設計模式。
創建baidu_page.py 文件,實現page層封裝。
class BasePage:
"""
基礎Page
"""
def __init__(self, driver):
self.driver = driver
def get(self, url):
self.driver.get(url)
def id_(self, id_):
return self.driver.find_element_by_id(id_)
def xpath(self, xpath):
return self.driver.find_element_by_xpath(xpath)
class BaiduPage(BasePage):
"""
百度首頁Page
"""
@property
def search_box(self):
return self.id_("kw")
@property
def search_button(self):
return self.xpath("//*[@id='su']")
我們本質上要將元素的定位和元素的操作分開,page層用來定義元素的定位。
接下來創建,test_baidu.py文件,用來實現自動化測試。
from selenium import webdriver
from baidu_page import BaiduPage
dr = webdriver.Chrome()
page = BaiduPage(dr)
page.get("https://www.baidu.com")
page.search_box.send_keys("page object")
page.search_button.click()
dr.close()
這里你將看不到元素的定位,分層的好處就是,當元素的定位發生改變時,只需要維護好page層即可,對於測試用例來說不需要關心元素怎么定位,只要專心設計好用例即可。
可是,Page層的編寫並不太簡便,本質上它的作用只是定義一些元素的定位。那我告訴你,只需要4行代碼也可以實現上面baidu_page.py的功能,你會不會太簡單了?
from page_objects import PageObject, PageElement
class BaiduPage(PageObject):
search_box = PageElement(css='#kw')
search_button = PageElement(id_='su')
是的,就這么簡單,專注於元素的定位的編寫,幾乎沒有多月的東西。而且還可以添加超時時間哦!
from page_objects import PageObject, PageElement
class BaiduPage(PageObject):
search_box = PageElement(css='#kw', time_out=2)
search_button = PageElement(id_='su', time_out=10)
這樣再也不用寫惡心的顯式等待了,是不是很爽!?
定位一組元素也是非常簡單的說。
from page_objects import PageElements
class BaiduPage(PageObject):
……
# 百度搜索結果
search_result = PageElements(xpath="//div/h3/a")
啥? 項目地址? 別急!別急!
GitHub地址:
https://github.com/defnngj/selenium_page_objects
原項目已經不再維護,我閱讀了原項目代碼,雖然只有100多行,但設計非常精妙。可惜缺少元素的等待,這將有助於定位元素的穩定性,所以,在原有項目的基礎上增加的該功能。
下載安裝:
$ python setup.py install
通過pip命令安裝:
$ pip install -i https://testpypi.python.org/pypi selenium-page-objects
該項目已經更新為:poium
項目地址:https://github.com/defnngj/poium
