ハンドル無効エラーが表示される理由

このトピックでは、Silk4J に「このオブジェクトのハンドルは無効になりました。」というエラー メッセージが表示された場合の対処法について説明します。

このメッセージは、たとえば WaitForProperty などのメソッドを呼び出したオブジェクトが何らかの理由で消失していることを示しています。たとえば、Web アプリケーションでメソッドを呼び出しているときに、何らかの理由でブラウザが 新しいページに移動した場合、以前のページのすべてのオブジェクトは自動的に無効になります。

Web アプリケーションのテストでは、組み込みの同期がこの問題の原因の場合があります。たとえば、テスト対象のアプリケーションにショッピング カートが含まれていて、このショッピング カートに品物を追加したとします。ユーザーは次のページが読み込まれ、ショッピング カートのステータスが 品物がある 状態に変わるまで待機しています。品物を追加するという操作からの戻り時間が短すぎた場合、最初のページのショッピング カートはステータスが変わるまで待機しますが、その間も新しいページは読み込まれています。したがって、最初のページのショッピング カートは無効になります。この動作によって、ハンドル無効エラーが発生します。

この問題を回避するには、2 番目のページでのみ有効なオブジェクトが表示されるまで待機してから、ショッピング カートのステータスを確認するようにしてください。このオブジェクトが有効になるとすぐに、ショッピング カートのステータスを確認できるようになり、2 番目のページで正しく検証されるようになります。

すべてのアプリケーションに対するベスト プラクティスとして、テスト内でよく利用するコントロールを検索するためのメソッドを分離することを Micro Focus はお勧めします。例:
public Dialog getSaveAsDialog(Desktop desktop) {
 return desktop.find("//Dialog[@caption = 'Save As']");
}
Find および FindAll メソッドはそれぞれ一致したオブジェクトのハンドルを返し、そのハンドルは、アプリケーション内でオブジェクトが存在する間だけ有効です。たとえば、ダイアログへのハンドルは、ダイアログが一旦閉じられると無効になります。ダイアログを閉じたあとに、このハンドルに対してメソッドを実行すると、InvalidObjectHandleException がスローされます。同様に、Web ページ上の DOM オブジェクトのハンドルも、Web ページが再読み込みされると無効になります。テスト メソッド間の実行や、その順番の独立性を保ってデザインすることは共通のプラクティスであるため、それぞれのテスト メソッドでオブジェクトの新しいハンドルを取得するようにします。XPath クエリの重複を避けるため、getSaveAsDialog のようなヘルパ メソッドを作成します。例:
@Test
public void testSaveAsDialog() {
 // ... some code to open the 'Save As' dialog (e.g by clicking a menu item) ...
 Dialog saveAsDialog = getSaveAsDialog(desktop);
 saveAsDialog.close(); 
 // ... some code to open the 'Save As' dialog again
 getSaveAsDialog(desktop).click(); // works as expected
 saveAsDialog.click(); //  fails because an InvalidObjectHandleException is thrown
}
このコードの最後の行は、存在しないオブジェクトのハンドルを使用しているため、失敗します。