メインコンテンツへスキップ

Pytest プラグインリファレンス

概要

Playwright は、エンドツーエンドテストを作成するための Pytest プラグインを提供しています。使い始めるには、入門ガイドを参照してください。

使用方法

テストを実行するには、Pytest CLI を使用します。

pytest --browser webkit --headed

CLI 引数を指定せずに自動的に追加したい場合は、pytest.ini ファイルを使用できます。

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

CLI 引数

CLI 引数は、デフォルトの browsercontextpage フィクスチャにのみ適用されることに注意してください。browser.new_context() のような API 呼び出しでブラウザー、コンテキスト、またはページを作成した場合、CLI 引数は適用されません。

  • --headed: ヘッドレスモードではなく、ヘッド付きモードでテストを実行します (デフォルト: ヘッドレス)。
  • --browser: 別のブラウザー chromiumfirefox、または webkit でテストを実行します。複数回指定できます (デフォルト: chromium)。
  • --browser-channel 使用する ブラウザーチャネル
  • --slowmo Playwright の操作を指定されたミリ秒数だけ遅くします。何が起こっているかを確認するのに役立ちます (デフォルト: 0)。
  • --device エミュレートする デバイス
  • --output テストによって生成されたアーティファクトのディレクトリ (デフォルト: test-results)。
  • --tracing 各テストの トレース を記録するかどうか。onoff、または retain-on-failure (デフォルト: off)。
  • --video 各テストのビデオを記録するかどうか。onoff、または retain-on-failure (デフォルト: off)。
  • --screenshot 各テスト後にスクリーンショットを自動的にキャプチャするかどうか。onoff、または only-on-failure (デフォルト: off)。
  • --full-page-screenshot 失敗時にフルページのスクリーンショットを撮るかどうか。デフォルトでは、ビューポートのみがキャプチャされます。--screenshot を有効にする必要があります (デフォルト: off)。

フィクスチャ

このプラグインは、Playwright 固有の pytest 用フィクスチャ を構成します。これらのフィクスチャを使用するには、フィクスチャ名をテスト関数の引数として使用します。

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

関数スコープ: これらのフィクスチャは、テスト関数で要求されたときに作成され、テストが終了すると破棄されます。

セッションスコープ: これらのフィクスチャは、テスト関数で要求されたときに作成され、すべてのテストが終了すると破棄されます。

  • playwright: Playwright インスタンス。
  • browser_type: 現在のブラウザーの BrowserType インスタンス。
  • browser: Playwright によって起動された Browser インスタンス。
  • browser_name: 文字列としてのブラウザー名。
  • browser_channel: 文字列としてのブラウザーチャネル。
  • is_chromium, is_webkit, is_firefox: それぞれのブラウザータイプのブール値。

フィクスチャオプションのカスタマイズ: browser および context フィクスチャの場合は、次のフィクスチャを使用してカスタム起動オプションを定義します。

  • browser_type_launch_args: browser_type.launch() の起動引数をオーバーライドします。Dict を返す必要があります。
  • browser_context_args: browser.new_context() のオプションをオーバーライドします。Dict を返す必要があります。

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

ハードウェアとテストの性質に応じて、numprocesses2 からマシンの CPU 数までの範囲に設定できます。高すぎると、予期しない動作が発生する可能性があります。

pytest オプションの一般的な情報については、テストの実行 を参照してください。

自動補完のための型定義の構成

test_my_application.py
from playwright.sync_api import Page

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

Pylance を使用した VSCode を使用している場合、python.testing.pytestEnabled 設定を有効にすることでこれらの型を推論できるため、型アノテーションは必要ありません。

複数のコンテキストの使用

複数のユーザーをシミュレートするために、複数の BrowserContext インスタンスを作成できます。

test_my_application.py
from playwright.sync_api import Page, BrowserContext
from pytest_playwright.pytest_playwright import CreateContextCallback

def test_foo(page: Page, new_context: CreateContextCallback) -> None:
page.goto("https://example.com")
context = new_context()
page2 = context.new_page()
# page and page2 are in different contexts

ブラウザーによるテストのスキップ

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")

ベース URL の構成

base-url 引数を指定して Pytest を起動します。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,
}
}

デバイスエミュレーション / BrowserContext オプションのオーバーライド

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/CD にデプロイするための CI プロバイダー向けガイド を参照してください。

非同期フィクスチャ

非同期フィクスチャを使用する場合は、pytest-playwright-asyncio プラグインを使用できます。pytest-asyncio>=0.24.0 を使用し、テストで loop_scope=session を使用するようにしてください。

import pytest
from playwright.async_api import Page

@pytest.mark.asyncio(loop_scope="session")
async def test_foo(page: Page):
await page.goto("https://github.com")
# ...