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

認証

はじめに

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()メソッドを提供します。

Cookie、ローカルストレージ、および IndexedDB の状態は、異なるブラウザ間で使用できます。それらはアプリケーションの認証モデルに依存し、Cookie、ローカルストレージ、または 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 + "')");