Manipulação de Janelas Ativas Inesperadas

Um problema comum no Teste da GUI é a aparência de uma janela ativa inesperada -- por exemplo, uma caixa de mensagem de aviso em um navegador HTML. Imagine que você grave um clique em uma página segura e que esse link o leve para uma página que não é segura. Suponha que a configuração de segurança do navegador esteja ajustada para que apareça uma caixa de mensagem avisando que a página seguinte não será segura. Você clica em OK para descartar a mensagem de aviso e, em seguida, clica em uma caixa de opções na página não segura. O script gravado do Teste Funcional seria semelhante ao seguinte:

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

Quando você reproduz o script em um navegador com uma configuração de segurança diferente, o script não é reproduzido porque o Dialog_HtmlDialogButtonOK() não pode ser localizado. É possível colocar a instrução Dialog_HtmlDialogButtonOK().Click() como comentário, mas haverá falhas quando o diálogo realmente for exibido.

Uma solução é aguardar que a mensagem apareça. Se não aparecer, você pode continuar. A solução é possível com o seguinte código:

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

Esse código realiza seu objetivo principal. Se a mensagem de aviso aparecer, descarte-a. Se não aparecer, pare de aguardar e então continue. Entretanto, é provável que você não queira aguardar o período de tempo padrão pela exibição da mensagem de aviso. Se tiver certeza que, quando a mensagem de aviso for exibida ela chegará em 5 segundos, poderá acelerar esse tempo codificando da seguinte forma:

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

Uma objeção aceitável para essa abordagem é que esse código especial precisará ser incluído onde quer que um link em um navegador possa alternar páginas e causar alteração na segurança. A manipulação dessa situação em um lugar comum sem alterar muitos scripts de teste seria mais eficiente. A implementação da exceção OnObjectNotFound permite manipular o evento sempre que ocorrer. A colocação da implementação em um superscript auxiliar permite manipular o evento para qualquer script de teste que estender essa superclasse auxiliar.

O código no exemplo a seguir implementa uma classe base para scripts que testam aplicativos HTML. Essa classe base implementa OnObjectNotFound. O método OnObjectNotFound examina todos os domínios HTML e procura todas as caixas de diálogo HTML. Cada caixa é descartada pressionando-se Enter. Se alguma delas for descartada, o método TestObject será reiniciado. Se nenhuma for descartada, o método não agirá e a exceção ObjectNotFoundException será lançada normalmente.

'Essa classe fornece alguns recursos básicos para trabalhar
'com HTML.


 Imports Rational.Test.Ft.Object_Interfaces  Public MustInherit Class HtmlScript Inherits RationalTestScript
 ' Substitui a implementação base de OnObjectNotFound. Sempre  ' que esse evento ocorrer, examine todos os domínios ativos (locais  ' em que os objetos podem ser localizados). Para domínios HTML (Java  ' e outros domínios são ignorados) localiza todos os objetos superiores.  ' Se o objeto superior for um Html Dialog,  ' digita uma tecla Enter para descartar o diálogo.  ' Registra um aviso quando isso acontece.
 
 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
     ' O domínio HTML foi localizado.      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               'Um HtmlDialog de nível superior foi localizado.               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           'Cancelar o registro de todas as referências a objetos superiores           Unregister(TopObjects)         End Try      End If    End If  Next I  If DismissedAWindow = True Then    ' Tente novamente    TestObjectMethodState.FindObjectAgain()  Else    LogWarning( _     "HtmlScript.OnObjectNotFound; no HTML dialog to dismiss")  End If End Sub End Class

Observe que a implementação anterior de HtmlScript serve apenas para teste de HTML. Talvez você queira utilizar essa classe-base para qualquer script, incluindo scripts que testem Java. Nesse caso, é necessário certificar-se de que TestObject seja um objeto HTML do Functional Test antes de descartar as caixas de diálogo HTML. Você pode incluir o seguinte código no início do método OnObjectNotFound:

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


       Return      End If

Termos de uso | Feedback
(C) Copyright IBM Corporation 2002, 2004. Todos os Direitos Reservados.