Imaginons que vous enregistriez un clic sur une page sécurisée et que le lien correspondant vous mène à une page qui n'est pas sécurisée. Votre navigateur est configuré pour vous prévenir de cette situation par l'affichage d'un message d'avertissement dans une boîte de dialogue. Vous cliquez sur OK pour fermer la boîte de message, puis vous cochez une case sur la page non sécurisée. La partie correspondante du script Functional Tester enregistré ressemblerait alors à ceci :
linkThatLeavesSecurePage().click(); Dialog_HtmlDialogButtonOK().click(); CheckboxOnTheUnsecurePage().click();
Lorsque vous lisez ensuite ce script pour tester l'application avec un autre navigateur dont les paramètres de sécurité sont réglés différemment, la lecture échoue, car l'objet Dialog_HtmlDialogButtonOK() n'apparaît jamais. Bien sûr, vous pourriez mettre en commentaire l'instruction Dialog_HtmlDialogButtonOK().click();, mais le script échouerait alors en cas d'affichage de la boîte de message.
Une solution est d'attendre un certain temps que le message apparaisse. S'il ne s'affiche pas, vous pouvez continuer. Cette solution peut être mise en oeuvre avec le code suivant :
linkThatLeavesSecurePage().click(); try { Dialog_HtmlDialogButtonOK().click(); } catch(ObjectNotFoundException e) {} CheckboxOnTheUnsecurePage().click();
Ce code atteint l'objectif principal : si le message d'avertissement s'affiche, vous fermez la boîte de dialogue correspondante. S'il n'apparaît pas, vous arrêtez de l'attendre au terme d'un délai par défaut, puis vous poursuivez le traitement. Cependant, le délai par défaut peut vous sembler trop long. Si vous êtes sûr que dans les cas où l'affichage du message d'avertissement est prévu, celui-ci apparaît dans les cinq secondes à compter du moment où l'utilisateur clique sur le lien sortant de la page, vous pouvez accélérer la procédure en la codant comme suit :
linkThatLeavesSecurePage().click(); try { Dialog_HtmlDialogButtonOK().waitForExistence(5,1); Dialog_HtmlDialogButtonOK().click(); } catch(ObjectNotFoundException e) {} CheckboxOnTheUnsecurePage().click();
La principale objection à cette approche est que ce code spécial doit être ajouté partout où un lien dans un navigateur est susceptible de provoquer un changement de page et de niveau de sécurité. Il serait plus efficace de gérer cette situation à un endroit commun, vous évitant de modifier chacun de vos nombreux scripts de test. En implémentant l'exception onObjectNotFound, vous pouvez traiter l'événement chaque fois qu'il a lieu. Mieux encore, en plaçant cette implémentation dans un superscript auxiliaire, vous pouvez gérer l'événement dans n'importe quel script Functional Tester étendant la classe de ce superscript.
Le code présenté dans l'exemple suivant implémente une classe de base destinée aux scripts de test d'applications HTML. Cette classe de base implémente onObjectNotFound. La méthode onObjectNotFound scrute tous les domaines HTML et y recherche les boîtes de dialogue HTML. Chaque boîte de dialogue HTML est fermée par une action sur la touche Entrée. Si une boîte de dialogue est fermée, la méthode TestObject est relancée. Si aucune boîte de dialogue n'est fermée, la méthode ne fait rien et l'exception ObjectNotFoundException est lancée comme à l'accoutumée.
import com.rational.test.ft.script.*; import com.rational.test.ft.object.interfaces.*; /** * Cette classe fournit des fonctionnalités élémentaires de traitement des * fenêtres HTML. */ public abstract class HtmlScript extends RationalTestScript { /** * Remplacer l'implémentation de base de onObjectNotFound. Chaque * fois que cet événement a lieu, scruter tous les domaines actifs * (endroits où les objets peuvent être trouvés). Pour les domaines HTML (Java et * les autres domaines sont ignorés), trouver tous les objets de niveau supérieur. * Si l'objet de niveau supérieur est un HtmlDialog, actionner la touche Entrée * pour fermer la boîte de dialogue. * Consigner un avertissement dans le journal lorsque cela arrive. */ 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")) { // Domaine HTML trouvé. 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")) { // Un HtmlDialog de niveau supérieur a été trouvé. logWarning("HtmlScript.onObjectNotFound - dismissing dialog."); try { dismissedAWindow = true; ((TopLevelTestObject)topObjects[j]).inputKeys("{enter}"); } catch(RuntimeException e) {} } } } finally { //Désenregistrer toutes les références aux objets de niveau supérieur unregister(topObjects); } } } } if (dismissedAWindow) { // recommencer testObjectMethodState.findObjectAgain(); } else { logWarning("HtmlScript.onObjectNotFound; aucune boîte de dialogue HTML à fermer"); } } }
Notez que l'implémentation de HtmlScript présentée ci-dessus n'est valable que pour le test d'applications HTML. Vous pouvez souhaiter utiliser cette classe de base pour n'importe quel script, y compris ceux qui servent à tester des applications Java. Dans ce cas, vous devez vous assurer que le TestObject est un HTMLobject Functional Tester avant de coder la fermeture des boîtes de dialogue HTML. Pour ce faire, vous pouvez ajouter le code suivant au début de la méthode onObjectNotFound :
if (!testObjectMethodState.getTestObject(). getPropertyFromMap(IMapPropertyName.DOMAIN).equals("Html")) { return; }