40. 自動化異步測試開發之編寫異步業務函數、測試函數和測試類(類寫法)

40. 自動化異步測試開發之編寫異步業務函數、測試函數和測試類(類寫法)

一、類結構設計解析

1.1 基類設計

class Base:async_driver = None  # 🚗 存儲瀏覽器驅動實例async def get(self, url: str = 'http://secure.smartbearsoftware.com/...'):await self.async_driver.get(url)  # 🌐 導航到指定URL
  • 核心成員async_driver 存儲瀏覽器驅動實例
  • 通用功能:提供頁面導航方法
  • 默認URL:Web Orders登錄頁面

1.2 登錄頁面類

class LoginPage(Base):async def login(self, username: str = 'Tester', password: str = 'test'):# 輸入用戶名await self.async_driver.send_keys('id', 'ctl00_MainContent_username', text=username)# 輸入密碼await self.async_driver.send_keys('id', 'ctl00_MainContent_password', text=password)# 點擊登錄按鈕await self.async_driver.click('name', 'ctl00$MainContent$login_button')
  • 功能定位:封裝登錄相關操作
  • 默認憑證:用戶名’Tester’,密碼’test’
  • 元素定位:使用ID定位輸入框,Name定位按鈕

1.3 主頁面類

class MainPage(LoginPage):async def search(self):# 點擊搜索菜單await self.async_driver.click('xpath', '//*[@id="ctl00_menu"]/li[3]/a')# 輸入搜索內容(需要添加text參數)await self.async_driver.send_keys('id', 'ctl00_MainContent_fmwOrder_txtName')# 點擊搜索按鈕await self.async_driver.click('id', 'ctl00_MainContent_fmwOrder_InsertButton')async def logout(self):# 點擊登出鏈接await self.async_driver.click('xpath', '//*[@id="ctl00_logout"]')
  • 繼承關系:繼承自LoginPage,復用登錄功能
  • 擴展功能:添加搜索和登出操作
  • 元素定位:混合使用XPath和ID定位器

二、測試類實現

2.1 登錄測試類

class AsyncTestLogin(MainPage):async def test_login(self, *args):await self.get()  # 打開登錄頁await self.login(*args)  # 執行登錄# 驗證登錄成功title_text = await self.async_driver.text('xpath', '//*[@id="aspnetForm"]//td[1]/h1')assert title_text == 'Web Orders'
  • 測試流程
    1. 打開登錄頁
    2. 執行登錄
    3. 驗證頁面標題
  • 斷言驗證:檢查標題是否為’Web Orders’

2.2 搜索測試類

class AsyncTestMain(MainPage):async def test_search(self):await self.get()  # 打開登錄頁await self.login()  # 登錄系統await self.search()  # 執行搜索# 驗證錯誤提示error_msg = await self.async_driver.text('id', "ctl00_MainContent_fmwOrder_RequiredFieldValidator3")assert error_msg == "Field 'Street' cannot be empty."await self.logout()  # 退出登錄
  • 測試流程
    1. 登錄系統
    2. 執行搜索
    3. 驗證錯誤提示
    4. 登出系統
  • 斷言驗證:檢查是否顯示街道字段不能為空的錯誤

三、完整測試執行示例

3.1 測試運行器

import asyncio
from chap9.async_browser import AsyncBrowser
from aiohttp import ClientSessionasync def run_tests():async with ClientSession() as session:# 啟動瀏覽器async with AsyncBrowser.start(remote_driver_server='http://localhost:9515',capabilities={'browserName': 'chrome'},http_session=session) as driver:# 創建測試實例login_test = AsyncTestLogin()login_test.async_driver = driversearch_test = AsyncTestMain()search_test.async_driver = driver# 執行登錄測試print("執行登錄測試...")await login_test.test_login()print("登錄測試通過 ?")# 執行搜索測試print("執行搜索測試...")await search_test.test_search()print("搜索測試通過 ?")if __name__ == "__main__":asyncio.run(run_tests())

