Guia de Selenium com JUnit/TestNG

Guia de Selenium com JUnit / TestNG

1. Introdução

Este artigo é uma introdução prática e rápida para trabalhar comSeleniume escrever testes comJUniteTestNG.

2. Integração de selênio

Nesta seção, começaremos com um cenário simples - abrir uma janela do navegador, navegar até um determinado URL e procurar algum conteúdo desejado na página.

2.1. Dependências do Maven

No arquivopom.xml, adicione a seguinte dependência:


    org.seleniumhq.selenium
    selenium-java
    3.4.0

A versão mais recente pode ser encontrada emMaven Central Repository.

2.2. Configuração de Selênio

Primeiro, crie um novo arquivo de classe Java chamadoSeleniumConfig:

public class SeleniumConfig {

    private WebDriver driver;

    //...

}

Dado que estamos usando uma versão Selenium 3.x, temos que especificar o caminho de um arquivo executávelGeckoDriver (com base em seu sistema operacional) usando uma propriedade do sistema chamadawebdriver.gecko.driver. A versão mais recente do GeckoDriver pode ser baixado deGithub Geckodriver Releases.

Vamos agora inicializar oWebDriver no construtor, também definiremos 5 segundos como um tempo limite paraWebDriver para esperar que um elemento na página apareça:

public SeleniumConfig() {
    Capabilities capabilities = DesiredCapabilities.firefox();
    driver = new FirefoxDriver(capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

static {
    System.setProperty("webdriver.gecko.driver", findFile("geckodriver.mac"));
}

static private String findFile(String filename) {
   String paths[] = {"", "bin/", "target/classes"};
   for (String path : paths) {
      if (new File(path + filename).exists())
          return path + filename;
   }
   return "";
}

Essa classe de configuração contém alguns métodos que ignoraremos por enquanto, mas veremos mais sobre eles na segunda parte desta série.

Em seguida, precisaremos implementar uma classeSeleniumExample:

public class SeleniumExample {

    private SeleniumConfig config;
    private String url = "http://www.example.com/";

    public SeleniumExample() {
        config = new SeleniumConfig();
        config.getDriver().get(url);
    }

    // ...
}

Aqui, inicializaremos oSeleniumConfige definiremos a URL desejada para navegar. Da mesma forma, implementaremos uma API simples para fechar o navegador e obter o título da página:

public void closeWindow() {
    this.config.getDriver().close();
}

public String getTitle() {
    return this.config.getDriver().getTitle();
}

Para navegar até a seção Sobre de example.com, precisamos criar um métodocloseOverlay() que verifica e fecha a sobreposição em um carregamento de página inicial. Depois disso, navegamos para a página de exemplo Sobre usando o métodogetAboutexamplePage():

public void getAboutexamplePage() {
    closeOverlay();
    clickAboutLink();
    clickAboutUsLink();
}

private void closeOverlay() {
    List webElementList = this.config.getDriver()
      .findElements(By.tagName("a"));
    if (webElementList != null) {
       webElementList.stream()
         .filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title")))
         .filter(WebElement::isDisplayed)
         .findAny()
         .ifPresent(WebElement::click);
    }
}

private void clickAboutLink() {
    this.config.getDriver().findElement(By.partialLinkText("About")).click();
}

private void clickAboutUsLink() {
    Actions builder = new Actions(config.getDriver());
    WebElement element = this.config.getDriver()
      .findElement(By.partialLinkText("About example."));
    builder.moveToElement(element)
      .build()
      .perform();
}

Podemos verificar se as informações necessárias estão disponíveis na página exibida:

public boolean isAuthorInformationAvailable() {
    return this.config.getDriver()
      .findElement(By.cssSelector("article > .row > div"))
      .isDisplayed();
}

Em seguida, testaremos essa classe com JUnit e TestNG.

3. Com JUnit

Vamos criar uma nova classe de teste comoSeleniumWithJUnitLiveTest:

public class SeleniumWithJUnitLiveTest {

    private static SeleniumExample seleniumExample;
    private String expectedTitle = "example | Java, Spring and Web Development tutorials";

    // more code goes here...

}

Vamos usar a anotação@BeforeClass deorg.junit.BeforeClass para fazer uma configuração inicial. Neste métodosetUp(), vamos inicializar o objetoSeleniumExample:

@BeforeClass
public static void setUp() {
    seleniumExample = new SeleniumExample();
}

De maneira semelhante, quando nosso caso de teste terminar, devemos fechar o navegador recém-aberto. Faremos isso com a anotação@AfterClass - para limpar as configurações quando a execução do caso de teste terminar:

@AfterClass
public static void tearDown() {
    seleniumExample.closeWindow();
}

Observe o modificadorstatic em nossa variável de membroSeleniumExample - porque precisamos usar esta variável nos métodos estáticossetUp()etearDown() -@BeforeClasse@AfterClass pode ser invocado apenas em métodos estáticos.

Finalmente, podemos criar nosso teste completo:

@Test
public void whenAboutexampleIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutexamplePage();
    String actualTitle = seleniumExample.getTitle();

    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

Este método de teste afirma que o título da página da web não énulle é definido como esperado. Além disso, verificamos que a página contém as informações esperadas.

Quando o teste é executado, ele simplesmente abre o URL no Firefox e o fecha posteriormente após a verificação do título da página da web e do conteúdo.

4. Com TestNG

Vamos agora usar o TestNG para executar nosso caso / suíte de teste.

Observe que se você estiver usando o Eclipse, o plug-in TestNG pode ser baixado e instalado a partir doEclipse Marketplace.

Primeiro, vamos criar uma nova classe de teste:

public class SeleniumWithTestNGLiveTest {

    private SeleniumExample seleniumExample;
    private String expectedTitle = "example | Java, Spring and Web Development tutorials";

    // more code goes here...

}

Usaremos uma anotação@BeforeSuite deorg.testng.annotations.BeforeSuite para instanciar nossoSeleniumExample class. O métodosetUp() será iniciado pouco antes da suíte de testes ser ativada:

@BeforeSuite
public void setUp() {
    seleniumExample = new SeleniumExample();
}

Da mesma forma, usaremos a anotação@AfterSuite deorg.testng.annotations.AfterSuite para fechar nosso navegador aberto assim que o conjunto de testes for concluído:

@AfterSuite
public void tearDown() {
    seleniumExample.closeWindow();
}

Finalmente, vamos implementar nosso teste:

@Test
public void whenAboutexampleIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutexamplePage();
    String actualTitle = seleniumExample.getTitle();

    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

Após a conclusão bem-sucedida do conjunto de testes, encontramos relatórios HTML e XML na pastatest-output do projeto. Esses relatórios resumem os resultados do teste.

5. Conclusão

Neste artigo rápido, nos concentramos em uma introdução rápida para escrever testes Selenium 3 com JUnit e TestNG.

Como sempre, a fonte do artigo está disponívelover at GitHub.