一、認識PO模式:
PO設計模式簡單講就是講頁面對象和業務邏輯分層,使得代碼清晰,可維護性高
二、 PO設計模式優點:
- 減少代碼的可重復性
- 讓測試具有可讀性
- 提高了代碼的可維護性(當被測程序較多時,可以方便添加)
三、PO模式常用目錄結構
- pages:一般用來存放頁面元素對象
- report:存放測試報告
- testcase:測試用例
- ......
四、通過 Page Object 設計模式來實現,以163郵箱登錄為例:
BasePage類,所有頁面元素定位相關的基類
1、可變參數*loc作為參數傳遞,使用可變參數時會使得公共方法會更少。例如之前寫的java自動化代碼,將id、css、xpath等定位方法都封裝了一遍,導致相同的代碼較多。
2、定位frame框架。
- 通過元素定位先定位到frame框架。
- 再通過driver.switch_to.frame(“”)切換到frame

from selenium import webdriver from time import sleep ''' 頁面元素定位的基類 ''' class BasePage(object): def __init__(self, driver): print("進入Basepage") self.driver = driver ''' 元素定位 ''' def find_element(self, *loc): return self.driver.find_element(*loc) ''' frame切換 ''' def switch_frame(self, *loc): xpath_frame = self.driver.find_element(*loc) self.driver.switch_to.frame(xpath_frame) ''' 打開瀏覽器 ''' def open_browser(self, url): print("調用打開瀏覽器方法....") self.driver.get(url) sleep(3) # 設置瀏覽器打開樣式 self.driver.maximize_window() sleep(3) self.driver.implicitly_wait(10)
LoginPage類,登錄頁面相關元素定位

from src.pages.BasePage import BasePage from selenium.webdriver.common.by import By from time import sleep # 相對導入 .代表當前模塊,..代表上層模塊,...代表上上層模塊,依次類推 # 絕對導入 import A.B 或 from A import B ''' 登錄頁面元素操作 ''' class LoginPage(BasePage): username_loc = (By.NAME, "email") password_loc = (By.NAME, "password") loginbut_loc = (By.ID, "dologin") frame_loc = (By.XPATH, "//div[@id='loginDiv']/iframe") # 輸入用戶名 def login_username(self, username): self.find_element(*self.username_loc).send_keys(username) # 輸入密碼 def login_password(self, password): self.find_element(*self.password_loc).send_keys(password) # 登錄 def login_button(self): self.find_element(*self.loginbut_loc).click() # 切換frame def switch_to_frame(self): self.switch_frame(*self.frame_loc) # 登錄操作 def login_operation(self, username, password): print("進入登錄操作方法") self.switch_to_frame() self.login_username(username) self.login_password(password) self.login_button() sleep(3)
LoginCase類,測試用例
1、首先繼承於unittest下的TestCase類
2、斷言判斷assertEqual

from src.pages.LoginPage import LoginPage from selenium import webdriver from time import sleep import unittest ''' 用戶登錄測試用例 ''' class LoginCase(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.url = "http://mail.163.com/" # 打開瀏覽器 LoginPage(self.driver).open_browser(self.url) sleep(3) ''' 用戶名或密碼錯誤 ''' def test_login_1(self): LoginPage(self.driver).login_operation(username="1152", password="1213131") self.assertEqual("15210996111", "1152", "用戶名或密碼錯誤") print("測試用例成功") def tearDown(self): self.driver.quit()