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

認証

はじめに

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

主要な概念

選択した認証戦略にかかわらず、認証済みのブラウザ状態をファイルシステムに保存することが一般的です。

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

危険

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

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

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

Playwright APIはログインフォームとのインタラクションを自動化できます。

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

Page page = context.newPage();
page.navigate("https://github.com/login");
// Interact with login form
page.getByLabel("Username or email address").fill("username");
page.getByLabel("Password").fill("password");
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in"))
.click();
// Continue with the test

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

サインイン状態の再利用

Playwrightは、テストでサインイン状態を再利用する方法を提供します。そうすることで、一度ログインするだけで、すべてのテストでログインステップをスキップできます。

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

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

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

// Save storage state into the file.
context.storageState(new BrowserContext.StorageStateOptions().setPath(Paths.get("state.json")));

// Create a new context with the saved storage state.
BrowserContext context = browser.newContext(
new Browser.NewContextOptions().setStorageStatePath(Paths.get("state.json")));

高度なシナリオ

セッションストレージ

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

// Get session storage and store as env variable
String sessionStorage = (String) page.evaluate("JSON.stringify(sessionStorage)");
System.getenv().put("SESSION_STORAGE", sessionStorage);

// Set session storage in a new context
String sessionStorage = System.getenv("SESSION_STORAGE");
context.addInitScript("(storage => {\n" +
" if (window.location.hostname === 'example.com') {\n" +
" const entries = JSON.parse(storage);\n" +
" for (const [key, value] of Object.entries(entries)) {\n" +
" window.sessionStorage.setItem(key, value);\n" +
" };\n" +
" }\n" +
"})('" + sessionStorage + "')");