3.2 預期執行結果

執行登錄測試...
登錄測試通過 ?
執行搜索測試...
搜索測試通過 ?

3.3 實際操作流程

登錄測試:1. 打開登錄頁2. 輸入用戶名:Tester3. 輸入密碼:test4. 點擊登錄按鈕5. 驗證頁面標題:Web Orders搜索測試:1. 打開登錄頁2. 輸入憑證登錄3. 點擊搜索菜單4. 點擊搜索按鈕(不輸入內容)5. 驗證錯誤提示:Field 'Street' cannot be empty.6. 點擊登出鏈接

四、類寫法的優勢分析

4.1 繼承結構

Base│├── LoginPage│     ││     └── MainPage│           ││           ├── AsyncTestLogin│           ││           └── AsyncTestMain
  • 代碼復用:通過繼承復用公共方法和屬性
  • 功能擴展:子類可以擴展或重寫父類方法
  • 邏輯分層:清晰區分頁面操作和測試驗證

4.2 與函數寫法的對比

特性類寫法函數寫法
狀態管理通過類屬性維護狀態依賴參數傳遞狀態
代碼組織按頁面/功能模塊組織按操作流程組織
復用性高(繼承機制)中(函數組合)
學習曲線較陡峭(需理解OOP)較平緩
適用場景大型項目/復雜頁面小型項目/簡單流程

五、最佳實踐建議

5.1 類設計優化

class BasePage:def __init__(self, driver):self.driver = driver  # ? 通過構造器注入驅動async def open(self, url):await self.driver.get(url)class LoginPage(BasePage):USERNAME = ('id', 'ctl00_MainContent_username')PASSWORD = ('id', 'ctl00_MainContent_password')LOGIN_BTN = ('name', 'ctl00$MainContent$login_button')async def login(self, username, password):await self.driver.send_keys(*self.USERNAME, text=username)await self.driver.send_keys(*self.PASSWORD, text=password)await self.driver.click(*self.LOGIN_BTN)

5.2 測試類優化

class TestLogin(LoginPage):TITLE = ('xpath', '//*[@id="aspnetForm"]//td[1]/h1')async def test_success_login(self):await self.open(LOGIN_URL)await self.login(TEST_USER, TEST_PASS)assert await self.driver.text(*self.TITLE) == 'Web Orders'

5.3 執行入口優化

async def main():driver = await create_driver()login_page = LoginPage(driver)await login_page.test_success_login()

這種基于類的異步測試開發模式,通過面向對象的設計思想,提供了更結構化、可維護性更高的測試代碼組織方式,特別適合中大型自動化測試項目。

六、完整代碼

"""
Python :3.13.3
Selenium: 4.31.0async_test_cls.py
"""class Base:async_driver = Noneasync def get(self, url: str = 'http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx'):await self.async_driver.get(url)class LoginPage(Base):async def login(self, username: str = 'Tester', password: str = 'test'):await self.async_driver.send_keys('id', 'ctl00_MainContent_username', text=username)await self.async_driver.send_keys('id', 'ctl00_MainContent_password', text=password)await self.async_driver.click('name', 'ctl00$MainContent$login_button')class MainPage(LoginPage):async def search(self):await self.async_driver.click('xpath', '//*[@id="ctl00_menu"]/li[3]/a')await self.async_driver.send_keys('id', 'ctl00_MainContent_fmwOrder_txtName')await self.async_driver.click('id', 'ctl00_MainContent_fmwOrder_InsertButton')async def logout(self):await self.async_driver.click('xpath', '//*[@id="ctl00_logout"]')class AsyncTestLogin(MainPage):async def test_login(self, *args):await self.get()await self.login(*args)assert await self.async_driver.text('xpath', '//*[@id="aspnetForm"]//td[1]/h1') == 'Web Orders'class AsyncTestMain(MainPage):async def test_search(self, text: str = '1'):await self.get()await self.login()await self.search(text)assert await self.async_driver.text('id',"ctl00_MainContent_fmwOrder_RequiredFieldValidator3") == "Field 'Street' cannot be empty."await self.logout()

