認証
はじめに
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にログインします。これらのステップが実行されると、ブラウザコンテキストは認証されます。
var page = await context.NewPageAsync();
await page.GotoAsync("https://github.com/login");
// Interact with login form
await page.GetByLabel("Username or email address").FillAsync("username");
await page.GetByLabel("Password").FillAsync("password");
await page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }).ClickAsync();
// Continue with the test
すべてのテストでログインをやり直すと、テストの実行が遅くなる可能性があります。これを軽減するには、既存の認証状態を再利用してください。
サインイン状態の再利用
Playwright は、テストでサインイン状態を再利用する方法を提供します。これにより、一度ログインするだけで、すべてのテストでログインステップをスキップできます。
ウェブアプリは、認証された状態がクッキー、ローカルストレージ、またはIndexedDBに保存されるクッキーベースまたはトークンベースの認証を使用します。Playwright は、認証されたコンテキストからストレージ状態を取得し、その状態であらかじめ設定された新しいコンテキストを作成するために使用できるBrowserContext.StorageStateAsync()
メソッドを提供します。
クッキー、ローカルストレージ、およびIndexedDBの状態は、異なるブラウザ間で再利用できます。これらは、クッキー、ローカルストレージ、またはIndexedDBの組み合わせを必要とする可能性のあるアプリケーションの認証モデルに依存します。
以下のコードスニペットは、認証されたコンテキストから状態を取得し、その状態を持つ新しいコンテキストを作成します。
// Save storage state into the file.
// Tests are executed in <TestProject>\bin\Debug\netX.0\ therefore relative path is used to reference playwright/.auth created in project root
await context.StorageStateAsync(new()
{
Path = "../../../playwright/.auth/state.json"
});
// Create a new context with the saved storage state.
var context = await browser.NewContextAsync(new()
{
StorageStatePath = "../../../playwright/.auth/state.json"
});
高度なシナリオ
セッションストレージ
認証状態の再利用は、クッキー、ローカルストレージ、およびIndexedDBベースの認証をカバーします。まれに、サインイン状態に関連する情報を保存するためにセッションストレージが使用されることがあります。セッションストレージは特定のドメインに固有であり、ページロード間で永続化されません。Playwright はセッションストレージを永続化するAPIを提供していませんが、以下のスニペットを使用してセッションストレージを保存/ロードできます。
// Get session storage and store as env variable
var sessionStorage = await page.EvaluateAsync<string>("() => JSON.stringify(sessionStorage)");
Environment.SetEnvironmentVariable("SESSION_STORAGE", sessionStorage);
// Set session storage in a new context
var loadedSessionStorage = Environment.GetEnvironmentVariable("SESSION_STORAGE");
await context.AddInitScriptAsync(@"(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);
}
}
})('" + loadedSessionStorage + "')");