第二個框架:一個簡單的UI自動化框架-selenium+pytest

雖然之前的api自動化測試框架還有很多可完善的地方,但是由于基本滿足了我目前的使用場景,于是這兩天我又在ui自動化測試框架上進行了一番簡單的臨摹學習,實現了一個基礎架構,接下來一小段時間會努力在豐富一下的。然后會和之前的api測試部分整合起來。

Page Object Model

這個ui自動化測試框架,應用到的一種模式叫做PO模式,Page Object Model(頁面對象模型)。這個模式主要是說將每一個頁面看做是一個對象,具體頁面操作與測試流程相分離,單獨一個方面的更改并不會影響到對方。

主要應用

  • 利用selenium進行元素定位及操作
  • 利用pytest進行測試驗證。
  • 其它輔助工具幫助更好的執行自動化,例如測試數據的讀寫、日志記錄、html記錄以及截屏圖像等。

框架結構

整體框架主要分為四個部分:

  • Page Model:包括封裝selenium操作,及各個頁面元素定位。
  • TestCase:主要有測試用例文件、測試請求數據以及測試結果存儲數據。
  • Utils:包含框架用到的工具,例如讀寫excel、截屏、日志、發送郵件、html報告存儲等。
  • Config:一些配置,例如url、環境配置等。


    框架結構

PageModel

PageModel主要包括page軟件包以及base_page.py文件。

頁面元素定位及操作設置

建立page
軟件包,內部存儲各個頁面的元素定位信息,以及需要執行的自動化操作。
首先是入口頁需執行測試的對象。

#unique_page.py

from selenium.webdriver.common.by import By

elements = [
    {'name': 'choose1', 'desc': '選擇一', 'by': (By.XPATH, '/html/body/div[1]/'),
     'action': 'click()'},
    {'name': 'choose2', 'desc': '選擇二', 'by': (By.XPATH, '/html/body/div[2]'),
     'action': 'click()'},
    {'name': 'create_btn', 'desc': '點擊生成', 'by': (By.XPATH, '/html/body/div[3]/'),
     'action': 'click()'}
]

以及結果頁需要執行測試的對象。

#result.py

from selenium.webdriver.common.by import By

elements = [
    {'name': 'description', 'desc': '描述', 'by': (By.XPATH, '/html/body/div[4]/'),
     'action': 'text'},
]

元素操作封裝

在base_page.py文件中,進行各項元素定位及操作的獲取,并封裝執行的操作。

獲取元素

通過import_module方法,以字符串為參數,動態引用頁面元素的位置及操作。即上方unique_page.py/result.py文件中的elements。

#base_page.py
import importlib
# 通過傳入字符串來引用一個模塊
def get_page_elements(page):
    m = importlib.import_module(page)
    element = m.elements
    return element

封裝頁面操作

通過上方的get_page_elements方法獲取到元素后,先在Page類中定義一些初始化變量。

#base_page.py
class Page(object):
    def __init__(self, driver, page):
        self.driver = driver
        self.page = page
        self.elements = get_page_elements(page)
        self.by = ()

Page類中建立get_each_elem方法,獲取元素的具體定位。

    def get_each_elem(self, elem):
        for each in self.elements:
            if each['name'] == elem:
                self.by = each['by']

Page類中建立selenium_elem方法,封裝瀏覽器查找元素位置。這里的find_element方法括號內的參數,必須加*號變為位置參數,否則執行時會報錯:Message: invalid argument: 'using' must be a string。(我至今還沒有明白為什么...)

    def selenium_elem(self, args=None):
        element = self.driver.find_element(*self.by)
        return element

Page類中建立operate_elem方法,封裝元素點擊操作。相似的各種操作都可以在這之后建立,例如獲取文案(.text)等等。

#執行元素點擊操作
    def operate_elem(self, elem, args=None):
        self.get_each_elem(elem)
        element = self.selenium_elem()
        return self.driver.execute_script("arguments[0].click();", element)
#執行獲取文案操作
    def get_elem(self, elem, args=None):
        self.get_each_elem(elem)
        element = self.selenium_elem().text
        return element

TestCase

測試用例軟件包中,主要包括Case(各個頁面的測試用例)、data(測試數據)以及result_data(需要保存的結果數據)。
測試用例中,直接調用PageModel中標明的頁面元素以及操作方法。

#test_unique.py
from selenium import webdriver
from  PageModel.base_page import Page
def test_one():
    driver = webdriver.Chrome()
    driver.get('https://***.com')
    driver.switch_to.frame(0)#所測頁面在一個frame中,需要先轉入。
#進入入口頁操作元素
    obj = Page(driver, 'PageModel.page.unique_page')#第二個參數是字符串,動態引入頁面元素定位
    obj.operate_elem('choose1')#對元素執行點擊操作
    obj.operate_elem('choose2')#對元素執行點擊操作
    obj.operate_elem('create_btn')#對元素執行點擊操作
#進入結果頁操作元素
    result = Page(driver, 'PageModel.page.result')
    desc = result.get_elem('description')
    assert desc == 'Success'

終端運行pytest test_unique.py即可。

Utils

如果需要操作數據,比如從數據庫表讀取參數,或者將結果寫入數據庫表。可以增加excel的讀寫方法。
讀取數據

#read_excel.py
import pandas as pd

def read_excel(file):
    read_data = pd.read_excel(file)
    data = []
    for i in read_data.index.values:
        row_data = read_data.loc[i, :].to_dict()
        data.append(row_data)
    return data

寫入數據

#write_excel.py
import pandas as pd

def write_excel(data, file):
    df = pd.DataFrame(data)
    df.to_excel(file, index=False)

至此,一個簡單的UI自動化測試框架搭建完成,現階段,實現的只有結構圖標記已完成的部分,還需要不斷的去填充和學習。目前的目錄如下~


當前框架目錄

未來一小段日子會繼續豐富的~~~

歷時了三天,終于寫完了~


這兩天補充了兩個模塊,截圖打印日志,直接上對應的記錄鏈接,所以現在的目錄如下~

當前框架目錄-211208

自我記錄,有錯誤歡迎指正~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容