UI自動化 單元測試框架(3)-頁面物件設計模式
阿新 • • 發佈:2022-04-12
一、頁面物件設計模式 po模式
在程式碼維護的成本而言還是需要考慮進一步的優化,那麼我們可以使用頁面物件設計模式,它的優勢具體可以總結為如下:
-
建立可以跨多個測試用例共享的程式碼
-
減少重複程式碼的數量
-
如果使用者介面發生了維護,我們只需要維護一個地方,這樣修改以及維護的成本相對而言是比較低的
1.新建一個專案 uiFrame:
2. 為專案載入直譯器:
二、目錄結構設計
下面我們具體針對這部分的目錄進行設計,具體的目錄結構為:
目錄詳解:必會!面試必問!!
base:基礎層,主要編寫底層定位元素的類
page:物件層,編寫具體的業務邏輯,把頁面每一個操作行為單獨的寫一個方法或者是函式
test:測試層,裡面主要是測試模組
utils:工具類(讀取json檔案、yaml檔案)
common:公共類,裡面編寫公共使用到的檔案(處理路徑、處理json檔案、yaml檔案)
data:儲存測試使用到的測試資料
config:配置檔案儲存目錄
report:測試報告目錄
聚焦於物件層和測試層
三、頁面物件設計模式
3.1、基礎層
介紹:主要編寫底層定位元素的類
建模組:在base包下建base.py模組
說明:基礎層中假設driver已經是webdriver的例項化物件了,可以呼叫find_element了,實際上是在測試層才進行的webdriver例項化,形成了閉環。
1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 from selenium.webdriver.support.expected_conditions import NoSuchFrameExceptionView Code4 import time as t 5 6 class WebUI(object): 7 def __init__(self,driver): 8 #理解為webdriver例項化後的物件 9 self.driver=driver 10 11 def findElement(self,*args): 12 ''' 13 單個元素定位的方式 14 :param args: 15 :return: 它是一個元組,需要帶上具體是什麼方式定位元素屬性以及元素屬性的值 16 '''17 try: 18 return self.driver.find_element(*args) 19 except NoSuchFrameException as e: 20 return e.args[0] 21 22 def findsElement(self,*args,index): 23 ''' 24 多個元素定位的方式 25 :param args: 26 :param index:被定位的目標索引值 27 :return: 它是一個元組,需要帶上具體是什麼方式定位元素屬性以及元素屬性的值 28 ''' 29 try: 30 return self.driver.find_elements(*args)[index] 31 except NoSuchFrameException as e: 32 return e.args[0]
3.2、物件層
(把基礎層裡的元素定位例項化,給頁面每一個測試操作行為單獨的寫一個方法或者是函式,如下面的:輸入使用者名稱、密碼行為,點選登入按鈕操作。其中的形式引數會在測試層賦值)
下面以sina的郵箱為案例來編寫具體的程式碼,在page包下建立login.py的檔案
1 import time 2 from selenium.webdriver.common.by import By 3 from base.base import WebUI 4 import time as t 5 6 class Login(WebUI): 7 username=(By.ID,"freename") 8 password=(By.ID,"freepassword") 9 login=(By.CLASS_NAME,"loginBtn") 10 #郵箱欄旁邊的提示框↓ 11 divText=(By.XPATH,"/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]") 12 #密碼欄旁邊的提示框↓ 13 divText_passwd=(By.XPATH, "/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]") 14 15 def inputUserName(self,username): 16 t.sleep(2) 17 self.findElement(*self.username).send_keys(username) 18 19 def inputPasswd(self, password): 20 t.sleep(2) 21 self.findElement(*self.password).send_keys(password) 22 23 def clickLogin(self): #點選登入按鈕 24 t.sleep(2) 25 self.findElement(*self.login).click() 26 27 def getDivText(self): #獲取郵箱欄旁邊的提示框資訊↓ 28 return self.findElement(*self.divText).text 29 30 def getDivText_passwd(self): #獲取密碼欄旁邊的提示框資訊↓ 31 return self.findElement(*self.divText_passwd).text 32 33 def singLogin(self,username,password): #封裝使用者名稱方法、密碼方法、點選登入方法 34 self.inputUserName(username=username) 35 self.inputPasswd(password=password) 36 self.clickLogin() 37 time.sleep(3)View Code
3.3、測試層
下來在測試層,也就是test包下建立test_sina_login.py的模組(注意:測試模組都以test_開頭),繼承unittest.TestCase和物件層,對webdriver進行例項化,給物件層的操作行為的引數進行賦值並且斷言。
原始碼具體為:
1 from selenium import webdriver 2 import unittest 3 from page.login import Login 4 import time as t 5 from selenium.webdriver.common.keys import Keys 6 7 class LoginTest(unittest.TestCase,Login): 8 def setUp(self) -> None: 9 self.driver = webdriver.Chrome() 10 self.driver.maximize_window() 11 self.driver.get("https://mail.sina.com.cn/") 12 self.driver.implicitly_wait(30) 13 14 def tearDown(self) -> None: 15 self.driver.quit() 16 17 def test_login_null(self): #郵箱名空,密碼空,在郵箱欄旁邊提示請輸入郵箱名 18 self.singLogin(username="",password="") #這行相當於下面三行(這行是呼叫singLogin方法(物件層中),這是個封裝函式) 19 # self.inputUserName(username="") 20 # self.inputPasswd(password="") 21 # self.clickLogin() 22 self.assertEqual(self.getDivText(),"請輸入郵箱名") 23 t.sleep(5) 24 25 def test_login_format(self): #郵箱名格式錯誤,密碼錯誤,在郵箱欄旁邊提示您輸入的郵箱名格式不正確 26 self.singLogin(username="asfhwoiej",password="hkjhuhu") 27 self.assertEqual(self.getDivText(), "您輸入的郵箱名格式不正確") 28 t.sleep(5) 29 30 def test_login_error(self): #郵箱名錯誤,密碼錯誤,在郵箱欄旁邊提示登入或密碼錯誤 31 self.singLogin(username="[email protected]",password="hkjhuhu") 32 self.assertEqual(self.getDivText(), "登入名或密碼錯誤") 33 t.sleep(5) 34 35 def test_login_chinese(self): #郵箱名為中文,密碼為空,在郵箱欄旁邊提示郵箱名不支援中文 36 self.singLogin(username="你好",password="") 37 self.assertEqual(self.getDivText(), "郵箱名不支援中文") 38 t.sleep(5) 39 40 def test_login_right_username(self): #郵箱名正確,密碼為空,在密碼欄旁邊提示請輸入密碼 41 self.singLogin(username="[email protected]",password="") 42 self.assertEqual(self.getDivText_passwd(), "請輸入密碼") 43 t.sleep(5)View Code