テストの記述
はじめに
Playwrightのテストはシンプルで、以下のことを行います。
- アクションを実行し、
- 期待される状態に対してアサートします。
アクションを実行する前に何かを待つ必要はありません。Playwrightは、各アクションを実行する前に、幅広い実行可能性チェックがパスするのを自動的に待ちます。
チェックを実行する際に競合状態に対処する必要もありません。Playwrightのアサーションは、最終的に満たされるべき期待値を記述するように設計されています。
それだけです!これらの設計上の選択により、Playwrightユーザーはテストにおける不安定なタイムアウトや競合するチェックを完全に忘れることができます。
学習内容
最初のテスト
以下の例を見て、テストの記述方法を確認してください。ファイル名が`test_`プレフィックスの慣例に従っていること、および各テスト名がそれに従っていることに注目してください。
import re
from playwright.sync_api import Page, expect
def test_has_title(page: Page):
page.goto("https://playwright.dokyumento.jp/")
# Expect a title "to contain" a substring.
expect(page).to_have_title(re.compile("Playwright"))
def test_get_started_link(page: Page):
page.goto("https://playwright.dokyumento.jp/")
# Click the get started link.
page.get_by_role("link", name="Get started").click()
# Expects page to have a heading with the name of Installation.
expect(page.get_by_role("heading", name="Installation")).to_be_visible()
アクション
ナビゲーション
ほとんどのテストは、ページをURLに移動させることから始まります。その後、テストはページ要素と対話できるようになります。
page.goto("https://playwright.dokyumento.jp/")
Playwrightは、先に進む前にページがロード状態に達するのを待ちます。page.goto()オプションの詳細については、こちらをご覧ください。
インタラクション
アクションの実行は、要素の特定から始まります。Playwrightは、そのためにLocators APIを使用します。Locatorsは、いつでもページ上の要素を見つける方法を表します。利用可能な異なる種類のロケーターの詳細については、こちらをご覧ください。Playwrightは、アクションを実行する前に要素が実行可能になるのを待つため、利用可能になるのを待つ必要はありません。
# Create a locator.
get_started = page.get_by_role("link", name="Get started")
# Click it.
get_started.click()
ほとんどの場合、1行で記述されます。
page.get_by_role("link", name="Get started").click()
基本アクション
これは、最も一般的なPlaywrightアクションのリストです。他にもたくさんありますので、詳細についてはLocator APIセクションを必ず確認してください。
| アクション | 説明 |
|---|---|
| locator.check() | 入力チェックボックスをチェック |
| locator.click() | 要素をクリック |
| locator.uncheck() | 入力チェックボックスのチェックを外す |
| locator.hover() | 要素にマウスをホバー |
| locator.fill() | フォームフィールド、入力テキストを入力 |
| locator.focus() | 要素にフォーカス |
| locator.press() | 単一のキーを押す |
| locator.set_input_files() | アップロードするファイルを選択 |
| locator.select_option() | ドロップダウンでオプションを選択 |
アサーション
Playwrightには、期待される条件が満たされるまで待機するアサーションが含まれています。これらのアサーションを使用することで、テストを不安定ではなく、回復力のあるものにすることができます。例えば、このコードは、ページが「Playwright」を含むタイトルを取得するまで待機します。
import re
from playwright.sync_api import expect
expect(page).to_have_title(re.compile("Playwright"))
最も一般的な非同期アサーションのリストを以下に示します。他にもたくさんありますので、慣れておくようにしてください。
| アサーション | 説明 |
|---|---|
| expect(locator).to_be_checked() | チェックボックスがチェックされている |
| expect(locator).to_be_enabled() | コントロールが有効になっている |
| expect(locator).to_be_visible() | 要素が表示されている |
| expect(locator).to_contain_text() | 要素にテキストが含まれている |
| expect(locator).to_have_attribute() | 要素に属性がある |
| expect(locator).to_have_count() | 要素のリストが指定された長さである |
| expect(locator).to_have_text() | 要素がテキストに一致する |
| expect(locator).to_have_value() | 入力要素に値がある |
| expect(page).to_have_title() | ページにタイトルがある |
| expect(page).to_have_url() | ページにURLがある |
テストの分離
Playwright Pytestプラグインは、テストに渡される組み込みのページフィクスチャなどのテストフィクスチャの概念に基づいています。ページはブラウザコンテキストによってテスト間で分離されています。これは、まったく新しいブラウザプロファイルに相当し、単一のブラウザで複数のテストが実行される場合でも、すべてのテストが新しい環境を取得します。
from playwright.sync_api import Page
def test_example_test(page: Page):
pass
# "page" belongs to an isolated BrowserContext, created for this specific test.
def test_another_test(page: Page):
pass
# "page" in this second test is completely isolated from the first test.
フィクスチャの使用
様々なフィクスチャを使用して、テストの前後にコードを実行したり、オブジェクトをテスト間で共有したりできます。`autouse`付きの`function`スコープのフィクスチャは、`beforeEach`/`afterEach`のように動作します。また、`autouse`付きの`module`スコープのフィクスチャは、`beforeAll`/`afterAll`のように動作し、すべてのテストの前と後に実行されます。
import pytest
from playwright.sync_api import Page, expect
@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):
print("before the test runs")
# Go to the starting url before each test.
page.goto("https://playwright.dokyumento.jp/")
yield
print("after the test runs")
def test_main_navigation(page: Page):
# Assertions use the expect API.
expect(page).to_have_url("https://playwright.dokyumento.jp/")