1. 程式人生 > >怎樣從0開始搭建一個測試框架_6——PageObject

怎樣從0開始搭建一個測試框架_6——PageObject

怎樣從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太少、沒有做異常處理等等,這些相信你都可以逐步完善的。