1. 程式人生 > >這可能是最簡單的Page Object庫

這可能是最簡單的Page Object庫

做過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