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

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 プラグインが使用されており、これにより config、CLI 引数、またはフィクスチャとしてベース URL を設定できます。

pytest --base-url https://:8080
test_my_application.py
def test_visit_example(page):
page.goto("/admin")
# -> Will result in https://: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 プロバイダー向けガイドを参照してください。

Async フィクスチャ

非同期フィクスチャを使用するには、pytest-playwright-asyncio をインストールしてください。

pytest-asyncio>=0.26.0 を使用していることを確認し、設定 (pytest.ini/pyproject.toml/setup.cfg) でasyncio_default_test_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")
# ...