Ein häufig auftretendes Problem bei GUI-Tests ist die Anzeige eines unerwarteten aktiven Fensters, z. B. eines Nachrichtenfensters mit einer Warnung in einem HTML-Browser. Nehmen wir einmal an, dass Sie einen Mausklick auf einer sicheren Seite aufzeichnen und diese Verknüpfung Sie zu einer nicht sicheren Seite führt. Nehmen wir weiter an, dass die Sicherheitseinstellung Ihres Browsers so festgelegt ist, dass ein Nachrichtenfenster angezeigt wird, in dem Sie gewarnt werden, dass die folgende Seite nicht sicher ist. Sie klicken auf OK, um das Fenster mit der Warnung zu schließen, und klicken Sie anschließend auf ein Markierungsfeld auf der nicht sicheren Seite. Das aufgezeichnete Functional Test-Script würde in etwa wie folgt aussehen:
linkThatLeavesSecurePage().click(); Dialog_HtmlDialogButtonOK().click(); CheckboxOnTheUnsecurePage().click();
Wenn Sie das Script in einem Browser wiedergeben, der eine andere Sicherheitseinstellung aufweist, erfolgt keine Wiedergabe des Scripts, da Dialog_HtmlDialogButtonOK()
nicht gefunden werden kann.
Sie können die Anweisung Dialog_HtmlDialogButtonOK().click();
in Kommentarzeichen setzen, allerdings treten dann Fehler auf, wenn das Dialogfenster doch angezeigt wird.
Eine Möglichkeit besteht darin, auf die Anzeige der Nachricht zu warten. Wenn sie nicht angezeigt wird, können Sie fortfahren. Die Lösung kann mit folgendem Code umgesetzt werden:
linkThatLeavesSecurePage().click(); try { Dialog_HtmlDialogButtonOK().click(); } catch(ObjectNotFoundException e) {} CheckboxOnTheUnsecurePage().click();
Mit diesem Code wird das wichtigste Ziel erreicht. Wenn die Warnung angezeigt wird, schließen Sie das Nachrichtenfenster. Wenn sie nicht angezeigt wird, warten Sie und fahren dann fort. Allerdings möchten Sie möglicherweise nicht die Standardzeit verwenden, über die auf die Anzeige der Warnung gewartet wird. Wenn Sie sicher sind, dass die Warnung (wenn sie angezeigt wird) innerhalb von fünf Sekunden erscheint, können Sie den Vorgang durch folgende Codierung beschleunigen:
linkThatLeavesSecurePage().click(); try { Dialog_HtmlDialogButtonOK().waitForExistence(5,1); Dialog_HtmlDialogButtonOK().click(); } catch(ObjectNotFoundException e) {} CheckboxOnTheUnsecurePage().click();
Ein Nachteil dieses Ansatzes ist, dass Sie diesen speziellen Code immer dort hinzufügen müssen, wo durch eine Verknüpfung in einem Browser Seiten gewechselt werden und dadurch eine Änderung der Sicherheit auftreten kann.
Es wäre wesentlich effizienter, diese Situation generell zu handhaben, ohne viele Testscripts zu ändern.
Durch Implementierung der Ausnahmebedingung onObjectNotFound
können Sie das Ereignis bei jedem Vorkommen handhaben.
Indem Sie die Implementierung in ein Helper-Superscript einfügen, können Sie das Ereignis für jedes Functional Test-Script handhaben, dass diese Helper-Superklasse erweitert.
Mit dem Code im folgenden Beispiel wird eine Basisklasse für Scripts zum Testen von HTML-Anwendungen implementiert.
Diese Basisklasse implementiert onObjectNotFound
.
Mit der Methode onObjectNotFound
werden alle HTML-Domänen nach HTML-Dialogfenstern durchsucht.
Jedes HTML-Dialogfenster wird durch Drücken der Eingabetaste geschlossen. Wenn Dialogfenster geschlossen werden, wird die Methode TestObject
erneut gestartet.
Wenn keine Dialogfenster geschlossen werden, führt die Methode keine Aktion aus, und ObjectNotFoundException
wird wie üblich ausgegeben.
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"); } } }
Beachten Sie, dass die oben angegebene Implementierung von HtmlScript
nur für das Testen von HTML geeignet ist.
Möglicherweise möchten Sie diese Basisklasse für alle Scripts verwenden, einschließlich Scripts für das Testen von Java.
In diesem Fall müssen Sie sicherstellen, dass es sich bei TestObject
um ein HTMLobject
von Functional Test handelt, bevor Sie die HTML-Dialogfenster schließen.
Sie können den folgenden Code am Anfang der Methode onObjectNotFound
hinzufügen:
if
(!testObjectMethodState.getTestObject(). getPropertyFromMap
(IMapPropertyName.DOMAIN).equals("Html"))
{
return;
}
Nutzungsbedingungen | Feedback
(C) Copyright IBM Corporation 2002, 2004. Alle Rechte vorbehalten.