這可能是最簡單的Page Object庫
阿新 • • 發佈:2018-12-18
做過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