ウィンドウ選択の困難性
テストケースを記録する際、ウィンドウ管理が問題になることがよくあります。テストケースはポップアップを開いたり、target=_blank
リンクに従ったりする場合があります。それにもかかわらず、Selenium IDEはウィンドウとタブの切り替えを記録し、記録後に手動で修正する必要がないようにすることを期待されています。
しかし、ここに問題があります。**ウィンドウの選択は状態を保持する**のです。
Select Window の進化
ウィンドウの選択は、レガシーIDE(別名selectWindow)で最初に導入されました。当時も、ウィンドウはタイトル、URLなどの定義プロパティに基づいて追跡できないことが知られていました。
代わりに、各ウィンドウに一時的なIDを生成し、ユーザーが手動で介入して各ウィンドウに永続的なIDを付ける必要がありました。これは、IDEが_blank
ターゲットをオーバーライドし、代わりにwindow.open
への呼び出しをリダイレクトしたため可能でした。
その後、SideeXが登場しました。彼らのソリューションはより直感的でしたが、短期的でした。browser.webNavigation.onCreatedNavigationTarget
を利用するというアイデアでした。このイベントにより、IDEは新しいタブまたはウィンドウが開かれたときとその作成原因を認識できます。これにより、開いているタブのツリーを簡単にマッピングし、出現順序に基づいてすべてのタブにIDを付けることができます。
このように、ユーザーは、バックグラウンドで何が実行されているかをあまり考えずに、必要なウィンドウを自然に選択できます。
どちらのソリューションにも欠点があります。レガシーソリューションでは、ユーザーは常に開いているタブの状態を知っており、同じウィンドウを呼び出すたびに同じIDを付ける必要がありました。
一方、SideeXはIDEへの将来の追加機能を考慮していませんでした。現在、制御フローコマンドを使用しているため、記録中にウィンドウが開かれていても開かれない場合や、さらに悪いことに、ループでウィンドウが開かれる場合があり、追跡メカニズムがさらに複雑になります。
仲介者ソリューション
この時点で、2つのことがわかります。
- ユーザーにウィンドウレイアウトを手動で把握させることはできません。
- プロパティでもインデックスでも、ウィンドウを識別するためにウィンドウに依存することはできません。
代わりに、**仲介者ソリューション**を使用します。ユーザーがウィンドウに名前を付ける必要があり、記録後すぐにウィンドウを確実に追跡できるため、このように呼びます。
ウィンドウが開かれたことに気付いた場合、出現順序に基づいてIDを生成する代わりに、そのハンドルはユーザーが名前を付ける変数に保存されます。
この時点から、インデックスではなくIDでウィンドウを確実に参照できます。
click
コマンドは、新しいウィンドウが開かれることを指定できるようになりました。ユーザーはウィンドウに名前を付け、そのウィンドウが表示されるのを待つタイムアウトを設定できます。
記録中、IDEは2秒間待つと想定し、ウィンドウに名前を生成します。
リリース計画
新しいバージョンのIDEでIDEプロジェクトを開くと、テストスクリプトが新しいselect window
コマンドを使用するように自動的に移行されます。
移行では、新しいウィンドウが開かれた場合を認識しようと試み、そのコマンドをウィンドウを開くとして設定し、ハンドル名とタイムアウトを2秒に設定します。
IDEがどのコマンドがウィンドウの開く動作を開始したかを認識できない場合、テストケースは失敗し、ユーザーは移行を修正する必要があります。
さらに、IDEは、ユーザーが初期ウィンドウとの間で前後に切り替えるテストケースで、新しいstore current window handle
コマンドを使用して初期ウィンドウのハンドルを保存します。
現在の計画では、WebDriverを使用した再生の準備として、3.5リリースの一部として変更を適用することです。
編集にご協力いただいた@tourdedaveに特別な感謝を申し上げます。