以下實例演示了采用了page Object設計模式的方式登錄qq空間:
1、創建基礎類page:在初始方法__init__()定義驅動的(driver),基本url(base_url)和超時時間(timeout)等
2、創建LoginPage類:Page類中定義的方法是頁面操作的基本方法,后面根據登錄頁面特點創建LoaginPage類並繼承Page,這就是page Object設計模式中的對象層
3、創建test_user_login()函數:創建test_user_login()函數將單個元素操作組成一個完整動作,這個動作包含打開瀏覽器、輸入賬號密碼、登錄等操作
4、創建main()函數:main()函數更接近用戶操作行為,用戶操作只需要關系是那個瀏覽器打開打開網址,登錄的用戶名和密碼是什么,不會關系是如何去定位輸入框的
代碼:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep class Page(object): """基礎類,用於所以頁面對象類繼承""" login_url = 'https://i.qq.com' def __init__(self, selenium_driver, base_url=login_url): self.base_url = base_url self.driver = selenium_driver self.timeout = 30 def on_page(self): return self.driver.current_url == (self.base_url + self.url) def _open(self,url): url = self.base_url+url self.driver.get(url) assert self.on_page(),'did not land on %s' % url def open(self): self._open(self.url) def find_element(self, *loc): return self.driver.find_element(*loc) class LoginPage(Page): """登錄頁面模型""" url = '/' # 定位器 username_loc = (By.ID, 'u') password_loc = (By.ID, 'p') submit_loc = (By.ID, 'login_button') def type_username(self, username): 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_submit(self): self.find_element(*self.submit_loc).click() def test_user_login(driver, username, password): """測試獲取的用戶名、密碼是否可以登錄成功""" login_page = LoginPage(driver) login_page.open() driver.maximize_window() driver.switch_to_frame('login_frame') driver.find_element_by_id("switcher_plogin").click() login_page.type_username(username) login_page.type_password(password) login_page.type_submit() def main(): try: driver = webdriver.Firefox() username = 'qq號' #調試的時候需要換成對應的QQ號 password = 'qq密碼' #需要換成對應的密碼 test_user_login(driver, username, password) sleep(3) # 斷言的方式判斷登錄是否成功 try: assert '對應空間的title' in driver.title #調試時候title要換 print ('successful') except Exception as e : print ('failed') finally: driver.close() if __name__ == '__main__': main()
這樣的分層好處是,不同的層關心不同的問題,頁面對象只關心元素的定位問題,測試用例只關心測試數據