Playwright與PyTest的結合,為Web自動化測試帶來了強大的動力。它讓你既能利用Playwright現代、跨瀏覽器的自動化能力,又能借助PyTest成熟測試框架的結構化、可擴展性來高效管理和組織測試用例。我會帶你了解如何將這兩者結合使用。
為了讓你快速上手,我先用一個流程圖來概括Playwright與PyTest結合使用的核心步驟和關鍵配置:
下面我們來詳細看看各個環節。
🛠? 安裝與環境搭建
首先,你需要安裝pytest
和pytest-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 | 指定瀏覽器( | pytest --browser chromium --browser firefox |
--slowmo | 減慢操作速度(毫秒),便于觀察 | pytest --slowmo 1000 |
--video | 錄制視頻( | pytest --video on |
--screenshot | 截屏( | pytest --screenshot on |
--tracing | 記錄追蹤信息( | pytest --tracing on |
--numprocesses | 使用 | 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):# 這個測試將在歐洲/柏林時區運行
🧰 高級技巧與最佳實踐
-
并行測試:使用
pytest-xdist
插件可以顯著縮短大型測試集的運行時間。pip install pytest-xdist pytest --numprocesses auto?# 根據CPU核心數自動創建worker進程
-
跳過測試:可以使用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
-
錄制生成代碼:Playwright的Codegen功能可以錄制你的操作并生成PyTest代碼。
playwright codegen --target python-pytest -o test_recording.py https://baidu.com
-
頁面對象模式 (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")# ... 斷言
-
移動端模擬與多瀏覽器測試: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
希望這份指南能幫助你快速上手。實踐出真知,多寫多試,你就會越來越熟練。