1. 程式人生 > 其它 >unittest學習之POM設計模式優化

unittest學習之POM設計模式優化

技術標籤:seleniumweb

將直接一步步寫程式碼更改為使用unittest模式

  • 繼承unittest.TestCase 類
  • setUp(self) -> None:前置方法
  • def tearDown(self) -> None:後置方法
  • 測試用例方法需要以test開頭

優化元素等待時間問題

  • from selenium.webdriver.support.wait import WebDriverWait
  • from selenium.webdriver.support import expected_conditions as EC
  • 使用WebDriverWait(self.web,10).until((EC.visibility_of_all_elements_located((By.XPATH,’//*[@id=“name”]’))))方法,使得元素載入完成後在操作

引入POM設計模式,使用單獨的類來管理某個介面的元素

  • 新建login_page.py
  • 新建類來管理頁面元素
  • login_page.py內容
'''管理登入介面所有的元素'''
from selenium.webdriver.common.by import By
class LoginPage:
    #使用者名稱的輸入框
    username_imnput = (By.XPATH,'//*[@id="name"]')
    #密碼輸入框
    password_input = (By.XPATH,'//*[@id="password"]')
    #登入按鈕
login_button = (By.XPATH, '//*[@id="submit"]')

繼續優化,封裝常用公共方法,如 click ,sendkeys等

  • 新建common.py 檔案
  • 新建InitBrowser 類,封裝方法
  • 優化後的程式碼
'''封裝公用的方法'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as
EC class InitBrowser(): '''瀏覽器的常用操作封裝''' def __init__(self): self.web = webdriver.Chrome('./driver/chromedriver.exe') self.web.get('https://sso.kuaidi100.com/sso/authorize.do') def wait_element_visible(self,locate): ''' 等待元素出現 :return: 返回這個元素 ''' # element = WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located(locate))) element = WebDriverWait(self.web, 10).until(EC.visibility_of_element_located(locate)) return element def click(self,locate): ''' 點選之前自動呼叫等待方法 :return: ''' self.wait_element_visible(locate).click() def send_kyes(self,locate,value): ''' 輸入之前,自動呼叫等待時間方法 :return: ''' print(locate,value) self.wait_element_visible(locate).send_keys(value)

讓用例繼承公共類,直接呼叫公用方法

  • 用例繼承InitBrowser類

專案結構

  • 專案目錄

在這裡插入圖片描述

  • TestCase_po.py 檔案
'''測試用例'''
from po_test.Pages.login_page import LoginPage
from po_test.common.common import InitBrowser
import unittest

class TestCases(unittest.TestCase,InitBrowser):
    def setUp(self) -> None:
        '''前置操作,初始化,開啟瀏覽器,連線資料庫,初始化資料'''
        # self.web = InitBrowser()
        InitBrowser.__init__(self)
        pass
    def tearDown(self) -> None:
        '''後置操作,關閉瀏覽器 關閉資料庫 清理測試資料'''
        pass
    def test_01(self):
        #等待元素出現後再去操作
        # WebDriverWait(self.web,10).until((EC.visibility_of_all_elements_located((By.XPATH,'//*[@id="name"]'))))
        # self.web.find_element_by_xpath('//*[@id="name"]').send_keys('10085')
        #
        # WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="password"]'))))
        # self.web.find_element_by_xpath('//*[@id="password"]').send_keys('10086')
        #
        # WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="submit"]'))))
        # self.web.find_element_by_xpath('//*[@id="submit"]').click()
        '''引用POM'''
        #因為LoginPage.password_input 為返回的元組型別,而find_element接受引數為兩個str,因為使用*將元組資料解析為可變引數,即兩個str引數
        # self.web.find_element(*LoginPage.password_input).send_keys('10086')
        # self.web.find_element(*LoginPage.password_input).send_keys('10086')
        # self.web.find_element(*LoginPage.login_button).click()

        '''封裝公用方法,click sendkey find_by,並繼承'''
        self.send_kyes(LoginPage.username_imnput,'*******')
        self.send_kyes(LoginPage.password_input, '*******')
        self.click(LoginPage.login_button)

if __name__ == '__main__':
    unittest.main()
  • login_page.py
'''管理登入介面所有的元素'''
from selenium.webdriver.common.by import By
class LoginPage:
    #使用者名稱的輸入框
    username_imnput = (By.XPATH,'//*[@id="name"]')
    #密碼輸入框
    password_input = (By.XPATH,'//*[@id="password"]')
    #登入按鈕
    login_button = (By.XPATH, '//*[@id="submit"]')
  • common.py
'''封裝公用的方法'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class InitBrowser():
    '''瀏覽器的常用操作封裝'''
    def __init__(self):
        self.web = webdriver.Chrome('./driver/chromedriver.exe')
        self.web.get('https://sso.kuaidi100.com/sso/authorize.do')

    def wait_element_visible(self,locate):
        '''
        等待元素出現
        :return: 返回這個元素
        '''
        # element = WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located(locate)))
        element = WebDriverWait(self.web, 10).until(EC.visibility_of_element_located(locate))
        return element
    def click(self,locate):
        '''
        點選之前自動呼叫等待方法
        :return:
        '''
        self.wait_element_visible(locate).click()

    def send_kyes(self,locate,value):
        '''
        輸入之前,自動呼叫等待時間方法
        :return:
        '''
        print(locate,value)
        self.wait_element_visible(locate).send_keys(value)