Page Object模式是使用Selenium的廣大同行最爲公認的一種設計模式。在設計測試時,把元素和方法按照頁面抽象出來,分離成必定的對象,而後再進行組織。web
Page Object模式,建立一個對象來對應頁面的一個應用。故咱們能夠爲每一個頁面定義一個類,併爲每一個頁面的屬性和操做構建模型。體如今對界面交互細節的封裝,測試在更上層使用頁面對象,在底層的屬性或者操做的更改不會中斷測試。減小代碼重複,提升測試代碼的可讀性和可維護性。設計模式
下面將以登陸qq郵箱簡單爲例,經過Page Object設計模式來實現。代碼以下:瀏覽器
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep #建立基礎類 class BasePage(object): #初始化 def __init__(self, driver): self.base_url = 'https://mail.qq.com/' self.driver = driver self.timeout = 30 #定義打開登陸頁面方法 def _open(self): url = self.base_url self.driver.get(url) self.driver.switch_to.frame('login_frame') #切換到登陸窗口的iframe
#定義定義open方法,調用_open()進行打開 def open(self): self._open() #定位方法封裝 def find_element(self,*loc): return self.driver.find_element(*loc) #建立LoginPage類 class LoginPage(BasePage): username_loc = (By.ID, "u") password_loc = (By.ID, "p") login_loc = (By.ID, "login_button") #輸入用戶名 def type_username(self,username): self.find_element(*self.username_loc).clear() self.find_element(*self.username_loc).send_keys(username) #輸入密碼 def type_password(self,password): self.find_element(*self.password_loc).send_keys(password) #點擊登陸 def type_login(self): self.find_element(*self.login_loc).click() #建立test_user_login()函數 def test_user_login(driver, username, password): """測試用戶名/密碼是否能夠登陸""" login_page = LoginPage(driver) login_page.open() login_page.type_username(username) login_page.type_password(password) login_page.type_login() #建立main()函數 def main(): driver = webdriver.Edge() username = '3494xxxxx' #qq號碼 password = 'kemixxxx' #qq密碼 test_user_login(driver, username, password) sleep(3) driver.quit() if __name__ == '__main__': main()
雖然該實現方法看上去複雜多了,但其中的設計好處是不一樣層關心不一樣的問題。頁面對象只關心元素的定位,測試用例只關心測試數據。函數
下面將對上面代碼加以說明,首先建立一個基礎BasePage類,在初始化方法__init__()中定義驅動(driver),基本的URL(base_url)和超時時間(timeout)等。定義open()方法用於打開URL,這裏是由_open()方法來實現,而find_element()方法用於元素定位。測試
接下來的BasePage類中定義的方法都是頁面操做的基本方法。LoginPage類並繼承BasePage類,這也是Page Object設計模式中最重要的對象層。LoginPage類中主要對登陸頁面上元素進行封裝,使其成爲具體的操做方法。如對用戶名、密碼框和登陸按鈕都封裝成方法。ui
而後定義test_user_login()函數將單個元素操做組成一個完整的動做,包含打開瀏覽器、輸入用戶名、密碼並點擊登陸按鈕等。使用時將driver、username、password做爲函數的入參,這樣的函數具備很強的可重用性。url
最後使用main()函數進行用戶操做行爲,如今只關心用哪一個瀏覽器、登陸的用戶名和密碼是什麼,至少輸入框、按鈕是如何定位的,則不關心。即實現了不一樣層關心不一樣問題。若是有多個用戶名/密碼須要登陸,那麼只用改寫main()方法的參數便可。spa