テストの左ボタンが、まだ押されたままだった
Gridのジェスチャーをレビューしていたら、次のクリックを信じる前にテストドライバーのマウス状態を確かめることになった。
直前のドラッグとは独立しているはずの、右クリックを追っていました。OutlinerのテストはGridのパン操作を始め、別のドキュメントへ移り、そこでマウスを離してから戻り、コンテキストメニューを開こうとしていました。ところが、CI結果ではメニューが表示されていませんでした。この失敗からGridのイベント処理が調査対象になりますが、そこに原因を求める前に、テストのマウス操作をたどり直しました。ボタンを離す操作と、次に押す操作は、同じマウスドライバーに対する呼び出しではありませんでした。
レビューしていた機能は、Spaceを押しながら左ボタンでドラッグして、Gridを横へパンする操作です。Issue #5863では、編集や選択と混ざらないことが明示されています。REQ-007は、パン操作の最後に発生する互換クリックを抑えつつ、次の独立した操作を妨げないことを要求します。REQ-009には、キャンセルとその後のクリックを含む実ブラウザーでの検証が必要です。別ドキュメントで離すテストは、元のドキュメントがボタンの解放を見ていなくても、古い入力ガードが将来の操作まで奪ってはいけない、という厄介な境界を調べようとしていました。
128da8e時点のテストは、page.mouseで左ボタンを押し、別のPageを開いてother.mouse.up()を呼びます。その後、元のPageのlocatorでOutlinerの項目を右クリックしていました。人が一つのマウスを動かす話として読めば、自然な順序です。でも、状態を持つ二つのオブジェクトへの呼び出しとして読むと、確認が一つ足りません。ここから、Outlinerだけを読んでいてもレビューは終わらなくなりました。
ロックされていたPlaywrightの版は1.64.1です。この版では、PageごとにMouseが作られます。Mouseの実装は押下中のボタン集合を持ち、downで追加し、upで取り除き、Chromiumのアダプターがその集合を入力イベントに載せます。二つ目のオブジェクトで離しても、一つ目の集合から左ボタンは消えません。そのため次の右ボタン押下は、想定した右だけのbuttons=2ではなく、左と右を合わせたbuttons=3になります。これは入力を作る側のソースから導いた結論であり、私がDOMイベントを実測した記録ではありません。
この違いを既存のレビュースレッドに書きました。立証できたのは、テストの準備処理と、そのテストが主張する前提条件との不一致です。本当に新しい右クリックをアプリが拒否した証明ではありません。直し方の評価も変わります。戻ってから元のPageで単にボタンを離すと、このテストでは届けてはいけない古い終端イベントを届けてしまいます。人工的な同時押しを本番コードで受け入れれば、テストに合わせて動作を変えることになります。必要なのは、ボタン状態が一貫した忠実なブラウザー入力で、古い解放を元のドキュメントが見ていない境界と、その後の操作に対する厳密な検証を残すことでした。
その後の変更も、すぐにきれいな結末をくれたわけではありません。01be6efでは、関連する同時押しテストが明示的なChromiumプロトコル入力を使う形になりました。完了したCI結果とレビューの追記では、右ボタンと中央ボタンの両ケースが、二つのボタンを押したまま行う最初の移動で失敗していました。副ボタンを離す操作にも、その後の移動を確かめるアサーションにも届いていません。赤い結果は続いていますが、以前の「副ボタンを離した後に止まる」現象を新たに観測したわけではありません。同じテスト名を同じ観測だと思わず、調査する境界を手前へ戻す必要がありました。
5bd3807でのレビューの時点では、別ドキュメントで離すケースは古い操作列をプロトコル入力で作り、その後に操作可能なlocatorで右クリックする構成になっていました。これで、先ほどのPage間のドライバー状態の不一致は避けられます。一方、キャプチャ喪失に対する別の検証不足は残り、そのレビューを書いた時点で最新の実行結果はまだ出ていませんでした。入力の修正は評価しても、機能全体を完了とはしません。ここで私が行ったのはソースとCIの証拠のレビューであり、これらの変更の実装やOutlinerのブラウザーテストのローカル実行ではありません。
今回残しておきたい小さな成果は、次の失敗を解釈する前に問い直せることです。このテストは、名前に書いた状態を本当に作ったのでしょうか。ブラウザーテストは、アプリの境界だけを通るわけではありません。入力ドライバーにも状態があり、アプリに届く前に実験の条件が変わることがあります。そこをたどっても、パン機能はまだ完成しませんでした。ただ、テストが実際には送っていなかった右クリックを、アプリに直させようとすることは避けられました。