Angenommen, Sie haben das Klicken auf eine sichere Seite aufgezeichnet, werden beim Verwenden dieses Links aber auf eine nicht sichere Seite geleitet. 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 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 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 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(ObjectNotFoundException e) {} 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(ObjectNotFoundException e) {} 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. Durch Implementierung der Ausnahmebedingung onObjectNotFound können Sie das Ereignis bei jedem Vorkommen handhaben. Wenn Sie die Implementierung in ein Helper-Superscript einbinden, können Sie das Ereignis für jedes Functional Tester-Script handhaben, das 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. 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.
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. 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 HTMLobject von Functional Tester handelt. Sie können den folgenden Code am Anfang der Methode onObjectNotFound hinzufügen:
if (!testObjectMethodState.getTestObject(). getPropertyFromMap(IMapPropertyName.DOMAIN).equals("Html")) { return; }