Playwright與PyTest結合指南

Playwright與PyTest的結合,為Web自動化測試帶來了強大的動力。它讓你既能利用Playwright現代、跨瀏覽器的自動化能力,又能借助PyTest成熟測試框架的結構化、可擴展性來高效管理和組織測試用例。我會帶你了解如何將這兩者結合使用。

為了讓你快速上手,我先用一個流程圖來概括Playwright與PyTest結合使用的核心步驟和關鍵配置:

圖片

下面我們來詳細看看各個環節。

🛠? 安裝與環境搭建

首先,你需要安裝pytestpytest-playwright插件,并安裝Playwright所需的瀏覽器驅動。

# 1. 安裝pytest和pytest-playwright插件
pip install pytest pytest-playwright# 2. 安裝Playwright瀏覽器驅動(安裝較慢,耐心等待)
playwright install

?? 編寫你的第一個測試用例

創建一個測試文件(如test_example.py),PyTest會自動發現以test_開頭的文件或函數。

import?pytest
from?playwright.sync_api?import?Page# 使用page fixture,它由pytest-playwright提供
def?test_visit_baidu(page: Page):?# 將page fixture作為參數注入page.goto("https://www.baidu.com")page.fill('//*[@id="kw"]',?"Playwright")?# 使用XPath定位搜索框并輸入page.click('#su')?# 使用CSS選擇器定位并點擊“百度一下”按鈕assert?"Playwright"?in?page.title()?# 斷言頁面標題包含特定文本print(page.title)?# 打印當前頁面標題

?? 配置與執行測試

PyTest-P laywright提供了豐富的命令行參數(CLI)來靈活控制測試行為:

參數 (--)

說明

示例

--headed

有頭模式(顯示瀏覽器UI)下運行測試(默認:無頭模式)

pytest --headed
--browser

指定瀏覽器(chromium,?firefox,?webkit)。可多次指定

pytest --browser chromium --browser firefox
--slowmo

減慢操作速度(毫秒),便于觀察

pytest --slowmo 1000
--video

