Selenium的PO模式(Page Object Model)[python版]


 Page Object Model 簡稱POM 

普通的測試用例代碼:

....
#測試用例 
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()
....

改造:

首先,我們要分離測試對象(元素對象)和測試腳本(用例腳本),那么我們分別創建兩個腳本文件, LoginPage.py 用於定義頁面元素對象,每一個元素都封裝成組件(可以看做存放頁面元素對象的倉庫)  CaseLoginTest.py 測試用例腳本。我們的實現思想,一切元素和元素的操作組件化定義在Page頁面,用例腳本頁面,通過調用Page中的組件對象,進行拼湊成一個登錄腳本。
在寫這兩個腳本之前,我先對WebDriver中的一些方法進行重定義,以方便我們在寫PO的時候,更簡潔,快速。
 
BasePage.py:
#-*- 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:

#-*- 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頁面中的對象組件定義進行更改即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM