Gestione di finestre attive non previste

Un problema comune nell'esecuzione dei test GUI è la visualizzazione di una finestra attiva non prevista -- ad esempio, una casella di un messaggio di avviso in un browser HTML. Questa sezione descrive come gestire questo problema.

Si immagini di registrare una selezione su una pagina protetta e che questo collegamento conduca ad una pagina non protetta. Si presuma che l'impostazione di sicurezza del browser sia regolata in modo da consentire la visualizzazione di una casella di messaggio che avvisi che la pagina successiva non è protetta. Fare clic su OK per chiudere il messaggio di avviso quindi fare clic su una casella di controllo nella pagina non protetta. Lo script di Functional Tester registrato sarà visualizzato nel modo seguente:

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

Quando lo script viene riprodotto per un browser con un'impostazione di sicurezza diversa, l'operazione non riesce poiché è impossibile trovare Dialog_HtmlDialogButtonOK(). È possibile impostare come commento l'istruzione Dialog_HtmlDialogButtonOK().click();, ma si verificheranno dei malfunzionamenti quando viene visualizzata la finestra di dialogo does.

Una soluzione possibile è quella di attendere la visualizzazione del messaggio. Se non viene visualizzato, è possibile continuare. La soluzione potrebbe essere nel codice seguente:

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

Questo codice consente di raggiungere il primo obiettivo. Chiudere il messaggio di avviso, se viene visualizzato. Se non viene visualizzato, non prolungare l'attesa e riprendere le operazioni. Tuttavia, si potrebbe non desiderare di attendere il periodo di tempo predefinito per la visualizzazione del messaggio di avviso. Se si è certi che il messaggio di avviso verrà visualizzato in 5 secondi, è possibile rendere questa operazione più rapida utilizzando il codice seguente:

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

Un'obiezione ragionevole a questo approccio è che sarebbe necessario aggiungere questo codice speciale dovunque un collegamento su un browser potrebbe cambiare pagina e provocare una modifica nella sicurezza. Sarebbe più efficiente gestire questa situazione in una ubicazione comune senza modificare molti script di test. Implementando l'eccezione onObjectNotFound è possibile gestire l'evento in qualsiasi momento si verifichi. Inserendo l'implementazione in uno script super helper, è possibile gestire l'evento per qualsiasi script di Functional Tester che estenda tale classe.

Il codice nell'esempio seguente implementa una classe di base per gli script che eseguono il test delle applicazioni HTML. Questa classe di base implementa onObjectNotFound. Il metodo onObjectNotFound cerca attraverso tutti i domini HTML le caselle di dialogo HTML. Ogni finestra di dialogo HTML viene chiusa premendo Invio. Se qualche finestra di dialogo viene chiusa, il metodo TestObject viene riavviato. Se non viene chiusa alcuna finestra di dialogo, il metodo non interviene e l'eccezione ObjectNotFoundException viene generata normalmente.

import com.rational.test.ft.script.*;
import com.rational.test.ft.object.interfaces.*;
/**
* Questa classe fornisce alcune capacità di base per lavorare
* con HTML.
*/
public abstract class HtmlScript extends RationalTestScript
{
/**
* Sostituisce l'implementazione di base di onObjectNotFound. Quando
* si verifica quest'evento, controllare in tutti i domini attivi (posti
* dove è possibile trovare oggetti). Per i domini HTML (Java
* e altri domini vengono tralasciati) trova tutti gli oggetti di livello superiore.
* Se l'oggetto di livello superiore è una finestra di dialogo Html,
* inserisce un tasto Invio per chiudere la finestra di dialogo.
* Registra un'avvertenza quando questo si verifica.
*/
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"))
       {
           // dominio HTML trovato.
           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"))
                       {
                           // finestra di dialogo HTML di livello superiore trovata.
                           logWarning("HtmlScript.onObjectNotFound - dismissing dialog.");
                           try
                           {
                               dismissedAWindow = true;
                               ((TopLevelTestObject)topObjects[j]).inputKeys("{enter}");
                           }
                           catch(RuntimeException e) {}
                       }
                   }
               }
               finally
               {
                   //annullare la registrazione di tutti i riferimenti agli oggetti di livello superiore
                   unregister(topObjects);
               }
           }
                       
       }
   }
   if (dismissedAWindow)
   {
       //  riprovare
       testObjectMethodState.findObjectAgain();
   }
   else
   {
       logWarning("HtmlScript.onObjectNotFound; nessuna finestra HTML da chiudere");
   }
}
}

Si noti che l'implementazione sopra descritta di HtmlScript è adatta solo per eseguire il test HTML. Si potrebbe desiderare di utilizzare questa classe di base per tutti gli script, inclusi gli script utilizzati per eseguire il test Java. In questo caso, è necessario accertarsi che TestObject sia un HTMLobject di Functional Tester prima di chiudere le caselle di dialogo HTML. È possibile aggiungere il codice seguente all'inizio del metodo onObjectNotFound:

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

Feedback