處理非預期的作用中視窗

在 GUI 測試中,出現非預期的作用中視窗是一個常見的問題 -- 例如,HTML 瀏覽器中的警告訊息框。本主題說明如何處理這種問題。

想像您要在安全網頁上記錄按一下滑鼠的動作,且這個鏈結會切換至非安全的網頁。假設瀏覽器的安全設定已調整為會顯示訊息框,警告將進入非安全的網頁。您按一下確定來關閉警告訊息,然後在非安全網頁上按一下勾選框。記錄的 Functional Tester Script 如下:

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

當您在不同安全設定的瀏覽器上重播 Script 時, 因為找不到 Dialog_HtmlDialogButtonOK(),Script 不會重播。您可以註銷 Dialog_HtmlDialogButtonOK().click(); 陳述式,但真正出現對話框時將會失敗。

一種解決辦法是等待訊息出現。如果未出現,則可以繼續操作。這種辦法可以透過下列程式碼來達成:

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();

這種方式有一個不可避免的缺點,只要瀏覽器上的鏈結可能切換網頁,而導致安全性改變,您就必須加入這段特殊的程式碼。在共同位置上處理這種狀況,不要變更太多測試 Script,比較有效率。您可以實作 onObjectNotFound 異常狀況來處理發生的事件。將此實作放入 Helper Super Script 中,就可以處理延伸此 Helper 超類別的任何 Functional Tester Script 的事件。

下列程式碼範例針對測試 HTML 應用程式的 Script 來實作基礎類別。這個基礎類別實作 onObjectNotFoundonObjectNotFound 方法會瀏覽所有 HTML 網域來尋找任何 HTML 對話框。每一個 HTML 對話框都是按 Enter 鍵來關閉。關閉任何對話框時會重新啟動 TestObject 方法。如果未關閉對話框,則此方法沒有作用,照常會擲出 ObjectNotFoundException

import com.rational.test.ft.script.*; 
import com.rational.test.ft.object.interfaces.*; 
/**
* 這個類別提供一些處理 HTML 的
* 基本功能。*/
public abstract class HtmlScript extends RationalTestScript
{
/**
* 置換 onObjectNotFound 的基本實作。每當
* 發生這個事件時,就會瀏覽所有作用中網域
*(可能發現物件的地方)。若為 HTML 網域(跳過 Java
* 及其他網域),則尋找所有最上層物件。* 如果最上層物件是 Html Dialog,
* 則按一下 Enter 鍵來關閉對話框。* 發生此情況時會記載警告。*/
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 網域。           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"))
                       {
                           // 找到最上層 HtmlDialog。                           logWarning("HtmlScript.onObjectNotFound - dismissing dialog.");
                           try
                           {
                               dismissedAWindow = true;
                               ((TopLevelTestObject)topObjects[j]).inputKeys("{enter}");
                           }
                           catch(RuntimeException e) {}
                       }
                   }
               }
               finally
               {
                   //取消登錄最上層物件的所有參照
                   unregister(topObjects);
               }
           }
                       
       }
   }
   if (dismissedAWindow)
   {
       //  重試
       testObjectMethodState.findObjectAgain();
   }
   else 
   {
       logWarning("HtmlScript.onObjectNotFound; no Html Dialog to dismiss");
   }
}
}

請注意,上述的 HtmlScript 實作僅適用於測試 HTML。您可能想要在任何 Script 中使用這個基礎類別,包括測試 Java™ 的 Script。在此情況下,您必須在關閉 HTML 對話框之前確定 TestObject 是 Functional Tester HTMLobject。您可以在 onObjectNotFound 方法的開頭加入下列程式碼:

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


意見
(C) Copyright IBM Corporation 2000, 2007. All Rights Reserved.