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

認証

はじめに

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

コアコンセプト

選択する認証戦略に関係なく、認証されたブラウザの状態をファイルシステムに保存する可能性が高くなります。

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

mkdir -p playwright/.auth
echo $'\nplaywright/.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 は、テストでサインイン状態を再利用する方法を提供します。そうすることで、一度だけログインし、その後のすべてのテストでログインステップをスキップできます。

Web アプリは、クッキーベースまたはトークンベースの認証を使用しており、認証された状態は、クッキーローカルストレージ、または 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 + "')");