錄制視頻(on,?off,?retain-on-failure

pytest --video on
--screenshot

截屏(on,?off,?only-on-failure

pytest --screenshot on
--tracing

記錄追蹤信息(on,?off,?retain-on-failure),用于調試

pytest --tracing on
--numprocesses

使用pytest-xdist進行并行測試

pytest --numprocesses auto

你可以通過pytest.ini文件預設這些參數,避免每次手動輸入:

# pytest.ini
[pytest]
addopts = --headed --browser chromium --slowmo 100 --video on --screenshot on

📁 Fixtures的深度使用

Fixtures是PyTest的核心功能,用于設置和清理測試環境。pytest-playwright提供了開箱即用的fixtures。

1. 使用內置Fixtures最常用的是page?fixture,它為你提供了一個全新的瀏覽器頁面。

def?test_my_app(page: Page):page.goto("https://example.com")# ... 你的測試邏輯

2. Fixture的作用域 (Scope)Fixtures可以有不同的作用域,控制其創建和銷毀的頻率。

@pytest.fixture(scope='module') # 該fixture在整個模塊中只執行一次
def?browser():with?sync_playwright()?as?p:browser = p.chromium.launch()yield?browser?# 提供瀏覽器實例給測試用例browser.close()?# 所有測試完成后關閉瀏覽器def?test_example_1(browser):?# 在不同的測試中復用同一個瀏覽器實例page = browser.new_page()# ...

3. 覆蓋Fixtures的默認選項你可以自定義瀏覽器或上下文的啟動參數。

# conftest.py
import?pytest@pytest.fixture(scope="session")
def?browser_context_args(browser_context_args):return?{**browser_context_args,?"ignore_https_errors":?True}?# 忽略HTTPS錯誤# 或在測試用例中直接標記以覆蓋特定上下文的選項
@pytest.mark.browser_context_args(timezone_id="Europe/Berlin", locale="de-DE")
def?test_with_custom_timezone(page):# 這個測試將在歐洲/柏林時區運行

🧰 高級技巧與最佳實踐

  1. 并行測試:使用pytest-xdist插件可以顯著縮短大型測試集的運行時間。

    pip install pytest-xdist
    pytest --numprocesses auto?# 根據CPU核心數自動創建worker進程
    
  2. 跳過測試:可以使用PyTest的skip標記根據條件跳過測試。

    import?pytest@pytest.mark.skip("skip this test for now") # 無條件跳過
    def?test_skip_example():pass@pytest.mark.skip_browser("firefox") # 自定義標記(需實現),跳過特定瀏覽器
    def?test_skip_firefox(page):pass
    
  3. 錄制生成代碼:Playwright的Codegen功能可以錄制你的操作并生成PyTest代碼。

    playwright codegen --target python-pytest -o test_recording.py https://baidu.com
    
  4. 頁面對象模式 (Page Object Model):對于復雜項目,強烈建議使用頁面對象模式來分離頁面元素定位和操作邏輯,提高代碼的可維護性和可讀性。

    # 示例:一個簡單的頁面對象
    class?BaiduPage:def?__init__(self, page: Page):self.page = pageself.search_input = page.locator("#kw")self.search_button = page.locator("#su")def?search(self, keyword):self.search_input.fill(keyword)self.search_button.click()# 在測試中使用
    def?test_using_pom(page: Page):baidu_page = BaiduPage(page)baidu_page.search("Playwright")# ... 斷言
    
  5. 移動端模擬與多瀏覽器測試:Playwright可以模擬移動設備,并利用PyTest的參數化功能進行多瀏覽器測試。

    import?pytest
    from?playwright.sync_api?import?sync_playwright# 多瀏覽器參數化測試
    @pytest.mark.parametrize("browser_type", ["chromium", "firefox", "webkit"])
    def?test_cross_browser(browser_type):with?sync_playwright()?as?p:browser = getattr(p, browser_type).launch()# ... 測試邏輯browser.close()# 移動端模擬
    def?test_mobile_emulation(playwright):# 使用playwright fixtureiphone_12 = playwright.devices['iPhone 12 Pro']browser = playwright.webkit.launch()context = browser.new_context(**iphone_12)page = context.new_page()page.goto("https://m.example.com")# ... 移動端測試邏輯browser.close()
    

💡 常見問題與排查

  • Fixtures未注入:確保測試函數的參數名與fixture名稱完全一致(例如page)。

  • 異步與同步API:上述示例均使用同步API。Playwright也支持異步(async/await),如需使用異步,請確保使用async def定義測試函數,并使用from playwright.async_api import Page

  • 元素定位問題:充分利用Playwright強大的定位器(locator),如page.locator('css=button').click(),并配合page.wait_for_selector()等等待方法避免競態條件。

  • 查看詳細輸出:運行測試時添加-v-s參數(如pytest -v -s)可以獲取更詳細的輸出和打印語句。


Playwright與PyTest的結合,為你提供了一個功能全面、易于編寫且易于維護的現代Web自動化測試方案。從簡單的腳本到復雜的企業級測試套件,這個組合都能應對自如。

測試開發全景圖:人工智能測試、智能驅動、自動化、測試開發、左移右移與DevOps的持續交付https://ceshiren.com/t/topic/34328

希望這份指南能幫助你快速上手。實踐出真知,多寫多試,你就會越來越熟練。

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

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

相關文章

plantsimulation知識點 一條軌道上多臺RGV如何引用

最近做項目有如下需求:軌道1上初始化生成三臺RGV,然后通過另一條軌道2上的傳感器代碼控制軌道1上的三臺RGV,之前如果另一條軌道只有一臺RGV,我是通過軌道2.cont來引用這臺RGV的。但是現在軌道上有了多臺RGV,此代碼就不…

【Canvas與盾牌】“靡不有初,鮮克有終”黃豎條盾牌

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>黃豎條盾牌 Draft1</title><style type"text/css"&…

使用linux+javascript+html+mysql+nodejs+npm+express等構建信息資料采集系統

一、適用場景 1、人才信息庫、檔案管理&#xff0c;構建企業或單位內部人才庫。 2、公務員/事業單位招聘&#xff0c;網上報名填寫資料、上傳證書等。 3、科研項目申報&#xff0c;課題負責人信息、成果附件、審查材料上傳。 4、志愿者招募&#xff1a;在線填寫報名信息&#…

低空經濟產業白皮書:音視頻鏈路在智能飛行體系中的核心地位

引言 低空經濟正在成為繼數字經濟、新能源產業之后的又一戰略制高點。它不僅意味著無人機物流、空中通勤、應急救援、文旅體驗等新業態的興起&#xff0c;更代表著 城市治理、智能制造、公共服務全面進入空域數字化時代。從政策引導到產業投資&#xff0c;從技術突破到應用創新…

【LeetCode 熱題 100】32. 最長有效括號——(解法二)動態規劃

Problem: 32. 最長有效括號 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(N)空間復雜度&#xff1a;O(N)整體思路 這段代碼同樣旨在解決 “最長有效括號” 問題&#xff0c;但它采用的是一種 動態規劃 (Dynamic Programming) 的方法。這種方法通過構建一個DP表…

使用Docker部署ZLMediaKit流媒體服務器實現gb/t28181協議的設備

最近在研究一個攝像頭&#xff0c;通信協議是 gb/t28181。對于這個協議也是第一次接觸&#xff0c;通過查閱多方資料&#xff0c;找到了兩個開源的源碼&#xff0c;來實現 視頻播放、攝像頭直播。以前也沒有深入的了解過關于視頻播放的這方面的技術&#xff0c;偶爾網站播放視頻…

硬件三人行--運算基礎篇

第3講 負反饋放大電路

【LINUX網絡】TCP原理

目錄 本文介紹 1. 什么是TCP&#xff1f; 2. TCP結構 為什么需要協議棧&#xff1a;兩臺主機通信的復雜性解決方案 3. 確認應答機制 進一步理解什么是確認和請求以及序號 進一步理解什么是序號和確認序號 并發發送帶來的問題以及解決方案&#xff08;序號&#xff09; …

Java -- 文件基礎知識--Java IO流原理--FileReader

目錄 1. 常用文件操作 2. Java IO流原理 2.1 流的分類 3. FileReader和FileWriter介紹 FileReader相關方法&#xff1a; FileWriter常用方法&#xff1a; 文件是保存數據的地方&#xff0c;比如大家經常使用的word文檔&#xff0c;txt文件&#xff0c;excel文件...都是文…

向量方法證明正余弦定理的數學理論體系

向量方法證明正余弦定理的數學理論體系 摘要&#xff1a; 向量理論為幾何定理的證明提供了強有力的代數化工具。本文基于向量空間的基本概念與運算性質&#xff0c;嚴格推導平面幾何中的正弦定理與余弦定理。通過建立系統的向量表示框架&#xff0c;將幾何關系轉化為向量運算&a…

【筆記ing】大模型算法架構

前言 隨著人工智能技術的飛速發展,大模型算法及其架構已成為推動科技前沿的重要力量。它們不僅能夠處理海量的數據,還具備強大的表征學習能力,能夠應對日益復雜的場景需求。本章節將介紹大模型算法及其架構,帶您了解其背后的原理、技術創新以及在實際應用中的廣闊前景。 …

ConcurrentHashMap的原理

1.底層數據結構JDK1.7底層采用分段的數組鏈表實現JDK1.8 采用的數據結構跟HashMap1.8的結構一樣,數組鏈表/紅黑二叉樹2.加鎖的方式JDK1.7采用Segment分段鎖,底層使用的是ReentrantLockJDK1.8采用CAS添加新節點,采用synchronized鎖定鏈表或紅黑二叉樹的首節點,相對Segment分段鎖…

【論文閱讀】健全個體無輔助運動期間可穿戴傳感器雙側下肢神經機械信號的基準數據集

Benchmark Datasets for Bilateral Lower-Limb Neuromechanical Signals from Wearable Sensors during Unassisted Locomotion in Able-Bodied Individuals 原文&#xff1a;DOI&#xff1a; 10.3389/frobt.2018.00014 2018年 翻譯&#xff1a;靠岸學術 目錄 1引言 2儀器設…

反向海淘系統搭建:從架構設計到合規運營的全方位指南

一、系統架構設計1.1 分層架構設計反向海淘系統通常采用四層架構設計&#xff1a;?接入層?&#xff1a;負責與淘寶開放平臺、1688海外接口通信&#xff0c;處理接口認證、請求轉發與響應解析。?業務層?&#xff1a;包含商品檢索、訂單管理、支付處理、物流追蹤等核心模塊。…

20.22 QLoRA微調實戰:中文語音識別數據準備全流程解密

QLoRA微調實戰:中文語音識別數據準備全流程解密 實戰項目:QLoRA 微調數據準備詳解 本環節我們將以中文語音識別任務為場景,詳細拆解 QLoRA 微調前的數據準備流程。以下流程圖展示了完整的數據處理路徑: #mermaid-svg-A3ZpWn1ysZUg6jg4 {font-family:"trebuchet ms&q…

工業電子看板賦能線纜工廠生產高效運轉

在制造業智能化轉型的浪潮中&#xff0c;工業電子看板已不再只是“顯示數據的屏幕”&#xff0c;而是成為連接設備層、控制層與管理層的實時信息樞紐。尤其在線纜制造這類對工藝參數敏感、生產連續性要求高的行業中&#xff0c;電子看板通過對關鍵數據的透明化、實時化與交互化…

Java爬蟲是什么,如何獲取API接口

一、Java爬蟲的定義Java爬蟲是一種基于Java編程語言開發的網絡爬蟲程序。它通過模擬瀏覽器行為&#xff0c;向目標網站發送HTTP請求&#xff0c;獲取網頁內容并解析出所需數據。Java爬蟲技術廣泛應用于數據采集、市場分析、競爭情報等領域。二、Java爬蟲獲取API接口的方法&…

Python篇---返回類型

基礎返回類型&#xff1a;在 Python 中&#xff0c;函數的返回類型就像函數 “產出” 的不同 “物品”&#xff0c;理解它們能幫你更好地控制代碼的輸出。下面用通俗的方式介紹常見的返回類型及用法&#xff1a;一、最基礎的返回類型1. 無返回值&#xff08;None&#xff09;特…

ArkTS 與 TypeScript 的關系及鴻蒙開發常見錯誤案例

隨著 HarmonyOS NEXT&#xff08;純血鴻蒙&#xff09; 的到來&#xff0c;開發者在學習鴻蒙應用開發時會遇到一個新的語言 —— ArkTS。很多人會疑惑&#xff1a;它和 TypeScript&#xff08;TS&#xff09;是什么關系&#xff1f;又有哪些新的特性&#xff1f;在實際開發中&a…

初識socket編程(實現一個簡單的TCPServer)

監聽套接字的創建流程 在網絡編程中&#xff0c;listen 套接字&#xff08;通常稱為“監聽套接字”&#xff09;是服務器端用于接收客戶端連接請求的特殊套接字&#xff0c;是 TCP 服務器建立連接過程中的核心組件。下面我們就來簡單看一下監聽套接字創建的過程創建流程&#x…