UI自動化測試實戰之頁面物件設計模式(po模式)
阿新 • • 發佈:2022-04-12
1、建立可以跨多個測試用例共享程式碼
2、減少重複的程式碼
3、如果使用者介面發生了維護,我們只需要維護一個地方,這樣修改以及維護的成本相對來說是比較低的
data:主要儲存的是測試過程中使用到的資料
report:該檔案主要是儲存報告測試的
2、目錄結構設計:
框架的目錄結構的設計
3、基礎層
下面主要實現基礎層的程式碼,在base包下建立名為base.py的檔案,裡面的程式碼為
from selenium import webdriver from selenium.webdriver.common.by import By '''匯入元素定位方法''' from selenium.webdriver.support.expected_conditions import NoSuchFrameException import time as t class WebUI(): '''元素定位發''' def __init__(self,driver): '''web例項化後的物件''' self.driver=driver '''固定格式必須元組''' def findElement(self,*ages): ''' 單個元素定位的方式 :param ages: :return: 他是一個元組,需要帶上具體什麼方式定位元素以及元素屬性的值 ''' try: return self.driver.find_element(*ages) except NoSuchFrameException as e: return e.args[0] def findsElement(self,*ages,index): ''' 單個元素定位的方式 :param ages: :param index:被定為的目標索引位置 :return: 他是一個元組,需要帶上具體什麼方式定位元素以及元素屬性的值 ''' try: return self.driver.find_element(*ages)[index] except NoSuchFrameException as e: return e.args[0]
4、物件層
下面以sina的郵箱案例練編寫具體的程式碼,在page包下建立一個login.py的檔案,裡面的程式碼為:
from selenium.webdriver.common.by import By from base.base import WebUI import time as t class Login(WebUI): '''登入繼承base裡面我們寫的元素定位方法↑''' username=(By.ID,'freename') '''使用者名稱↑''' password=(By.ID,'freepassword')'''密碼↑''' login=(By.CLASS_NAME,'loginBtn') '''登入↑''' divText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') looText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]') def inputUserName(self,username): # 輸入賬戶值↑ t.sleep(2) self.findElement(*self.username).send_keys(username) def inputPassword(self,password): # 輸入密碼值↑ t.sleep(2) self.findElement(*self.password).send_keys(password) def clickLogin(self): # 點選登入 self.findElement(*self.login).click() def getDivText(self): # 獲取錯誤提示 return self.findElement(*self.divText).text def getLooText(self): return self.findElement(*self.looText).text def sianLogin(self,username,password): self.inputUserName(username=username) self.inputPassword(password=password) self.clickLogin()
5、測試層
下來再測試層,也就是test包下建立的test_login.py的模組來執行,切記,需要執行驗證下我們編寫的具體測試用例。
先將測試韌體分離
我們已經學會了資料驅動的分離,接下來我們將針對測試韌體進行分離,在page包下建立Init.py檔案,裡面的程式碼如下
from selenium import webdriver import unittest class Init(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://mail.sina.com.cn/#') self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit()
再寫測試用例,此時就可以直接繼承剛才編寫的測試韌體了
from page.login import Login import time as t from page.Init import Init '''1、先繼承測試韌體''' class LoginTest(Init,Login): '''2、編寫測試用例''' def test_login_null(self): '''登入:驗證賬戶為空返回的值''' self.sianLogin(username='',password='') t.sleep(3) self.assertEqual(self.getDivText(),'請輸入郵箱名') def test_login_format(self): '''登入:驗證郵箱名格式不正確''' self.sianLogin(username='fbajfa',password='sajlnfls') t.sleep(3) self.assertEqual(self.getDivText(), '您輸入的郵箱名格式不正確') def test_login_error(self): '''登入:驗證登入賬戶或密碼錯誤''' self.sianLogin(username='[email protected]',password='ajaja') t.sleep(3) self.assertEqual(self.getDivText(), '登入名或密碼錯誤') def test_login_loo(self): '''登入:驗證只輸入郵箱號不輸入密碼的錯誤''' self.sianLogin(username='[email protected]',password='') t.sleep(3) self.assertEqual(self.getLooText(),'請輸入密碼') def test_login_biao(self): '''登入:驗證郵箱輸入標點符號''' self.sianLogin(username='adnl,[email protected]',password='bkda') t.sleep(3) self.assertEqual(self.getDivText(),'您輸入的郵箱名格式不正確')