1. 程式人生 > 其它 >UI自動化測試實戰之頁面物件設計模式(po模式)

UI自動化測試實戰之頁面物件設計模式(po模式)

UI自動化測試實戰之頁面物件設計模式page object模式(po

模式)

優勢:

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

  2、減少重複的程式碼

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

測試框架目錄設定

  1、目錄結構:

  base:基礎層  裡面主要是編寫的測試框架的基礎程式碼

  page:物件層  裡面主要編寫的是頁面操作物件的每一個行為,也就是說,編寫的是具體的業務理解,把每一個操作單獨的寫一個方法

  test:測試層  裡面主要是編寫測試模組,也就是說是編寫測試用例的地方

  common:儲存的公共的程式碼,比如路徑處理等

  utils:儲存的是工具類,主要指的是對各種檔案的處理

  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(),'您輸入的郵箱名格式不正確')