1. 程式人生 > 其它 >UI自動化 單元測試框架(3)-頁面物件設計模式

UI自動化 單元測試框架(3)-頁面物件設計模式

一、頁面物件設計模式 po模式

(page object)

在程式碼維護的成本而言還是需要考慮進一步的優化,那麼我們可以使用頁面物件設計模式,它的優勢具體可以總結為如下:

  • 建立可以跨多個測試用例共享的程式碼

  • 減少重複程式碼的數量

  • 如果使用者介面發生了維護,我們只需要維護一個地方,這樣修改以及維護的成本相對而言是比較低的

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 NoSuchFrameException
4 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]
View Code

 

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