SPAの入力画面は、HTMLを一度読み込んだ後も画面状態が非同期に変わります。要素が存在するだけで操作を進めると、別画面のボタンを押したり、表示前の候補を選んだりするおそれがあります。
画面上の操作経路を使う
日付や時刻を登録するとき、フレームワーク内部の状態を直接書き換えるより、日付セルなど画面上の要素を操作してモーダルを開く方が、画面とアプリ状態のずれを避けやすくなります。モーダルが開いた後に対象日を読み直し、意図した日付と一致することを確認してから入力します。
各段階は、要素を見つける、表示され操作可能か確認する、操作する、結果を画面から検証する、に分けます。固定時間のsleepだけに頼らず、候補リストに目的の値が現れるまで待ちます。選択後も入力欄や選択表示の値を確認します。
async function waitFor(test, timeoutMs = 5000) {
const end = Date.now() + timeoutMs;
while (Date.now() < end) {
const value = test();
if (value) return value;
await new Promise(resolve => setTimeout(resolve, 100));
}
throw new Error('画面の準備がタイムアウトしました');
}
失敗を局所化する
複数件を連続登録する場合、1件ごとの開始・完了・失敗を記録します。既知の一時エラーはその項目だけ再試行し、同じ失敗が続いたら全体を停止します。誤った画面状態で後続処理を続けるより、停止して状況を返す方が安全です。
バックグラウンドタブではタイマーが遅延することがあります。進捗が止まったように見える処理は、対象タブを前面にして再確認できる設計にします。
まとめ
SPA自動化では内部状態を推測せず、画面の遷移と表示値を確認しながら進めます。待機、検証、項目単位の失敗処理を分けることで、誤登録と原因不明の停止を減らせます。
