web自動化-Page Object模式
阿新 • • 發佈:2021-08-11
一. 原理
1.1 PageObjects
將頁面的元素定位和元素行為封裝成一個page類,實現頁面物件和測試用例分離;如login_page.py
類的屬性:元素定位
類的行為:元素的操作;每個行為均要單獨定義一個方法,提高串聯的複用性。
1.2 TestDatas
測試資料:將測試資料封裝;如login_testdatas.py
1.3 TestCases
測試用例:呼叫所需頁面物件中的行為,組成測試用例;如test_login.py
每個用例都單獨啟動driver去執行,保證用例的獨立性/可執行性,用例串聯不影響,防止關聯時哪個步驟錯誤影響執行結果。
每個用例共用一個driver,每個用例都單獨啟動瀏覽器且結束後關閉瀏覽器;用例獨立,互不影響!
二. 好處
1. 當某個頁面的元素髮生變化,只需要修改該頁面物件中的程式碼即可,測試用例不需要修改
如登入頁面,使用者名稱輸入框定位表示式變化,只需修改login_page.py的元素定位表示式
2. 提高程式碼重用率,結構清晰,維護程式碼更容易
3. 測試用例發生變化時,不需要或者只需要修改少數頁面物件程式碼即可
三. 分析
四、BasePage基類
4.1 在頁面物件中,不難發現,有許多方法是重複在使用的,如,顯性等待、find_element、滾動條等;避免冗餘,我們可以寫一個基類BasePage將這些公共方法提取
定義一個BagePage基類 - BasePage.py
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
class BasePage:
def __init__(self, driver):
self.driver = driver
#等待元素可見
def wait_eleVisible(self,locator,by=By.XPATH,waitTime=50):
#判斷by這個預設引數,是否在By(object),webelement的8種方式之內
if by not in By.__dict__.values():
print("定位元素表示式不支援,請檢查確認!")
raise Exception
WebDriverWait(self.driver,waitTime).until(EC.visibility_of_element_located((by,locator)))
# 等待元素存在
def wait_elePresence(self, locator, by=By.XPATH, waitTime=50):
# 判斷by這個預設引數,是否在By(object),webelement的8種方式之內
if by not in By.__dict__.values():
print("定位元素表示式不支援,請檢查確認!")
raise Exception
#等待之前-加個時間
WebDriverWait(self.driver, waitTime).until(EC.presence_of_element_located((by, locator)))
#等待之後-加個時間
#計算等待的時長
#查詢一個元素
def find_element(self,locator,by=By.XPATH,waitTime=50):
#等待 - 呼叫wait_eleVisible方法
self.wait_eleVisible(locator,by,waitTime)
time.sleep(0.5)
#查詢 - 返回元素物件
return self.driver.find_element(by,locator) #find_element_by_xpath方法也是內部呼叫find_element
#查詢一組元素
def find_elements(self,locator,by=By.XPATH,waitTime=50):
#等待 - 呼叫wait_eleVisible方法
self.wait_eleVisible(locator,by,waitTime)
time.sleep(0.5)
#查詢 - 返回元素物件
return self.driver.find_elements(by,locator)
#滾動條操作
def scroll_intoView(self,ele):
# 滾動到可見區域-找到該元素,執行js語句
self.driver.execute_script("arguments[0].scrollIntoView();",ele)
time.sleep(0.3)
如:登入頁面繼承 - login_page.py;直接呼叫基類的方法,
#引入基類
from WEB_Framework.PageObjects.BasePage import BasePage
#繼承
class LoginPage(BasePage):
#登入頁面定位表示式
login_username_xpath = '//input[@name="phone"]'
login_passwd_xpath = '//input[@name="password"]'
login_button_xpath = '//button[text()="登入"]'
#賬號為空的錯誤提示
loginError_defaultInfo_xpath = '//div[@class="form-error-info"]'
#登入 -- 成功登入
def login(self,username,passwd):
self.find_element(self.login_username_xpath).send_keys(username)
self.find_element(self.login_passwd_xpath).send_keys(passwd)
self.find_element(self.login_button_xpath).click()
#登入 -- 從登入區域獲取錯誤提示
def get_errorInfo_from_loginArea(self):
errorInfo = self.find_element(self.loginError_defaultInfo_xpath).text
return errorInfo