state.json(Playwright)

公式ドキュメントは以下

playwright.dev

state.json

Playwrightにはstate.json(デフォルト名)というファイルを出力したり読み込んだりする機能があって、主な使い道はログイン回数の削減です

どういう仕組み?

cookieやローカルストレージの中身をjsonファイルとして出力し、それを再利用することで再ログイン状態を実現してます

ログイントークン再利用なんで、ログアウト操作やサーバー側でそれに準じる作業をして無効にされたら、state.jsonは役目を終えます

ログイントークンの再利用という挙動なので、一度作った認証を一生使うというよりテストスイートの先頭でログインし、その認証をスイート全体で使うのがよさそう

どうやって使うの

セーブロード

context.storageStateでセーブしてbrowserContextのnewContextで復元する

公式ドキュメントのパクリまんま置いときます。解説もそっちに譲ります

出典 https://playwright.dev/docs/auth#reuse-authentication-state

// Save storage state into the file.
await context.storageState({ path: 'state.json' });

// Create a new context with the saved storage state.
const context = await browser.newContext({ storageState: 'state.json' });

test(title,fixtures)で test('title',{page,browserName,context}) みたいな感じでブラウザ事前に生成されるんだけど?って場合はcontext引数を除けば生成されなくなるので、以下のように自分でコンテキスト作成するっぽい。本当にこれで会ってるのか不安ではある

test('title',async ({browser}) =>{
  var page = await broser.newContext({storageStage:'state.json'})
});

browserContextというかtest fixtuiresの詳細は以下

playwright.dev

cookieとlocalStorageが対象?

おそらく。主な目的がログイン状態の復元で、最近のはlocalStorageを使ってることもあるからっぽい

indexeddbとかは上の目的からすると多分復元してなさそう。 sessionStorageは明確に、addInitScriptでページ読み込み時のjavascript仕込めるなら、JSON.stringifyでセーブしてsessionStorage.setItemで復元すればってあります

出典 https://playwright.dev/docs/auth#session-storage

便利?

結構便利だとは思うけど、ブラウザのクリーンが行われてないだけじゃない?って感じがする
そもそも変なCookieとかのこってクリーンじゃない状態でテストしたくないから毎回ブラウザセッションを終了してるはずで、それを復元するならクリーンじゃなくない?と

とはいえ実際毎回ログインするし、ログイントークンを都度作ってもらうより復元した方が同一ユーザー的な観点でも妥当な気がする
state.jsonでどこまで復元するかという設計をした方がいいのかも

あとstate.json読むのにbefore~とか使うけど、いまいちこのコードが動作するタイミングがよくわからない
ブラウザが作られるときみたいな記述を見た気がするので、テストとテストの間で必ずしもブラウザはクローズされず、Cookieなどはクリーンなことが保証されないのかもしれない
要調査