予期しないアクティブ・ウィンドウの処理

GUI テストでの共通の問題は、予期しないアクティブ・ウィンドウが出現することです。 たとえば、HTML ブラウザー内に警告メッセージ・ボックスが出現することがあります。 このトピックでは、この問題の処理方法について説明します。

保護ページでのクリックを記録し、このリンクによって保護されていないページに移動する場合を考えてみます。ブラウザーのセキュリティー設定は、メッセージ・ボックスが表示されるように調整され、次のページは保護されていないことを警告するとします。「OK」をクリックすると警告メッセージは消え、その後未保護のページでチェック・ボックスをクリックします。記録される Functional Tester スクリプトは、以下のようになります。

linkThatLeavesSecurePage().click(); 
Dialog_HtmlDialogButtonOK().click(); 
CheckboxOnTheUnsecurePage().click(); 

異なるセキュリティー設定のブラウザー上でスクリプトを再生しようとすると、Dialog_HtmlDialogButtonOK() が見つからないのでスクリプトは再生しません。Dialog_HtmlDialogButtonOK().click(); ステートメントはコメントにして取り除くことができますが、ダイアログが実際に 表示される場合、失敗します。

1 つの解決策は、メッセージが表示されるまで待機することです。メッセージが表示されなければ、続行できます。この解決方法は下記のようなコードで記述できます。

linkThatLeavesSecurePage().click();
try 
{
    Dialog_HtmlDialogButtonOK().click();
}
catch(ObjectNotFoundException e) {} 
CheckboxOnTheUnsecurePage().click();

このコードは、主な目的を達成します。警告メッセージが表示されたら、手動でそれを消します。メッセージが表示されない場合、結局待機をやめ、続行することになります。しかし、警告メッセージが表示されるまでのデフォルトの時間を待機したくない場合があるかもしれません。警告メッセージが実際に表示される場合、5 秒以内に表示されることが確実であれば、以下のようにコーディングしてこの速度を速めることができます。

linkThatLeavesSecurePage().click();
try
{
    Dialog_HtmlDialogButtonOK().waitForExistence(5,1);
    Dialog_HtmlDialogButtonOK().click();
}
catch(ObjectNotFoundException e) {}
CheckboxOnTheUnsecurePage().click();

この方法に対して考えられる難点は、この特殊コードを、ブラウザー上のリンクがページを切り替え、セキュリティー上の変更が発生するすべての場所に加える必要があるということです。多数のテスト・スクリプトを変更しないで、共通の場所でこの状況を処理する方がより効率的です。onObjectNotFound 例外を実装することにより、このイベントの発生時に、いつでもそれを処理することができます。ヘルパー・スーパー・スクリプトにこの実装を入れることにより、このヘルパー・スーパー・クラスを拡張する Functional Tester のスクリプトに合わせてイベントを処理できます。

以下の例のコードは、HTML アプリケーションをテストするスクリプトの基本クラスを実装します。この基本クラスは、onObjectNotFound を実装します。onObjectNotFound メソッドは、すべての HTML ドメインを調べて、HTML ダイアログ・ボックスを探します。各 HTML ダイアログ・ボックスは、Enter を押せば消えます。いずれかのダイアログ・ボックスが消えると、TestObject メソッドが再開します。ダイアログ・ボックスが消されないと、メソッドは何も実行せず、ObjectNotFoundException が通常通りスローされます。

import com.rational.test.ft.script.*;
import com.rational.test.ft.object.interfaces.*;
/**
* This class provides some base capabilities for working
* with HTML.
*/
public abstract class HtmlScript extends RationalTestScript
{
/**
* Overrides the base implementation of onObjectNotFound. Whenever
* this event occurs, look through all the active domains (places
* where objects might be found). For HTML domains (Java
* and other domains are skipped) finds all the top objects.
* If the top object is an Html Dialog,
* types an Enter key to dismiss the dialog.
* Logs a warning when this happens.
*/
public void onObjectNotFound(ITestObjectMethodState testObjectMethodState)
{
   boolean dismissedAWindow = false;
   DomainTestObject domains[] = getDomains();
   for (int i = 0; i < domains.length; ++i)
   {
       if (domains[i].getName().equals("Html"))
       {
           // HTML domain is found.
           TestObject[] topObjects = domains[i].getTopObjects();
           if (topObjects != null)
           {
               try
               {
                   for (int j = 0; j < topObjects.length; ++j)
                   {
                       if (topObjects[j].getProperty(".class").equals("Html.Dialog"))
                       {
                           // A top-level HtmlDialog is found.
                           logWarning("HtmlScript.onObjectNotFound - dismissing dialog.");
                           try
                           {
                               dismissedAWindow = true;
                               ((TopLevelTestObject)topObjects[j]).inputKeys("{enter}");
                           }
                           catch(RuntimeException e) {}
                       }
                   }
               }
               finally
               {
                   //unregister all references to top objects
                   unregister(topObjects);
               }
           }
                       
       }
   }
   if (dismissedAWindow)
   {
       //  try again
       testObjectMethodState.findObjectAgain();
   }
   else
   {
       logWarning("HtmlScript.onObjectNotFound; no Html Dialog to dismiss");
   }
}
}

HtmlScript の上記の実装は、HTML のテストにのみ適していることに注意してください。この基本クラスを、Java™ をテストするスクリプトも含め、どんなスクリプトにも使用できるようにする必要があるかもしれません。この場合、HTML ダイアログ・ボックスを消す前に、TestObject が Functional Tester の HTMLobject であることを確認することが必要です。以下のコードを onObjectNotFound メソッドの先頭に追加できます。

if (!testObjectMethodState.getTestObject().
          getPropertyFromMap(IMapPropertyName.DOMAIN).equals("Html"))
{
    return;
}

フィードバック