1. 程式人生 > 其它 >web自動化-Page Object模式

web自動化-Page Object模式

一. 原理

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