A pessoa que quer criar um bom teste com o Selenium, precisa ter alguns conhecimentos sólidos em:
- Html
- Xpath
- Ajax
- Sistema como um todo
Neste post, vou me aprofundar apenas com o conhecimento de AJAX. Isso mesmo, apenas conhecimento, já que o testador não precisa saber nada de implementação de AJAX.
AJAX é uma forma de fazer uma requisição ao servidor sem que seja necessário dar um reload completo na página. Essa requisição assíncrona, na grande maioria das vezes, manipula o html que está sendo exibido para o usuário. O testador primeiramente precisa identificar essa requisição AJAX e para isso, a forma mais fácil é instalar a extensão do Firebug no Firefox e identificar as requisições através da aba console. Após essa identificação, o testador precisa entender o que foi alterado no Html, para depois inserir alguns novos comandos no Selenium.
Para deixar essa explicação mais fácil de entender, resolvi criar uma página que faz AJAX. Clique aqui para visualizá-la.
Na tela é preciso selecionar um estado e uma cidade, e em seguida clicar no botão salvar que redirecionará para uma tela de sucesso. Caso nenhuma cidade for selecionada, aparecerá uma mensagem de erro.
Se você abrir a IDE e sair navegando pela tela, clicando em SP, São Paulo e depois em salvar, você verá a tela de sucesso. Os comandos criados pela IDE foram:

Apenas o último comando não foi criado automaticamente pela IDE. Eu coloquei o comando verifyText para validar que a mensagem de sucesso está aparecendo com a cidade que foi selecionada.
Até aí tudo bem. Mas se você quiser rodar o teste novamente, ele falhará:
Apareceu a mensagem de que nenhuma cidade foi selecionada porque o Selenium rodou tão rápido que clicou no botão salvar antes que as cidades do estado selecionado fossem carregadas via AJAX.
O que tem que ser feito para corrigir esse problema?
Como disse anteriormente, é preciso identificar o que foi alterado no html com a requisição AJAX. Nesse exemplo, há uma div com id div_cidades que no momento em que a página é carregada ela fica vazia. Ao selecionar um estado, o AJAX é acionado e preenche essa div com uma tag select contedos as.
Depois dessa identificação, vamos então acrescentar o comando do Selenium para corrigir isso. O comando waitForElementPresent é o ideal para esses casos. Ele fala pro Selenium esperar para executar o próximo passo até encontrar um determinado elemento na página. No nosso caso, é falar pro Selenium esperar a tag select que está abaixo da div com id div_cidades.
O teste corrigido fica assim:
Existem outros comandos de wait. Todos começam com o prefixo waitFor. Dê uma olhada na documentação ou na própria IDE, já que se você digitar waitFor, vai vir a lista de todos os comandos que começam com esse prefixo.
Esse mesmo tratamento com os comandos waitFor também podem ser aplicados se há uma chamada Javascript demorada, mesmo que ela não faça uma requisição AJAX.
Ok, mas o que acontece se o elemento esperado não aparecer?
O Selenium tem uma configuração que é o tempo máximo que ele fica esperando. Se esse tempo for excedido o Selenium retorna um erro de timeout. O padrão são 30 segundos, mas você pode alterar isso na IDE, “options > options > Default timeout value of recorded command”. Se você não está usando a IDE e está subindo um selenium server, há também uma configuração para setar o timeout.
Bom galera, é isso aí. Qualquer dúvida ou sugestão é só comentar no blog.
Valeuuuuu!!!!

