unittest學習之POM設計模式優化
阿新 • • 發佈:2020-12-15
將直接一步步寫程式碼更改為使用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)