Como lidar com exceções no Selenium WebDriver

Última atualização: 29 de julho de 2020 — Continuous Testing Expert
Continuous Testing

Introdução

Utilizar o Selenium WebDriver para desenvolver software complexo acarreta riscos. Um dos principais é que um problema em um módulo pode impedir a execução de todo o programa.

Isso nos leva às exceções. Basicamente, uma exceção é um evento que ocorre durante a execução de um programa e interrompe o fluxo normal de suas instruções. Muitas vezes, é inaceitável permitir que toda uma aplicação falhe quando algo dá errado em uma parte dela. É por isso que precisamos do tratamento de exceções. A ideia principal por trás do tratamento de exceções é identificar um ponto no código onde algo pode dar errado e garantir que o programa possa seguir um caminho alternativo em caso de erro. É vital para o desenvolvimento de software lidar adequadamente com exceções, e ainda mais para um processo de teste automatizado.

Neste artigo, veremos como lidar com exceções em Java em geral e em Selenium WebDriver em particular.

Tratamento de exceções em Java

Por que é importante lidar com exceções? Bem, existem dois motivos principais:

  1. Você pode usar a palavra-chave `throw` para imprimir uma mensagem personalizada para uma exceção, facilitando a geração de relatórios.
  2. Em alguns casos, você pode querer criar um fluxo alternativo ao capturar uma exceção. Você pode escrever qualquer código específico e executá-lo quando uma exceção ocorrer dentro do bloco `catch`.

Em Java, existem 5 palavras-chave para lidar com exceções:

  • tentar - Utilizado para especificar um bloco de código onde se espera que ocorra uma exceção. O bloco `try` segue um bloco `catch` ou um bloco `final`.
  • pegar - Neste bloco, inserimos o código executável para o caso de uma exceção dentro de um bloco `try`. Os blocos `catch` devem seguir os blocos `try` e conduzir ao bloco final.
  • lançar - Utilizado para lançar uma exceção explicitamente. É usado principalmente para lançar exceções personalizadas.
  • arremessos – Utilizado para especificar exceções específicas que ocorrem em uma classe.
  • finalmente - Este bloco especifica um trecho importante de código executável, independentemente de você capturar uma exceção ou não. É útil quando você precisa executar etapas obrigatórias, como limpeza e fechamento de conexões.

Exemplo:

[java] public void myClass() { try { //Um código que pode causar exceção vai aqui } catch(Exception e) { //O que fazer em caso de exceção } finally { //Adicione aqui um código que precisa ser executado de qualquer maneira } } [/java]

Ao encontrar uma exceção em um bloco try, essa exceção é passada como parâmetro para um bloco catch. É possível ter múltiplos blocos catch se você quiser lidar com diferentes tipos de exceções de maneiras diferentes.

Exceções comuns do Selenium WebDriver

Todas as exceções no Selenium WebDriver são subclasses da classe WebDriverException, que, por sua vez, é uma subclasse de Java RuntimeException.

Apresento abaixo a hierarquia de exceções do WebDriver:

Exceções comuns do Selenium WebDriver em gráficos

  • Exceção ConnectionClosedException – Uma exceção é lançada quando a conexão com o driver é perdida.
  • Exceção de argumento inválido – Essa exceção é lançada se algum argumento fornecido ao driver da web não pertencer a um tipo esperado.
  • Exceção de coordenadas inválidas – Indica que as coordenadas fornecidas para uma operação de interação são inválidas. Isso provavelmente significa que uma operação de movimento recebeu coordenadas inválidas ou que uma ação que depende da posição do ponteiro do mouse (como um clique) não foi precedida por uma operação de movimento.
  • Exceção ElementNotVisible – Lança uma exceção para indicar que, embora um elemento esteja presente no DOM, ele não está visível e, portanto, é impossível interagir com ele.
  • ElementClickInterceptedException – Indica que um clique no elemento alvo não pôde ser executado corretamente porque o elemento alvo estava oculto de alguma forma.
  • NoSuchSessionException – Lança erros por qualquer comando chamado após WebDriver.quit().
  • NoSuchElementException – Lançadas exceções por WebDriver.findElement(By by) e WebElement.findElement(By by) quando nenhum elemento é encontrado.
  • NoSuchAttributeException – Indica que o atributo solicitado não está disponível no DOM.
  • Exceção SessionNotCreatedException – Afirma que não foi possível criar uma sessão.
  • Exceção de referência de elemento obsoleto – Indica que uma referência a um elemento agora está "obsoleta" — o elemento não aparece mais no DOM da página.
  • TimeoutException – Lança uma exceção quando um comando não é concluído a tempo suficiente.

Tratamento de exceções no Selenium WebDriver

Vejamos exemplos comuns de tratamento de exceções no Selenium WebDriver com Java e SeeTest.

Primeiramente, vamos criar nossa classe de teste:

[java] import java.net.MalformedURLException; import java.net.URL; import org.junit.After; import org.junit.Test; import static org.junit.Assert.assertEquals; import org.openqa.selenium.SessionNotCreatedException; import org.openqa.selenium.remote.BrowserType; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; public class ExceptionsTest { private RemoteWebDriver driver; private static final String ACCESS_KEY = System.getenv(“SEETEST_IO_ACCESS_KEY”); private WebDriverWait wait; public ExceptionsTest () { DesiredCapabilities dc = new DesiredCapabilities(); dc.setCapability(“generateReport”, true); String title = “Teste Selenium”; dc.setCapability(“accessKey”, ACCESS_KEY); String Selenium_Hub = “https://cloud.seetest.io/wd/hub/”; dc.setCapability(CapabilityType.BROWSER_NAME, BrowserType.CHROME); dc.setCapability(“testName”, title); try { driver = new RemoteWebDriver(new URL(Selenium_Hub), dc); wait = new WebDriverWait(driver, 10); } catch (MalformedURLException e) { System.out.println(“URL malformada: ” + Selenium_Hub); } catch (SessionNotCreatedException e) { System.out.println(“Chave de acesso SeeTest incorreta: “ + ACCESS_KEY); } } @After public void tearDown() { if (driver != null) { driver.quit(); } } } [/java]

Aqui declaramos nossa classe de teste e criamos um construtor para definir as funcionalidades desejadas, indicando que queremos conectar o webdriver ao navegador Chrome na plataforma SeeTest. Como você pode ver, criamos um bloco try…catch para lidar com os casos em que a URL do hub SeeTest está malformada ou o token de acesso do SeeTest está incorreto.

Agora, vamos escrever um teste simples:

[java] @Test public void testSelenium() { driver.get(“https://seetest.io”); try { assertEquals(driver.findElement(By.xpath(“/html/body/section/div/div[1]/div[1]/div”)).getText(), “START TESTING NOW”); } catch (NoSuchElementException e) { throw new RuntimeException(“Não foi possível encontrar o botão “START TESTING NOW”””); } } [/java]

Aqui visitamos https://seetest.io Na página, verifique se o botão “INICIAR TESTE AGORA” existe. Se o Selenium WebDriver não conseguir localizar esse elemento, ele estará presente.

Também recomendamos