怎樣從0開始搭建一個測試框架_6——PageObject
阿新 • • 發佈:2019-01-08
怎樣從0開始搭建一個測試框架_6
針對UI自動化,接下來我們用PO思想進行下封裝。
對於不同的專案,不同的頁面,我們都需要選擇瀏覽器、開啟網址等,我們可以把這些操作抽象出來,讓不同的用例去呼叫,只需要傳入不同引數即可,不用一遍遍複製貼上。
為此,我們對test目錄再次進行分層,建立page、common、case、suite四個目錄:
test
|--case(用例檔案)
|--common(跟專案、頁面無關的封裝)
|--page(頁面)
|--suite(測試套件,用來組織用例)
我們首先想要封裝的選擇瀏覽器、開啟網址的類,所以放到common中,建立browser.py:
import time
import os
from selenium import webdriver
from utils.config import DRIVER_PATH, REPORT_PATH
# 可根據需要自行擴充套件
CHROMEDRIVER_PATH = DRIVER_PATH + '\chromedriver.exe'
IEDRIVER_PATH = DRIVER_PATH + '\IEDriverServer.exe'
PHANTOMJSDRIVER_PATH = DRIVER_PATH + '\phantomjs.exe'
TYPES = {'firefox' : webdriver.Firefox, 'chrome': webdriver.Chrome, 'ie': webdriver.Ie, 'phantomjs': webdriver.PhantomJS}
EXECUTABLE_PATH = {'firefox': 'wires', 'chrome': CHROMEDRIVER_PATH, 'ie': IEDRIVER_PATH, 'phantomjs': PHANTOMJSDRIVER_PATH}
class UnSupportBrowserTypeError(Exception):
pass
class Browser(object) :
def __init__(self, browser_type='firefox'):
self._type = browser_type.lower()
if self._type in TYPES:
self.browser = TYPES[self._type]
else:
raise UnSupportBrowserTypeError('僅支援%s!' % ', '.join(TYPES.keys()))
self.driver = None
def get(self, url, maximize_window=True, implicitly_wait=30):
self.driver = self.browser(executable_path=EXECUTABLE_PATH[self._type])
self.driver.get(url)
if maximize_window:
self.driver.maximize_window()
self.driver.implicitly_wait(implicitly_wait)
return self
def save_screen_shot(self, name='screen_shot'):
day = time.strftime('%Y%m%d', time.localtime(time.time()))
screenshot_path = REPORT_PATH + '\screenshot_%s' % day
if not os.path.exists(screenshot_path):
os.makedirs(screenshot_path)
tm = time.strftime('%H%M%S', time.localtime(time.time()))
screenshot = self.driver.save_screenshot(screenshot_path + '\\%s_%s.png' % (name, tm))
return screenshot
def close(self):
self.driver.close()
def quit(self):
self.driver.quit()
這裡做了非常簡單的封裝,可以根據傳入的引數選擇瀏覽器的driver去開啟對應的瀏覽器,並且加了一個儲存截圖的方法,可以儲存png截圖到report目錄下。
我們再封裝一個頁面類Page:
from test.common.browser import Browser
class Page(Browser):
# 更多的封裝請自己動手...
def __init__(self, page=None, browser_type='firefox'):
if page:
self.driver = page.driver
else:
super(Page, self).__init__(browser_type=browser_type)
def get_driver(self):
return self.driver
def find_element(self, *args):
return self.driver.find_element(*args)
def find_elements(self, *args):
return self.driver.find_elements(*args)
我們僅僅封裝了幾個方法,更多的封裝還請讀者自己動手,接下來我們需要對頁面進行封裝,在page目錄建立如下兩個檔案:
baidu_main_page.py:
from selenium.webdriver.common.by import By
from test.common.page import Page
class BaiDuMainPage(Page):
loc_search_input = (By.ID, 'kw')
loc_search_button = (By.ID, 'su')
def search(self, kw):
"""搜尋功能"""
self.find_element(*self.loc_search_input).send_keys(kw)
self.find_element(*self.loc_search_button).click()
baidu_result_page.py:
from selenium.webdriver.common.by import By
from test.page.baidu_main_page import BaiDuMainPage
class BaiDuResultPage(BaiDuMainPage):
loc_result_links = (By.XPATH, '//div[contains(@class, "result")]/h3/a')
@property
def result_links(self):
return self.find_elements(*self.loc_result_links)
一個是封裝的百度首頁,一個封裝百度結果頁,這樣,我們的測試用例就可以改為:
import time
import unittest
from utils.config import Config, DATA_PATH, REPORT_PATH
from utils.log import logger
from utils.file_reader import ExcelReader
from utils.HTMLTestRunner import HTMLTestRunner
from utils.mail import Email
from test.page.baidu_result_page import BaiDuMainPage, BaiDuResultPage
class TestBaiDu(unittest.TestCase):
URL = Config().get('URL')
excel = DATA_PATH + '/baidu.xlsx'
def sub_setUp(self):
# 初始頁面是main page,傳入瀏覽器型別開啟瀏覽器
self.page = BaiDuMainPage(browser_type='chrome').get(self.URL, maximize_window=False)
def sub_tearDown(self):
self.page.quit()
def test_search(self):
datas = ExcelReader(self.excel).data
for d in datas:
with self.subTest(data=d):
self.sub_setUp()
self.page.search(d['search'])
time.sleep(2)
self.page = BaiDuResultPage(self.page) # 頁面跳轉到result page
links = self.page.result_links
for link in links:
logger.info(link.text)
self.sub_tearDown()
if __name__ == '__main__':
report = REPORT_PATH + '\\report.html'
with open(report, 'wb') as f:
runner = HTMLTestRunner(f, verbosity=2, title='從0搭建測試框架 灰藍', description='修改html報告')
runner.run(TestBaiDu('test_search'))
e = Email(title='百度搜索測試報告',
message='這是今天的測試報告,請查收!',
receiver='...',
server='...',
sender='...',
password='...',
path=report
)
e.send()
現在,我們已經用PO把用例改寫了,這裡面還有不少問題,瀏覽器的設定、基礎page的封裝、log太少、沒有做異常處理等等,這些相信你都可以逐步完善的。