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 引数は、デフォルトの browser
、context
、page
のフィクスチャにのみ適用されることに注意してください。browser.new_context() のような API 呼び出しでブラウザ、コンテキスト、またはページを作成した場合、CLI 引数は適用されません。
--headed
: ヘッドレスモードではなく、ヘッデッドモードでテストを実行します (デフォルト: ヘッドレス)。--browser
:chromium
、firefox
、またはwebkit
の異なるブラウザでテストを実行します。複数回指定できます (デフォルト:chromium
)。--browser-channel
使用するブラウザチャネル。--slowmo
Playwright の操作を指定されたミリ秒数だけ遅くします。何が起こっているかを確認するのに便利です (デフォルト: 0)。--device
エミュレートするデバイス。--output
テストによって生成された成果物のディレクトリ (デフォルト:test-results
)。--tracing
各テストのトレースを記録するかどうか。on
、off
、またはretain-on-failure
(デフォルト:off
)。--video
各テストのビデオを記録するかどうか。on
、off
、またはretain-on-failure
(デフォルト:off
)。--screenshot
各テスト後に自動的にスクリーンショットをキャプチャするかどうか。on
、off
、またはonly-on-failure
(デフォルト:off
)。--full-page-screenshot
失敗時にフルページスクリーンショットを撮るかどうか。デフォルトでは、ビューポートのみがキャプチャされます。--screenshot
が有効になっている必要があります (デフォルト:off
)。
フィクスチャ
このプラグインは、Playwright 固有の pytest 用フィクスチャを設定します。これらのフィクスチャを使用するには、テスト関数の引数としてフィクスチャ名を使用します。
def test_my_app_is_working(fixture_name):
pass
# Test using fixture_name
# ...
関数スコープ: これらのフィクスチャは、テスト関数で要求されたときに作成され、テストが終了したときに破棄されます。
context
: テスト用の新しいブラウザコンテキスト。page
: テスト用の新しいブラウザページ。new_context
: テスト用に異なるブラウザコンテキストを作成できます。マルチユーザーシナリオに便利です。browser.new_context() と同じパラメータを受け入れます。
セッションスコープ: これらのフィクスチャは、テスト関数で要求されたときに作成され、すべてのテストが終了したときに破棄されます。
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
ハードウェアとテストの性質に応じて、numprocesses
を 2
からマシンの CPU 数までの任意の数に設定できます。高すぎると、予期しない動作が発生する可能性があります。
pytest
オプションの一般的な情報については、テストの実行を参照してください。
例
オートコンプリートのための型定義を構成する
from playwright.sync_api import Page
def test_visit_admin_dashboard(page: Page):
page.goto("/admin")
# ...
Pylance を使用している VSCode をお使いの場合、python.testing.pytestEnabled
設定を有効にすることでこれらの型を推論できるため、型アノテーションは不要になります。
複数のコンテキストの使用
複数のユーザーをシミュレートするために、複数のBrowserContext
インスタンスを作成できます。
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
ブラウザによるテストスキップ
import pytest
@pytest.mark.skip_browser("firefox")
def test_visit_example(page):
page.goto("https://example.com")
# ...
特定のブラウザで実行
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
def test_example(page):
page.goto("https://example.com")
ベース URL の設定
base-url
引数を使って Pytest を起動します。pytest-base-url
プラグインが使用されており、これにより config、CLI 引数、またはフィクスチャとしてベース URL を設定できます。
pytest --base-url https://:8080
def test_visit_example(page):
page.goto("/admin")
# -> Will result in https://:8080/admin
HTTPS エラーを無視する
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True
}
カスタムビューポートサイズを使用する
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}
デバイスエミュレーション / BrowserContext オプションのオーバーライド
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")
# ...