Unerwartete aktive Fenster handhaben

Ein häufig auftretendes Problem beim Testen grafischer Benutzeroberflächen ist die unerwartete Anzeige eines aktiven Fensters, beispielsweise einer Warnmeldung in einem HTML-Browser. Im vorliegenden Abschnitt finden Sie Informationen dazu, wie Sie sich in solchen Situationen verhalten müssen.

Angenommen, Sie haben das Klicken auf eine sichere Seite aufgezeichnet, werden beim Verwenden dieses Links aber auf eine nicht sichere Seite geleitet. In den Sicherheitseinstellungen Ihres Browsers ist für diesen Fall festgelegt, dass Sie in einem Nachrichtenfenster darüber informiert werden, dass es sich bei der nächsten Seite um eine ungeschützte Seite handelt. Sie klicken zunächst auf OK, um die Warnung wieder zu entfernen, und anschließend auf ein Markierungsfeld auf der nicht sicheren Seite. Das aufgezeichnete Functional Tester-Script hat dann ungefähr folgendes Aussehen:

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

Wenn Sie das Script dann für einen Browser mit einer anderen Sicherheitseinstellung abspielen möchten, findet keine Wiedergabe statt, da die Anweisung Dialog_HtmlDialogButtonOK() nicht gefunden werden kann. Sie können die Anweisung Dialog_HtmlDialogButtonOK().Click() zwar auf Kommentar setzen, doch wird es zu Störungen kommen, wenn der Dialog trotzdem angezeigt wird.

Eine Möglichkeit besteht darin, auf die Anzeige der Nachricht zu warten. Wenn diese nicht angezeigt wird, können Sie fortfahren. Diese Lösung lässt sich über folgenden Code umsetzen:

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

Mit diesem Code wird das wichtigste Ziel erreicht. Wenn die Warnung angezeigt wird, schließen Sie das Nachrichtenfenster. Wird die Nachricht nicht angezeigt, können Sie schließlich mit Ihrer Arbeit fortfahren. Möglicherweise möchten Sie jedoch nicht die gesamte standardmäßig festgelegte Zeitspanne auf die Anzeige der Warnung warten. Wenn Sie sicher sind, dass eine angezeigte Warnung innerhalb von fünf Sekunden erscheint, können Sie den Vorgang mit Hilfe des folgenden Codes beschleunigen:

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

Ein Nachteil dieses Ansatzes ist, dass Sie diesen speziellen Code immer dort hinzufügen müssen, wo durch einen Link in einem Browser Seiten gewechselt werden und dadurch eine Änderung der Sicherheitsstufe eintreten kann. Es wäre wesentlich effizienter, diese Situation generell zu handhaben, ohne zahllose Testscripts ändern zu müssen. Wenn Sie die Ausnahmebedingung OnObjectNotFound implementieren, können Sie das Ereignis bei jedem Auftreten handhaben. Wenn Sie die Implementierung über ein Helper-Superscript vornehmen, lässt sich das Ereignis damit in jedem Testscript handhaben, das über diese Helper-Superklasse hinausgeht.

Mit dem Code im folgenden Beispiel wird eine Basisklasse für Scripts zum Testen von HTML-Anwendungen implementiert. Diese Basisklasse implementiert die Anweisung OnObjectNotFound. Mit der Methode OnObjectNotFound werden alle HTML-Domänen auf HTML-Dialogfenster abgesucht. Alle HTML-Dialogfenster werden durch Drücken der Eingabetaste geschlossen. Wurden Dialogfenster geschlossen, wird die Methode TestObject erneut gestartet. Andernfalls hat diese Methode keine Auswirkungen, und die Anweisung ObjectNotFoundException wird wie gewöhnlich ausgelöst.

'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

Beachten Sie, dass die oben angegebene Implementierung von HtmlScript nur für das Testen von HTML geeignet ist. Wenn Sie diese Basisklasse für jedes beliebige Script inklusive der Scripts zum Testen von Java verwenden möchten, müssen Sie sich vor dem Entfernen von HTML-Dialogfenstern vergewissern, ob es sich bei TestObject um ein Functional Tester HTML-Objekt handelt. Dazu können Sie am Anfang der Methode OnObjectNotFound folgenden Code einfügen:

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

          Return
        End If

Feedback