예기치 않은 활성 창

GUI 테스트의 일반적인 문제점은 예기치 않은 활성 창(예: HTML 브라우저의 경고 메시지 상자)이 나타나는 것입니다. 이 주제는 이러한 문제점을 핸들링하는 방법을 설명합니다.

보안 페이지에서의 클릭을 레코드하고 이 링크가 안전하지 않은 페이지에 연결되어 있다고 생각해봅시다. 브라우저의 보안 설정을 조정하여 다음 페이지가 안전하지 않음을 경고하는 메시지 상자가 표시되게 한다고 가정합시다. 확인을 클릭하여 경고 메시지를 사라지게 한 후 안전하지 않은 페이지의 선택란을 클릭하십시오. 레코드된 Functional Tester 스크립트는 다음과 유사하게 표시됩니다.

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

다른 보안 설정을 가진 브라우저에 대해 스크립트를 재생하면 Dialog_HtmlDialogButtonOK()를 찾을 수 없기 때문에 스크립트가 재생되지 않습니다. Dialog_HtmlDialogButtonOK().click(); 명령문을 주석 처리할 수 있지만 대화 상자가 표시 때 장애가 발생합니다.

한 가지 솔루션은 메시지가 표시되기를 기다리는 것입니다. 표시되지 않으면 계속할 수 있습니다. 다음과 같은 코드로 솔루션을 얻을 수 있습니다.

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

이 코드는 1차적인 목표를 달성합니다. 경고 메시지가 나타나면 닫으십시오. 나타나지 않으면 기다리는 것을 멈추고 계속하십시오. 그러나 경고 메시지가 표시되는 기본 시간을 기다리고 싶지 않을 수도 있습니다. 경고 메시지가 표시되는 데 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;
}

피드백