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

 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()
....

改造:測試

首先,咱們要分離測試對象(元素對象)和測試腳本(用例腳本),那麼咱們分別建立兩個腳本文件, 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: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

相關文章
相關標籤/搜索