本文就python selenium自動化測試實踐中所須要的POM設計模式進行分享,以便你們在實踐中對POM的特色、應用場景和核心思想有必定的理解和掌握。html
基於python selenium2開始UI級自動化測試並非多麼艱鉅的任務。只須要定位到元素,執行對應的操做便可。下面咱們看一下這個簡單的腳本實現百度搜索。python
from selenium import webdriver import time driver = webdriver.Firefox() driver.implicitly_wait(30) # 啓動瀏覽器,訪問百度 driver.get("http://www.baidu.com") # 定位 百度搜索框,並輸入selenium driver.find_element_by_id("kw").send_keys("selenium") # 定位 百度一下 按鈕並單擊進行搜索 driver.find_element_by_id("su").click() time.sleep(5) driver.quit()
從上述代碼來看,咱們所能作的就是定位到元素,而後進行鍵盤輸入或鼠標動做。就這個小程序而已,維護起來看起來是很容易的。但隨着時間的遷移,測試套件將持續的增加。腳本也將變得愈來愈臃腫龐大。若是變成咱們須要維護10個頁面,100個頁面,甚至1000個呢?那頁面元素的任何改變都會讓咱們的腳本維護變得繁瑣複雜,並且變得耗時易出錯。web
那怎麼解決呢?
在自動化測試中,引入了Page Object Model(POM):頁面對象模式來解決,POM能讓咱們的測試代碼變得可讀性更好,高可維護性,高複用性。小程序
下圖爲非POM和POM對比圖:vim
下面咱們看看POM的代碼目錄組織示例:設計模式
# basePage.py代碼以下 # _*_ coding:utf-8 _*_ __author__ = '苦葉子' import sys reload(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 sys from selenium.webdriver.common.by import By from pages.basePage import Page reload(sys) sys.setdefaultencoding("utf-8") # 百度搜索page class 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 unittest import sys from selenium import webdriver from pages.searchPage import SearchPage reload(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 unittest import sys from common import HTMLTestRunner from testcase.testSearchPage import TestSearchPage reload(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進行小結app