scenario-runner系CLIで config の baseUrl が宣言的stepにしか自動適用されないケースの見分け方
宣言的なJSON stepsとスクリプト(TS/JS)の両方でシナリオを書けるブラウザ操作CLI(record/smoke的なツール)では、config側のbaseUrl解決がJSON stepsのgoto専用に実装され、スクリプトシナリオには自動適用されないことがある。
適用条件: ツールがJSON宣言({goto: "/path"}のような相対パス)とスクリプト(export default async (ctx) => {...})の二つの記法を許容する設計のとき、両者は別々のコード経路で実行される可能性が高い。JSON steps側はconfigのbaseUrlを読んでURL解決するランナーコードを通るが、スクリプト側は素のpage.goto(relativePath)を呼ぶだけで、baseUrl解決ロジックを経由しない。
症状: スクリプトシナリオ内で相対パスをそのままpage.goto('/')のように渡すと、"Cannot navigate to invalid URL"のようなエラーで即失敗する。JSON stepsの同等のgotoは正常に動くため、「configは効いているはずなのになぜかスクリプト側だけ失敗する」という誤診断をしやすい。
確認方法: スクリプト関数のシグネチャ(引数オブジェクト)にbaseUrl相当のフィールドが渡されているかをまず確認する(ドキュメントのAPI例か型定義を見る)。渡されていれば、それを明示的に使って絶対URLを組み立てる(page.goto(ctx.baseUrl)等)。渡されていなければ、そのツールのスクリプト記法はconfigのURL解決から独立している設計と判断し、URLを自前で解決するか別の値渡し手段を探す。
教訓: 宣言的記法と手続き的記法を両方サポートするツールでは、「configの共通設定が両方の記法に等しく効く」と仮定せず、記法ごとに実際どの値が渡ってくるかをAPI/型で確認してから使う。