manejo de ventanas activas no esperadas

Un problema frecuente de la prueba de interfaz gráfica de usuario es la aparición de una ventana activa no esperada, por ejemplo, un mensaje de aviso en un navegador HTML. Este tema explica cómo manejar estas situaciones.

Imagine que graba un enlace en una página segura y dicho enlace le conduce a una página que no es segura. Presupongamos también que la configuración de seguridad del navegador está definida para que aparezca un recuadro de mensaje que avise de que la siguiente página ya no será segura. Usted pulsa Aceptar para rechazar el mensaje de aviso y, a continuación, pulsa en un recuadro de selección de la página no segura. El script de Functional Tester grabado tendría un aspecto parecido al siguiente:

     LinkThatLeavesSecurePage().Click()
     Dialog_HtmlDialogButtonOK().Click() 
     CheckboxOnTheUnsecurePage().Click() 

Cuando reproduzca el script en un navegador con una configuración de seguridad distinta, el script no se reproducirá porque el Dialog_HtmlDialogButtonOK() no se podrá encontrar. Puede argumentar la sentencia Dialog_HtmlDialogButtonOK().Click(), pero se producirán anomalías cuando aparezca el diálogo.

Una solución consiste en esperar a que aparezca el mensaje. Si no aparece, puede continuar. La solución se puede lograr con el siguiente código:

     LinkThatLeavesSecurePage().Click()
     Try 
        Dialog_HtmlDialogButtonOK().Click()
     
     Catch E As ObjectNotFoundException 
     End Try
       CheckboxOnTheUnsecurePage().Click()

Este código lleva a cabo su objetivo principal. Si aparece el mensaje de aviso, lo rechaza. Si no aparece, puede parar de esperar y después continuar. No obstante, es posible que no desee esperar la cantidad de tiempo predeterminada para que aparezca el mensaje de aviso. Si está seguro de que el tiempo de espera para que aparezca el mensaje de aviso es de 5 segundos, puede acelerarlo con la siguiente codificación:

     LinkThatLeavesSecurePage().Click()
     Try
        Dialog_HtmlDialogButtonOK().WaitForExistence(5,1)
        Dialog_HtmlDialogButtonOK().Click()
     
     Catch E As ObjectNotFoundException
     End Try
        CheckboxOnTheUnsecurePage().Click()

Una objeción razonable a este método es que deberá añadir este código especial siempre que un enlace del navegador conmute páginas y pueda provocar un cambio en la seguridad. Resulta más eficiente manejar esta situación en un lugar común sin cambiar demasiados scripts de prueba. Si implementa la excepción OnObjectNotFound podrá manejar el suceso cada vez que se produzca. Si coloca la implementación en un superscript de ayudante podrá manejar el suceso para cualquier script de prueba que aplique esta superclase de ayudante.

El código del siguiente ejemplo implementa una clase base para scripts que prueban aplicaciones HTML. Esta clase base implementa OnObjectNotFound. El método OnObjectNotFound busca por todos los dominios HTML y busca todos los recuadros de diálogo HTML. Al pulsar la tecla Intro se rechaza cada recuadro de diálogo HTML. Cuando se rechaza algún recuadro de diálogo, el método TestObject se reinicia. Si no se rechaza ningún recuadro de diálogo, el método no hace nada y se lanza la ObjectNotFoundException como siempre.

'This class provides some base capabilities for working
'with HTML.

 Imports Rational.Test.Ft.Object_Interfaces
 Public MustInherit Class HtmlScript Inherits 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 Overrides Sub OnObjectNotFound(ByVal TestObjectMethodState As ITestObjectMethodState)

 Dim DismissedAWindow As Boolean = false
 Dim Domains() As DomainTestObject = GetDomains()
 Dim I As Integer
 For I = 0 To Domains.Length - 1
    If (Domains(I).GetName().Equals("Html")) Then


     ' HTML domain is found.
     Dim TopObjects As TestObject() = Domains(I).GetTopObjects()
      If (Not(TopObjects Is Nothing)) Then
        Try
           Dim J As Integer
           For J = 0 To TopObjects.Length - 1
               If (TopObjects(J).GetProperty(".class").Equals("Html.Dialog"))
                 Then
                 'A top-level HtmlDialog is found.
                 LogWarning("HtmlScript.OnObjectNotFound - dismissing dialog.")
                 Try
                   DismissedAWindow = true
                   Dim CastTopObject As TopLevelTestObject
                   CastTopObject.InputKeys("{ENTER}")
                 Catch E As System.Exception
                 End Try
               End If
             Next J
           Catch
             'Unregister all references to top objects
             Unregister(TopObjects)
           End Try
        End If
      End If
    Next I
    If DismissedAWindow = True Then
      ' Try again
      TestObjectMethodState.FindObjectAgain()
    Else
      LogWarning( _
       "HtmlScript.OnObjectNotFound; no HTML dialog to dismiss")
    End If
 End Sub
End Class

Tenga en cuenta que la implementación anterior de HtmlScript sólo resulta adecuada para probar HTML. Es posible que desee poder utilizar esta clase base para todos los scripts, incluyendo los scripts que prueban Java. En tal caso, debe asegurarse de que TestObject sea un objeto HTML de Functional Tester HTML antes de rechazar los recuadros de diálogo HTML. Puede añadir el código siguiente al principio del método OnObjectNotFound:

     If Not (TestObjectMethodState.GetTestObject() _
          GetPropertyFromMap(IMapPropertyName.DOMAIN).Equals("Html"))

          Return
       End If

Comentarios