作過web自動化測試的同窗,對Page object設計模式應該不陌生。css
Page object庫應該根據如下目標開發:python
Page object應該易於使用git
清晰的結構github
PageObjects 對於頁面對象web
PageModules對於頁面內容shell
只寫測試,而不是基礎。設計模式
在可能的狀況下防止樣板代碼。瀏覽器
不須要本身管理瀏覽器。測試
在運行時選擇瀏覽器,而不是在類級別。url
不須要直接接觸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