轉 Python Selenium設計模式-POM

來源:互聯網
上載者:User

標籤:import   定義   function   waiting   homepage   class   bdr   home   end   

前言

本文就python selenium自動化測試實踐中所需要的POM設計模式進行分享,以便大家在實踐中對POM的特點、應用情境和核心思想有一定的理解和掌握。

為什麼要用POM

基於python selenium2開始UI級自動化測試並不是多麼艱巨的任務。只需要定位到元素,執行對應的操作即可。下面我們看一下這個簡單的指令碼實現百度搜尋。

from selenium import webdriverimport timedriver = webdriver.Firefox()driver.implicitly_wait(30)# 啟動瀏覽器,訪問百度driver.get("http://www.baidu.com")# 定位 百度搜尋方塊,並輸入seleniumdriver.find_element_by_id("kw").send_keys("selenium")# 定位 百度一下 按鈕並單擊進行搜尋driver.find_element_by_id("su").click()time.sleep(5)driver.quit()

從上述代碼來看,我們所能做的就是定位到元素,然後進行鍵盤輸入或滑鼠動作。就這個小程式而已,維護起來看起來是很容易的。但隨著時間的遷移,測試套件將持續的增長。指令碼也將變得越來越臃腫龐大。如果變成我們需要維護10個頁面,100個頁面,甚至1000個呢?那頁面元素的任何改變都會讓我們的指令碼維護變得繁瑣複雜,而且變得耗時易出錯。

那怎麼解決呢?
在自動化測試中,引入了Page Object Model(POM):頁面對象模式來解決,POM能讓我們的測試代碼變得可讀性更好,高可維護性,高複用性。

為非POM和POM對比圖:


pom.pngPOM是什麼
  • 頁面物件模型(POM)是一種設計模式,用來管理維護一組web元素集的物件程式庫
  • 在POM下,應用程式的每一個頁面都有一個對應的page class
  • 每一個page class維護著該web頁的元素集和操作這些元素的方法
  • page class中的方法命名最好根據其對應的業務情境進行,例如通常登入後我們需要等待幾秒中,我們可以這樣命名該方法: waitingForLoginSuccess().

下面我們看看POM的代碼目錄組織樣本:


pages_dir.pngPOM的優勢
  1. POM提供了一種在UI層操作、商務程序與驗證分離的模式,這使得測試代碼變得更加清晰和高可讀性
  2. 物件程式庫與用例分離,使得我們更好的複用對象,甚至能與不同的工具進行深度結合應用
  3. 可複用的頁面方法代碼會變得更加最佳化
  4. 更加有效命名方式使得我們更加清晰的知道方法所操作的UI元素。例如我們要回到首頁,方法名命名為: gotoHomePage(),通過方法名即可清晰的知道具體的功能實現。POM實現樣本下面我們看下使用POM百度搜尋 POM程式碼範例:
    看先下程式碼群組織結構如下:

    page_demo_dir.png
# basePage.py代碼如下# _*_ coding:utf-8 _*___author__ = ‘苦葉子‘import sysreload(sys)sys.setdefaultencoding("utf-8")# pages基類class Page(object):    """        Page基類,所有page都應該繼承該類    """    def __init__(self, driver, base_url=u"http://www.baidu.com"):        self.driver = driver        self.base_url = base_url        self.timeout = 30    def find_element(self, *loc):        return self.driver.find_element(*loc)    def input_text(self, loc, text):        self.find_element(*loc).send_keys(text)    def click(self, loc):        self.find_element(*loc).click()    def get_title(self):        return self.driver.title
# searchPage.py 代碼如下# _*_ coding:utf-8 _*___author__ = ‘苦葉子‘import sysfrom selenium.webdriver.common.by import Byfrom pages.basePage import Pagereload(sys)sys.setdefaultencoding("utf-8")# 百度搜尋pageclass SearchPage(Page):    # 元素集    # 搜尋輸入框    search_input = (By.ID, u‘kw‘)    # 百度一下 按鈕    search_button = (By.ID, u‘su‘)    def __init__(self, driver, base_url=u"http://www.baidu.com"):        Page.__init__(self, driver, base_url)    def gotoBaiduHomePage(self):        print u"開啟首頁: ", self.base_url        self.driver.get(self.base_url)    def input_search_text(self, text=u"開源優測"):        print u"輸入搜尋索引鍵: 開源優測 "        self.input_text(self.search_input, text)    def click_search_btn(self):        print u"點擊 百度一下  按鈕"        self.click(self.search_button)
# testSearchPage.py代碼如下# _*_ coding:utf-8 _*___author__ = ‘苦葉子‘import unittestimport sysfrom selenium import webdriverfrom pages.searchPage import SearchPagereload(sys)sys.setdefaultencoding("utf-8")# 百度搜尋測試class TestSearchPage(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Ie()    def testSearch(self):        driver = self.driver        # 百度網址        url = u"http://www.baidu.com"        # 搜尋文本        text = u"開源優測"        # 期望驗證的標題        assert_title = u"開源優測_百度搜尋"        print assert_title        search_Page = SearchPage(driver, url)        # 啟動瀏覽器,訪問百度首頁        search_Page.gotoBaiduHomePage()        # 輸入 搜尋字詞        search_Page.input_search_text(text)        # 單擊 百度一下 按鈕進行搜尋        search_Page.click_search_btn()        # 驗證標題        self.assertEqual(search_Page.get_title(), assert_title)    def tearDown(self):        self.driver.quit()
# 主入口程式碼如下# _*_ coding:utf-8 _*___author__ = ‘苦葉子‘import unittestimport sysfrom common import HTMLTestRunnerfrom testcase.testSearchPage import TestSearchPagereload(sys)sys.setdefaultencoding("utf-8")if __name__ == ‘__main__‘:    testunit = unittest.TestSuite()    testunit.addTest(TestSearchPage(‘testSearch‘))    # 定義報告輸出路徑    htmlPath = u"page_demo_Report.html"    fp = file(htmlPath, "wb")    runner = HTMLTestRunner.HTMLTestRunner(stream=fp,            title=u"百度測試",            description=u"測試案例結果")    runner.run(testunit)    fp.close()

按照組織代碼結構,輸入如上代碼,執行以下命令運行,會在目前的目錄產生測試報告:

python main.py
總結

最後做個總結,所有代碼請手動輸入,不要直接拷貝。再次對POM進行小結

  1. POM是selenium webdriver自動化測試實踐物件程式庫設計模式
  2. POM使得測試指令碼更易於維護
  3. POM通過物件程式庫方式進一步最佳化了元素、用例、資料的維護組織

轉自:http://www.cnblogs.com/lym51/p/6646033.html

轉 Python Selenium設計模式-POM

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.