Guia de Selenium com JUnit / TestNG
1. Introdução
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.