Imagine que graba un enlace en una página segura y dicho enlace le conduce a una página que no es segura. Presupongamos también que la configuración de seguridad del navegador está definida para que aparezca un recuadro de mensaje que avise de que la siguiente página ya no será segura. Usted pulsa Aceptar para rechazar el mensaje de aviso y, a continuación, pulsa en un recuadro de selección de la página no segura. El script de Functional Tester grabado tendría un aspecto parecido al siguiente:
linkThatLeavesSecurePage().click(); Dialog_HtmlDialogButtonOK().click(); CheckboxOnTheUnsecurePage().click();
Cuando reproduzca el script en un navegador con una configuración de seguridad distinta, el script no se reproducirá porque el Dialog_HtmlDialogButtonOK() no se podrá encontrar. Puede argumentar la sentencia Dialog_HtmlDialogButtonOK().click();, pero se producirán anomalías cuando aparezca el diálogo.
Una solución consiste en esperar a que aparezca el mensaje. Si no aparece, puede continuar. La solución se puede lograr con el siguiente código:
linkThatLeavesSecurePage().click(); try { Dialog_HtmlDialogButtonOK().click(); } catch(ObjectNotFoundException e) {} CheckboxOnTheUnsecurePage().click();
Este código lleva a cabo su objetivo principal. Si aparece el mensaje de aviso, lo rechaza. Si no aparece, puede parar de esperar y después continuar. No obstante, es posible que no desee esperar la cantidad de tiempo predeterminada para que aparezca el mensaje de aviso. Si está seguro de que el tiempo de espera para que aparezca el mensaje de aviso es de 5 segundos, puede acelerarlo con la siguiente codificación:
linkThatLeavesSecurePage().click(); try { Dialog_HtmlDialogButtonOK().waitForExistence(5,1); Dialog_HtmlDialogButtonOK().click(); } catch(ObjectNotFoundException e) {} CheckboxOnTheUnsecurePage().click();
Una objeción razonable a este método es que deberá añadir este código especial siempre que un enlace del navegador conmute páginas y pueda provocar un cambio en la seguridad. Resulta más eficiente manejar esta situación en un lugar común sin cambiar demasiados scripts de prueba. Si implementa la excepción onObjectNotFound podrá manejar el suceso cada vez que se produzca. Si coloca la implementación en un superscript de ayudante podrá manejar el suceso para cualquier script de Functional Tester que aplique esta superclase de ayudante.
El código del siguiente ejemplo implementa una clase base para scripts que prueban aplicaciones HTML. Esta clase base implementa onObjectNotFound. El método onObjectNotFound busca por todos los dominios HTML y busca todos los recuadros de diálogo HTML. Al pulsar la tecla Intro se rechaza cada recuadro de diálogo HTML. Cuando se rechaza algún recuadro de diálogo, el método TestObject se reinicia. Si no se rechaza ningún recuadro de diálogo, el método no hace nada y se lanza la ObjectNotFoundException como siempre.
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"); } } }
Tenga en cuenta que la implementación anterior de HtmlScript sólo resulta adecuada para probar HTML. Es posible que desee poder utilizar esta clase base para todos los scripts, incluyendo los scripts que prueban Java. En tal caso, debe asegurarse de que TestObject sea un HTMLobject de Functional Tester HTML antes de rechazar los recuadros de diálogo HTML. Puede añadir el código siguiente al principio del método onObjectNotFound:
if (!testObjectMethodState.getTestObject(). getPropertyFromMap(IMapPropertyName.DOMAIN).equals("Html")) { return; }