Skip to main content

Pytest 外掛參考

簡介

Playwright 提供一個 Pytest 外掛來編寫端到端測試。要開始使用它,請參考 getting started guide

使用方式

要執行你的測試,使用 Pytest CLI。

pytest --browser webkit --headed

如果你想自動添加 CLI 參數而不指定它們,你可以使用 pytest.ini 文件:

# content of pytest.ini
[pytest]
# Run firefox with UI
addopts = --headed --browser firefox

CLI arguments

注意,CLI 參數僅適用於預設的 browsercontextpage 固定裝置。如果你使用 API 呼叫建立一個 browser、context 或 page,例如 browser.new_context(),CLI 參數將不會被應用。

  • --headed: 在 headed 模式下執行測試 (預設: headless)。
  • --browser: 在不同的瀏覽器 chromiumfirefoxwebkit 中執行測試。可以多次指定 (預設: chromium)。
  • --browser-channel 要使用的 Browser channel
  • --slowmo 將 Playwright 操作減慢指定的毫秒數。這樣可以看到發生了什麼 (預設: 0)。
  • --device 要模擬的 Device
  • --output 測試產生的工件目錄 (預設: test-results)。
  • --tracing 是否為每個測試記錄 traceonoffretain-on-failure (預設: off)。
  • --video 是否為每個測試錄製影片。onoffretain-on-failure (預設: off)。
  • --screenshot 是否在每次測試後自動截取螢幕截圖。onoffonly-on-failure (預設: off)。
  • --full-page-screenshot 是否在失敗時截取整頁截圖。預設情況下,僅捕獲視口。需要啟用 --screenshot (預設: off)。

Fixtures

此外掛配置了 Playwright 特定的 pytest 夾具。要使用這些夾具,請將夾具名稱作為測試函式的參數。

def test_my_app_is_working(fixture_name):
pass
# Test using fixture_name
# ...

函式範圍: 這些固定裝置在測試函式中請求時建立,並在測試結束時銷毀。

Session scope: 這些 物件 在測試 函式 中請求時 建立,並在所有測試結束時銷毀。

  • playwright: Playwright 實例.
  • browser_type: BrowserType 當前瀏覽器的實例.
  • browser: Browser 由 Playwright 啟動的實例.
  • browser_name: 瀏覽器名稱作為字串.
  • browser_channel: 瀏覽器頻道作為字串.
  • is_chromium, is_webkit, is_firefox: 分別對應瀏覽器類型的布林值.

自訂 fixture 選項: 對於 browsercontext fixtures,使用以下 fixtures 定義自訂啟動選項。

也可以使用 browser_context_args 標記來覆蓋單個測試的上下文選項(browser.new_context())。

import pytest

@pytest.mark.browser_context_args(timezone_id="Europe/Berlin", locale="en-GB")
def test_browser_context_args(page):
assert page.evaluate("window.navigator.userAgent") == "Europe/Berlin"
assert page.evaluate("window.navigator.languages") == ["de-DE"]

平行處理: 同時執行多個測試

如果你的測試在一台有很多 CPU 的機器上執行,你可以使用 pytest-xdist 同時執行多個測試來加快整體測試套件的執行時間:

# install dependency
pip install pytest-xdist
# use the --numprocesses flag
pytest --numprocesses auto

根據硬體和測試的性質,你可以將 numprocesses 設定為從 2 到機器上的 CPU 數量。如果設置過高,你可能會注意到意外的行為。

請參閱 執行測試 以獲取有關 pytest 選項的一般資訊。

範例

設定 Mypy typings 以自動完成

test_my_application.py
from playwright.sync_api import Page

def test_visit_admin_dashboard(page: Page):
page.goto("/admin")
# ...

設定 slow mo

使用 --slowmo 參數慢速執行測試。

pytest --slowmo 100

將 Playwright 操作減慢 100 毫秒。

跳過瀏覽器測試

test_my_application.py
import pytest

@pytest.mark.skip_browser("firefox")
def test_visit_example(page):
page.goto("https://example.com")
# ...

在特定瀏覽器上執行

conftest.py
import pytest

@pytest.mark.only_browser("chromium")
def test_visit_example(page):
page.goto("https://example.com")
# ...

使用自訂瀏覽器通道執行,例如 Google Chrome 或 Microsoft Edge

pytest --browser-channel chrome
test_my_application.py
def test_example(page):
page.goto("https://example.com")

設定 base-url

開始 Pytest 並使用 base-url 參數。pytest-base-url 外掛用於此,允許您從配置、CLI 參數或作為固定裝置設定基礎 url。

pytest --base-url http://localhost:8080
test_my_application.py
def test_visit_example(page):
page.goto("/admin")
# -> Will result in http://localhost:8080/admin

忽略 HTTPS 錯誤

conftest.py
import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True
}

使用自訂視窗大小

conftest.py
import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}

裝置模擬

conftest.py
import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args, playwright):
iphone_11 = playwright.devices['iPhone 11 Pro']
return {
**browser_context_args,
**iphone_11,
}

或者通過 CLI --device="iPhone 11 Pro"

使用與 unittest.TestCase

請參閱以下範例,以了解如何將其與 unittest.TestCase 一起使用。這有一個限制,即只能指定單一瀏覽器,並且在指定多個瀏覽器時不會生成多個瀏覽器的矩陣。

import pytest
import unittest

from playwright.sync_api import Page


class MyTest(unittest.TestCase):
@pytest.fixture(autouse=True)
def setup(self, page: Page):
self.page = page

def test_foobar(self):
self.page.goto("https://microsoft.com")
self.page.locator("#foobar").click()
assert self.page.evaluate("1 + 1") == 2

除錯

與 pdb 一起使用

在您的測試程式碼中使用 breakpoint() 語句來暫停執行並獲取 pdb REPL。

def test_bing_is_working(page):
page.goto("https://bing.com")
breakpoint()
# ...

部署到 CI

請參閱CI 提供者指南以部署您的測試到 CI/CD。