「小貼士」:點擊頭像→【關注】按鈕,獲取更多軟件測試的晉升認知不迷路! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86045.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面向開發者的提示詞工程④——文本推斷(Inferring)

文章目錄 前言一、情感(正向/負向)二、識別情感類型三、識別憤怒四、從客戶評論中提取產品和公司名稱五、一次完成多項任務 前言 面向開發者的提示詞工程——導讀 在這節課中,你將從產品評論和新聞文章中推斷情感和主題。 舉了個商品評論的例…

java day15 (數據庫)

進入數據庫的學習 DB 因為數據太多了,方便統一管理的軟件 操作就不用改代碼了,直接改數據庫則可; 命令就是sql語句 這些都是關系型數據庫,sql可以控制全部,至于具體的環境我以前就有安裝過了; 理解&am…

國標GB28181設備管理軟件EasyGBS遠程視頻監控方案助力高效安全運營

一、方案背景? 在商業快速擴張的背景下,連鎖店門店數量激增,分布范圍廣。但傳統人工巡檢、電話匯報等管理方式效率低下,存在信息滯后、管理盲區,難以掌握店鋪運營情況,影響企業效率與安全。網絡遠程視頻監控系統可有…

Python 字典(dict)的高級用法與技巧

今天我們繼續深入講解 Python 字典的 高級用法與技巧,包括: defaultdict:帶默認值的字典Counter:快速統計工具字典排序:按鍵或值排序合并字典(傳統方式和 Python 3.9 新語法)嵌套字典的安全訪問…

動靜態庫的使用(Linux)

1.庫 通俗來說,庫就是現有的,可復用的代碼,例如:在C/C語言編譯時,就需要依賴相關的C/C標準庫。本質上來說庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。通常我們可以在windows下看到一些后…

R2ec: 構建具有推理能力的大型推薦模型,顯著提示推薦系統性能!!

摘要:大型推薦模型通過編碼或項目生成將大型語言模型(LLMs)擴展為強大的推薦工具,而近期在LLM推理方面的突破也同步激發了在推薦領域探索推理的動機。目前的研究通常將LLMs定位為外部推理模塊,以提供輔助性思考來增強傳…

【Java后端基礎 005】ThreadLocal-線程數據共享和安全

📚博客主頁:代碼探秘者 ?專欄:文章正在持續更新ing… ?C語言/C:C(詳細版) 數據結構) 十大排序算法 ?Java基礎:JavaSE基礎 面向對象大合集 JavaSE進階 Java版數據結構JDK新特性…

Tesseract配置參數詳解及適用場景(PyTesseract進行OCR)

在使用 PyTesseract 進行 OCR 時,合理配置參數是提高識別準確率的關鍵。以下是 Tesseract 常用參數的詳細解釋和適用場景。 一、關鍵參數 (1)頁面分割模式(Page Segmentation Mode, --psm) 控制 Tesseract 如何分析…

【Zephyr 系列 12】BLE + NVS + 低功耗融合實戰:打造可配置藍牙信標系統

??關鍵詞:Zephyr、BLE 廣播、信標、NVS 參數、低功耗、狀態機、周期喚醒 ??適合人群:希望實現 BLE 信標類產品(定位標簽、資產管理)的開發者 ??預計篇幅:約 5200+ 字 ?? 項目目標 構建一個可廣泛應用于資產標簽、定位信標、設備標識等場景的藍牙廣播模塊,具備:…

圖解瀏覽器多進程渲染:從DNS到GPU合成的完整旅程

目錄 瀏覽器進程架構的演化 進程和線程關系圖示 進程(Process) 線程(Thread) 協程(Coroutine) 進程&線程&協程核心對比 單進程和多進程瀏覽器 單進程瀏覽器?編輯 單進程瀏覽器存在的問題…

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引發的HTTP 406 錯誤

