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

認証

はじめに

Playwrightは、ブラウザコンテキストと呼ばれる分離された環境でテストを実行します。この分離モデルは再現性を向上させ、連鎖的なテスト失敗を防ぎます。テストは既存の認証済み状態を読み込むことができます。これにより、すべてのテストで認証する必要がなくなり、テストの実行が高速化されます。

コアコンセプト

選択する認証戦略に関係なく、認証済みブラウザの状態をファイルシステムに保存することがほとんどです。

playwright/.auth ディレクトリを作成し、それを .gitignore に追加することをお勧めします。認証ルーチンは認証済みブラウザの状態を生成し、この playwright/.auth ディレクトリ内のファイルに保存します。その後、テストはこの状態を再利用し、既に認証された状態で開始します。

危険

ブラウザの状態ファイルには、あなたやテストアカウントになりすますために使用される可能性のある機密性の高いクッキーやヘッダーが含まれる場合があります。これらをプライベートリポジトリや公開リポジトリにチェックインすることは強く推奨されません。

mkdir -p playwright/.auth
echo $'\nplaywright/.auth' >> .gitignore

各テストの前にサインインする

Playwright APIはログインフォームとの対話を自動化できます。

以下の例はGitHubにログインします。これらの手順が実行されると、ブラウザコンテキストは認証された状態になります。

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

すべてのテストでログインをやり直すと、テストの実行が遅くなる可能性があります。これを軽減するには、代わりに既存の認証状態を再利用してください。

サインイン済み状態の再利用

Playwrightは、テストでサインイン済み状態を再利用する方法を提供します。これにより、一度ログインするだけで、すべてのテストでログイン手順をスキップできます。

Webアプリはクッキーベースまたはトークンベースの認証を使用しており、認証済み状態はクッキーローカルストレージ、またはIndexedDBに保存されます。Playwrightはbrowser_context.storage_state()メソッドを提供しており、これを使用して認証済みコンテキストからストレージ状態を取得し、その事前入力された状態を持つ新しいコンテキストを作成できます。

クッキー、ローカルストレージ、IndexedDBの状態は、異なるブラウザ間で利用できます。これらは、クッキー、ローカルストレージ、またはIndexedDBのいずれかの組み合わせが必要となる、アプリケーションの認証モデルに依存します。

以下のコードスニペットは、認証済みコンテキストから状態を取得し、その状態を持つ新しいコンテキストを作成します。

# 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")

高度なシナリオ

セッションストレージ

認証済み状態の再利用は、クッキーローカルストレージ、およびIndexedDBベースの認証をカバーしています。まれに、セッションストレージがサインイン状態に関連する情報の保存に使用されます。セッションストレージは特定のドメインに固有であり、ページロード間で永続化されません。Playwrightはセッションストレージを永続化するAPIを提供していませんが、以下のスニペットを使用してセッションストレージを保存/ロードできます。

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 + "')")