Playwright の複数 addInitScript は評価順が未定義。順序依存なら単一 script に統合する
Playwright の context.addInitScript() を複数回呼び出してページ内に複数のスクリプトを注入するとき、await は「登録が完了したこと」しか保証しない。各スクリプトが実際にブラウザ側で評価される順番は仕様上保証されていない。
誤解しやすい条件
「await context.addInitScript(A); await context.addInitScript(B); と順番に await して登録しているのだから、ブラウザ側でも A → B の順で実行されるはず」という直感は成り立たない。await はホスト側の登録 API 呼び出しの完了を待つだけで、登録された複数の init script がページ生成時にどの順で実行されるかは別問題。パターンとしては、ある script が別の script が定義するヘルパー関数・グローバル変数に依存していると、登録順=実行順と信じた場合に、依存先がまだ定義されていない状態で実行されて例外になることがある。
対策
順序依存がある複数の注入コードは、別々の addInitScript 呼び出しに分けず、単一の script 文字列に連結して1回だけ登録する。同一 script 内の逆次実行は、JavaScript の文法上保証される順序であり、ベンダの登録順に依存しない。関数を文字列化(fn.toString())してテンプレートリテラルで連結し、後ろで呼び出す形にすれば、依存元ヘルパーの定義→依存先の実行を確実に順序化できる。
検証
順序依存を持つ複数 script をあえて別々の addInitScript 呼び出しに分けて登録し、依存先が未定義のまま実行されて例外になることがあるかを確認する。単一 script に統合した後は、何度実行しても依存先が先に定義されていることを確認する。