HTTP 狀態碼 406 (Not Acceptable) 和 500 (Internal Server Error) 是兩類完全不同的錯誤,它們的含義、原因和解決方法都有顯著區別。以下是詳細對比: 1. HTTP 406 (Not Acceptable) 含義: 客戶端請求的內容類型與服務器支持的內容類型不匹…

C# 類和繼承(抽象成員)

抽象成員 抽象成員是指設計為被覆寫的函數成員。抽象成員有以下特征。 必須是一個函數成員。也就是說,字段和常量不能為抽象成員。必須用abstract修飾符標記。不能有實現代碼塊。抽象成員的代碼用分號表示。 例如,下面取自一個類定義的代碼聲明了兩個抽…

基于JWT+SpringSecurity整合一個單點認證授權機制

基于 JWT Spring Security 的授權認證機制,在整體架構設計上體現了高度的安全性與靈活性。其在整合框架中的應用,充分展示了模塊化、可擴展性和高效鑒權的設計理念,為開發者提供了一種值得借鑒的安全架構模式。 1.SpringSecurity概念理解 …

HarmonyOS運動開發:如何用mpchart繪制運動配速圖表

##鴻蒙核心技術##運動開發##Sensor Service Kit(傳感器服務)# 前言 在運動類應用中,運動數據的可視化是提升用戶體驗的重要環節。通過直觀的圖表展示運動過程中的關鍵數據,如配速、距離、卡路里消耗等,用戶可以更清晰…

Git 切換到舊提交,同時保證當前修改不丟失

在 Git 中&#xff0c;可以通過以下幾種方式切換到之前的提交&#xff0c;同時保留當前的修改 1. 使用 git checkout 創建臨時分離頭指針&#xff08;推薦用于查看代碼&#xff09; git checkout <commit-hash>這會讓你進入"分離頭指針"狀態&#xff0c;你可…

東芝Toshiba DP-4528AG打印機信息

東芝 Toshiba DP 4528AG 是一款黑白激光數碼復合機&#xff1a; 類型&#xff1a;激光數碼復合機&#xff0c;涵蓋復印、打印、掃描、傳真功能&#xff0c;能滿足辦公室多樣化的文檔處理需求。速度類型&#xff1a;中速&#xff0c;黑白復印和打印速度可達 45 頁 / 分鐘&#…

Qt生成日志與以及捕獲崩潰文件(mingw64位,winDbg)————附帶詳細解說

文章目錄 Qt生成日志與以及報錯文件(mingw64位&#xff0c;winDbg)0 背景與結果0.1 背景0.2 結果1 WinDbg1.1 安裝1.2 使用 2 編寫代碼2.1 ccrashstack類2.2 編寫輸出捕獲異常的dmp文件2.2 編寫輸出日志文件2.3 調用生成日志和dmp文件 參考 Qt生成日志與以及報錯文件(mingw64位…

Nginx + Tomcat負載均衡群集

目錄 一、案例環境 二、部署 Tomcat&#xff08;102/103&#xff09; 1、準備環境 &#xff08;1&#xff09;關閉firewalld 防火墻 &#xff08;2&#xff09;安裝JDK 2、安裝配置 Tomcat &#xff08;1&#xff09;Tomcat 的安裝和配置 &#xff08;2&#xff09;移動…

三、元器件的選型

前言&#xff1a;我們確立了題目的功能后&#xff0c;就可以開始元器件的選型&#xff0c;元器件的選型關乎到我們后面代碼編寫的一個難易。 一、主控的選擇 主控的選擇很大程度上決定我們后續使用的代碼編譯器&#xff0c;比如ESP32使用的是VScode&#xff0c;或者Arduino&a…

API是什么意思?如何實現開放API?

目錄 一、API 是什么 &#xff08;一&#xff09;API 的定義 &#xff08;二&#xff09;API 的作用 二、API 的類型 &#xff08;一&#xff09;Web API 1. RESTful API 2. SOAP API &#xff08;二&#xff09;操作系統 API &#xff08;三&#xff09;數據庫 API …