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
プラグインは、構成、CLI 引数、またはフィクスチャからベース URL を設定できるようにするために使用されます。
pytest --base-url http://localhost:8080
def test_visit_example(page):
page.goto("/admin")
# -> Will result in http://localhost: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 プロバイダー向けガイド を参照してください。
非同期フィクスチャ
非同期フィクスチャを使用する場合は、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")
# ...