認証
概要
Playwright は、ブラウザコンテキストと呼ばれる隔離された環境でテストを実行します。この分離モデルは、再現性を向上させ、連鎖的なテストの失敗を防ぎます。テストは既存の認証済み状態をロードできます。これにより、すべてのテストで認証を行う必要がなくなり、テストの実行が高速化されます。
コアコンセプト
選択する認証戦略に関係なく、認証されたブラウザの状態をファイルシステムに保存することになるでしょう。
playwright/.auth
ディレクトリを作成し、それを .gitignore
に追加することをお勧めします。認証ルーチンは認証されたブラウザの状態を生成し、この playwright/.auth
ディレクトリ内のファイルに保存します。その後、テストはこの状態を再利用し、認証済みの状態で開始されます。
- Bash
- PowerShell
- Batch
mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore
New-Item -ItemType Directory -Force -Path playwright\.auth
Add-Content -path .gitignore "`r`nplaywright/.auth"
md playwright\.auth
echo. >> .gitignore
echo "playwright/.auth" >> .gitignore
各テストの前にサインインする
Playwright API は、ログインフォームとのインタラクションを自動化できます。
次の例は GitHub にログインします。これらのステップが実行されると、ブラウザコンテキストは認証されます。
- Sync
- Async
page = context.new_page()
page.goto('https://github.com/login')
# Interact with login form
page.get_by_label("Username or email address").fill("username")
page.get_by_label("Password").fill("password")
page.get_by_role("button", name="Sign in").click()
# Continue with the test
page = await context.new_page()
await page.goto('https://github.com/login')
# Interact with login form
await page.get_by_label("Username or email address").fill("username")
await page.get_by_label("Password").fill("password")
await page.get_by_role("button", name="Sign in").click()
# Continue with the test
すべてのテストでログインを繰り返すと、テストの実行速度が低下する可能性があります。それを軽減するには、代わりに既存の認証状態を再利用してください。
サインイン状態の再利用
Playwright は、テストでサインイン状態を再利用する方法を提供します。そうすることで、一度だけログインすれば、その後のすべてのテストでログインステップをスキップできます。
Web アプリケーションは、Cookie ベースまたはトークンベースの認証を使用しており、認証された状態は、Cookie、ローカルストレージ、または IndexedDB に保存されます。Playwright は、認証されたコンテキストからストレージ状態を取得し、事前設定された状態で新しいコンテキストを作成するために使用できる browser_context.storage_state() メソッドを提供します。
Cookie、ローカルストレージ、および IndexedDB の状態は、異なるブラウザ間で使用できます。これらは、Cookie、ローカルストレージ、または IndexedDB の組み合わせが必要となる可能性があるアプリケーションの認証モデルに依存します。
次のコードスニペットは、認証されたコンテキストから状態を取得し、その状態を持つ新しいコンテキストを作成します。
- Sync
- Async
# Save storage state into the file.
storage = context.storage_state(path="state.json")
# Create a new context with the saved storage state.
context = browser.new_context(storage_state="state.json")
# Save storage state into the file.
storage = await context.storage_state(path="state.json")
# Create a new context with the saved storage state.
context = await browser.new_context(storage_state="state.json")
高度なシナリオ
セッションストレージ
認証済み状態の再利用は、Cookie、ローカルストレージ、および IndexedDB ベースの認証をカバーします。まれに、セッションストレージ がサインイン状態に関連付けられた情報を保存するために使用されます。セッションストレージは特定のドメインに固有であり、ページロード間で永続化されません。Playwright はセッションストレージを永続化するための API を提供していませんが、次のスニペットを使用してセッションストレージを保存/ロードできます。
- Sync
- Async
import os
# Get session storage and store as env variable
session_storage = page.evaluate("() => JSON.stringify(sessionStorage)")
os.environ["SESSION_STORAGE"] = session_storage
# Set session storage in a new context
session_storage = os.environ["SESSION_STORAGE"]
context.add_init_script("""(storage => {
if (window.location.hostname === 'example.com') {
const entries = JSON.parse(storage)
for (const [key, value] of Object.entries(entries)) {
window.sessionStorage.setItem(key, value)
}
}
})('""" + session_storage + "')")
import os
# Get session storage and store as env variable
session_storage = await page.evaluate("() => JSON.stringify(sessionStorage)")
os.environ["SESSION_STORAGE"] = session_storage
# Set session storage in a new context
session_storage = os.environ["SESSION_STORAGE"]
await context.add_init_script("""(storage => {
if (window.location.hostname === 'example.com') {
const entries = JSON.parse(storage)
for (const [key, value] of Object.entries(entries)) {
window.sessionStorage.setItem(key, value)
}
}
})('""" + session_storage + "')")