Selenium WebDriver: Não misture Esperas Implícitas com Explícitas

Introdução

Quando estamos trabalhando/aprendendo sobre Selenium WebDriver nos deparamos com um pequeno grande problema na automação de páginas web: a espera por alguma coisa na tela.

Hoje é muito comum (praticamente dominante) o uso de requisições assíncronas chamado popularmente de “Ajax”. E para resolver isso temos dois tipos de esperas no Selenium: Implícita e Explícita

Conceituação sobre as esperas

espera Implícita é apenas um comando que vai geralmente logo depois da criação/instância do driver (browser) que permite a espera por qualquer comando no restante do código, onde se um elemento ainda não está disponível, ele aguarda até o tempo definido no comando

A espera Explícita são esperas inseridas no código através de comandos específicos de esperas, como esperar por um elemento estar visível ou presente, esperar por uma imagen não estar mais visível na tela, entre outras. Existem duas formas de criar a espera explícita: WebDriverWait ou FluentWait

Antigamente no WebDriver, antes da criação da classe de suporte ExpectedConditions tínhamos que escrever a nossa própria espera, como abaixo que espera um elemento ser exibido na tela:

Qual é a melhor usar?

Eu considero a espera explícita a recomendada pelos seguintes motivos:

  • Exibe uma ação definida no código, ou seja, você saberá onde existe uma espera por algo
  • Pode ser facilmente utilizada com o suporte das ExpectedConditions ou criada de forma customizada
  • O tipo de retorno é um sucesso ou timeout no caso de “erro” (não encontrou algo no tempo especificado)
  • Pode-se customizar tempo, ignorar exceptions, tempo de tentativas na espera
  • É executado no lado local do Selenium, onde a implementação da espera é encaminhada para o browser/driver (Firefox, GoogleChrome, etc…)

Eu recomendo não utilizar a espera implícita pelos seguintes motivos:

  • Pode causar demora na execução do seu script.
    • Ex: Saberemos que um elemento foi removido somente depois de x tempo de espera definido no espera explícita
  • Mascara resultados reais de erros
  • Só funciona em conjunto com o método findElement/findElements
  • O tipo de retorno é apenas se encontrou ou não o elemento, sem exibir timeout
  • Não há formas de definir, no mesmo código, tempo de esperas diferentes
    • Ex: se você colocar 1 minuto de espera explícita por causa de uma certa requisição/ação e, logo no início do script o primeiro campo não está mais presente. Ele irá demorar 1 minuto para lhe dizer que o elemento não existe (e você poderia ter executado diversos testes neste tempo)

 

Referências

Jim Evans, um dos desenvolvedores do Selenium também não recomenda o uso da espera implícita.
Confira: http://stackoverflow.com/questions/15164742/combining-implicit-wait-and-explicit-wait-together-results-in-unexpected-wait-ti/15174978#15174978

Referência sobre Explicity e Implicitly Wait http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits

 

Qualquer dúvida deixe um comentário! 🙂
Abraços!

One thought to “Selenium WebDriver: Não misture Esperas Implícitas com Explícitas”

  1. Boa tarde Elias.

    Gostei muito do seu post.
    Uma duvida, no “Eu recomendo não utilizar a espera implícita”, abaixo você diz duas vezes explicita, deveria ser Implícita?

    Desde já agradeço.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *