Imagine que você grave um clique em uma página segura e que esse link o leve para uma página que não é segura. Suponha que a configuração de segurança do navegador esteja ajustada para que apareça uma caixa de mensagem avisando que a página seguinte não será segura. Você clica em OK para descartar a mensagem de aviso e, em seguida, clica em uma caixa de opções na página não segura. O script gravado do Functional Tester seria semelhante ao seguinte:
linkThatLeavesSecurePage().click(); Dialog_HtmlDialogButtonOK().click(); CheckboxOnTheUnsecurePage().click();
Quando você reproduz o script em um navegador com uma configuração de segurança diferente, o script não é reproduzido porque o Dialog_HtmlDialogButtonOK() não pode ser localizado. É possível colocar a instrução Dialog_HtmlDialogButtonOK().click(); como comentário, mas haverá falhas quando o diálogo realmente for exibido.
Uma solução é aguardar que a mensagem apareça. Se não aparecer, você pode continuar. A solução é possível com o seguinte código:
linkThatLeavesSecurePage().click();
try
{
Dialog_HtmlDialogButtonOK().click();
}
catch(ObjectNotFoundException e) {}
CheckboxOnTheUnsecurePage().click();
Esse código realiza seu objetivo principal. Se a mensagem de aviso aparecer, descarte-a. Se não aparecer, pare de aguardar e então continue. Entretanto, é provável que você não queira aguardar o período de tempo padrão pela exibição da mensagem de aviso. Se tiver certeza que, quando a mensagem de aviso for exibida ela chegará em 5 segundos, poderá acelerar esse tempo codificando da seguinte forma:
linkThatLeavesSecurePage().click();
try
{
Dialog_HtmlDialogButtonOK().waitForExistence(5,1);
Dialog_HtmlDialogButtonOK().click();
}
catch(ObjectNotFoundException e) {}
CheckboxOnTheUnsecurePage().click();
Uma objeção aceitável para essa abordagem é que esse código especial precisará ser incluído onde quer que um link em um navegador possa alternar páginas e causar alteração na segurança. A manipulação dessa situação em um lugar comum sem alterar muitos scripts de teste seria mais eficiente. A implementação da exceção onObjectNotFound permite manipular o evento sempre que ocorrer. Colocando a implementação em um superscript auxiliar, você pode manipular o evento para qualquer script do Functional Tester que estender essa superclasse auxiliar.
O código no exemplo a seguir implementa uma classe base para scripts que testam aplicativos HTML. Essa classe base implementa onObjectNotFound. O método onObjectNotFound examina todos os domínios HTML e procura todas as caixas de diálogo HTML. Todas as caixas de diálogo HTML são descartadas pressionando Enter. Se alguma delas for descartada, o método TestObject será reiniciado. Se nenhuma for descartada, o método não agirá e a exceção ObjectNotFoundException será lançada normalmente.
import com.rational.test.ft.script.*;
import com.rational.test.ft.object.interfaces.*;
/**
* Essa classe fornece alguns recursos básicos para trabalhar
* com HTML.
*/
public abstract class HtmlScript extends RationalTestScript
{
/**
* Substitui a implementação base de onObjectNotFound. Sempre
* que esse evento ocorrer, examine todos os domínios ativos (locais
* em que os objetos podem ser localizados). Para domínios HTML (Java
* e outros domínios são ignorados) localiza todos os objetos superiores.
* Se o objeto superior for um Html Dialog,
* digita uma tecla Enter para descartar o diálogo.
* Registra um aviso quando isso acontece.
*/
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"))
{
// O domínio HTML foi localizado.
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"))
{
// Um HtmlDialog de nível superior foi localizado.
logWarning("HtmlScript.onObjectNotFound - dismissing dialog.");
try
{
dismissedAWindow = true;
((TopLevelTestObject)topObjects[j]).inputKeys("{enter}");
}
catch(RuntimeException e) {}
}
}
}
finally
{
//cancelar o registro de todas as referências a objetos superiores
unregister(topObjects);
}
}
}
}
if (dismissedAWindow)
{
// tentar novamente
testObjectMethodState.findObjectAgain();
}
else
{
logWarning("HtmlScript.onObjectNotFound; no Html Dialog to dismiss");
}
}
}
Observe que a implementação anterior de HtmlScript serve apenas para teste de HTML. Talvez você queira utilizar esta classe-base para qualquer script, incluindo scripts que testem Java. Nesse caso, é necessário certificar-se de que TestObject seja um HTMLobject do Functional Testes antes de descartar as caixas de diálogo HTML. Você pode incluir o seguinte código no início do método onObjectNotFound:
if (!testObjectMethodState.getTestObject().
getPropertyFromMap(IMapPropertyName.DOMAIN).equals("Html"))
{
return;
}