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

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 引数は、デフォルトの browsercontext、および page フィクスチャにのみ適用されることに注意してください。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_chromiumis_webkitis_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 を起動します。これには、構成、CLI 引数、またはフィクスチャとしてベース URL を設定できる pytest-base-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 プロバイダーのガイドを参照してください。

非同期フィクスチャ

非同期フィクスチャを使用するには、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")
# ...