Page Object Model 簡稱POM web
普通的測試用例代碼:組件化
.... #測試用例 def test_login_mail(self): driver = self.driver driver.get("http://mail.126.com") driver.find_element_by_id("idInput").clear() driver.find_element_by_id("idInput").send_keys("liuke01") driver.find_element_by_id("pwdInput").clear() driver.find_element_by_id("pwdInput").send_keys("liuke123") driver.find_element_by_id("loginBtn").click() ....
改造:測試
#-*- coding: utf-8 -*- from selenium.webdriver.support.wait importWebDriverWait from selenium import webdriver classAction(object): """ BasePage封裝全部頁面都公用的方法,例如driver, url ,FindElement等 """ #初始化driver、url、等 def __init__(self, selenium_driver, base_url, pagetitle): self.base_url = base_url self.pagetitle = pagetitle self.driver = selenium_driver #打開頁面,校驗頁面連接是否加載正確 def _open(self, url, pagetitle): #使用get打開訪問連接地址 self.driver.get(url) self.driver.maximize_window() #使用assert進行校驗,打開的連接地址是否與配置的地址一致。調用on_page()方法 assert self.on_page(pagetitle), u"打開開頁面失敗 %s"% url #重寫元素定位方法 def find_element(self,*loc): #return self.driver.find_element(*loc) try: WebDriverWait(self.driver,10).until(lambda driver: driver.find_element(*loc).is_displayed()) return self.driver.find_element(*loc) except: print u"%s 頁面中未能找到 %s 元素"%(self, loc) #重寫switch_frame方法 def switch_frame(self, loc): return self.driver.switch_to_frame(loc) #定義open方法,調用_open()進行打開連接 def open(self): self._open(self.base_url, self.pagetitle) #使用current_url獲取當前窗口Url地址,進行與配置地址做比較,返回比較結果(True False) def on_page(self, pagetitle): return pagetitle in self.driver.title #定義script方法,用於執行js腳本,範圍執行結果 def script(self, src): self.driver.execute_script(src) #重寫定義send_keys方法 def send_keys(self, loc, vaule, clear_first=True, click_first=True): try: loc = getattr(self,"_%s"% loc) if click_first: self.find_element(*loc).click() if clear_first: self.find_element(*loc).clear() self.find_element(*loc).send_keys(vaule) exceptAttributeError: print u"%s 頁面中未能找到 %s 元素"%(self, loc)
LoginPage.py:ui
#-*- coding: utf-8 -*- from selenium.webdriver.common.by importBy importBasePage #繼承BasePage類 classLoginPage(BasePage.Action): #定位器,經過元素屬性定位元素對象 username_loc =(By.ID,"idInput") password_loc =(By.ID,"pwdInput") submit_loc =(By.ID,"loginBtn") span_loc =(By.CSS_SELECTOR,"div.error-tt>p") dynpw_loc =(By.ID,"lbDynPw") userid_loc =(By.ID,"spnUid") #Action def open(self): #調用page中的_open打開鏈接 self._open(self.base_url, self.pagetitle) #調用send_keys對象,輸入用戶名 def input_username(self, username): self.find_element(*self.username_loc).send_keys(username) #調用send_keys對象,輸入密碼 def input_password(self, password): self.find_element(*self.password_loc).send_keys(password) #調用send_keys對象,點擊登陸 def click_submit(self): self.find_element(*self.submit_loc).click() #用戶名或密碼不合理是Tip框內容展現 def show_span(self): return self.find_element(*self.span_loc).text #切換登陸模式爲動態密碼登陸(IE下有效) def swich_DynPw(self): self.find_element(*self.dynpw_loc).click() #登陸成功頁面中的用戶ID查找 def show_userid(self): return self.find_element(*self.userid_loc).text CaseLoginTest.py: #-*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import unittest from PO importLoginPage from selenium import webdriver classCaselogin126mail(unittest.TestCase): """ 登陸126郵箱的case """ @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.driver.implicitly_wait(30) cls.url ="http://mail.126.com" cls.username ="liuke01" cls.password ="liuke123" #用例執行體 def test_login_mail(self): #聲明LoginPage類對象 login_page =LoginPage.LoginPage(self.driver, self.url, u"網易") #調用打開頁面組件 login_page.open() #調用用戶名輸入組件 login_page.input_username(self.username) #調用密碼輸入組件 login_page.input_password(self.password) #調用點擊登陸按鈕組件 login_page.click_submit() @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ =="__main__": unittest.main()
經過使用POM進行從新構造代碼結構後,發現代碼測試用例代碼的可讀性提升不少,元素寫成組件的方式,不須要每次都寫findElement直接在腳本中調用組件就可使用。在CaseLoginTest腳本用例執行體中,一旦咱們輸入 login_page並敲入一個點時,LoginPage頁面中的元素對象組件都顯示出來。而且定義好的PageObject組件能夠重複在其它的腳本中進行使用,減小了代碼的工做量,也方便對腳本進行後期的維護管理,當元素屬性發生變化時,咱們只須要對一個PageObaject頁面中的對象組件定義進行更改便可。url