Automação de Testes com Selenium WebDriver em Java
4.6 (1,162 ratings)
Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.
2,777 students enrolled

Automação de Testes com Selenium WebDriver em Java

É hora de aprender, na prática, como criar scripts de teste com a biblioteca mais conhecida entre os testadores
4.6 (1,162 ratings)
Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.
2,777 students enrolled
Created by Júlio de Lima
Last updated 4/2019
Portuguese
Portuguese [Auto-generated]
Current price: $11.99 Original price: $99.99 Discount: 88% off
2 days left at this price!
30-Day Money-Back Guarantee
This course includes
  • 4.5 hours on-demand video
  • 16 articles
  • Full lifetime access
  • Access on mobile and TV
  • Certificate of Completion
Training 5 or more people?

Get your team access to Udemy's top 3,000+ courses anytime, anywhere.

Try Udemy for Business
What you'll learn
  • Criar scripts de teste capazes de interagir com aplicações web e validar se ela comporta-se como esperado
Course content
Expand all 33 lectures 04:25:48
+ Introdução ao Selenium WebDriver
8 lectures 56:52

O site do projeto Selenium possui uma série de informações relevantes. Elas estão relacionadas a todos os projetos, isso inclui: Selenium IDE, Selenium WebDriver e Selenium Grid. O site também conta com documentações, dicas e links importantes. O acesso ao site do projeto Selenium é feito através da seguinte URL: http://www.seleniumhq.org/.

Selenium IDE, como vimos no vídeo, é um plugin que pode ser instalado no Firefox e que serve para criação, gravação e execução de testes em “selenês”, nome dado à forma de escrita e gravação dos scripts. Não iremos aprender a trabalhar com ele, uma vez que o treinamento é voltado à escrita de scripts em Java e não a gravação em selenês. Veja na URL abaixo um pouco mais sobre o Selenium IDE:

http://www.seleniumhq.org/projects/ide/

O Selenium WebDriver superou alguns problemas do Selenium Remote Control, como por exemplo, o Single Role Origin Policy (a obrigatoriedade de que o acesso a uma página seja feita apenas por uma página de mesmo domínio, porta e protocolo). Ele também permitiu a possibilidade de execução dos scripts local e/ou remotamente. WebDriver também é o nome da Interface implementada pelas classes que representam os browsers, por exemplo: FirefoxDriver, ChromeDriver, InternetExplorerDriver, etc.

Há pouquíssimas diferenças entre a forma de utilização do Selenium WebDriver em Java comparado a outras linguagens de programação. Vejamos um exemplo de Java comparado a Ruby:

Exemplo de código em Java

WebDriver driver = new ChromeDriver();
driver.get("http://www.google.com");
WebElement element = driver.findElement(By.name("q"));
element.sendKeys("Cheese!");
element.submit();

Exemplo de código em Ruby

driver = Selenium::WebDriver.for :chrome
driver.get "http://google.com"
element = driver.find_element :name => "q"
element.send_keys "Cheese!"
element.submit

Isso ocorre porque há um padrão já estabelecido pela W3C que descreve como o Selenium WebDriver deve ser implementado em cada linguagem de programação. Você pode acessar esse padrão através da URL abaixo:

https://www.w3.org/TR/webdriver/

Quer colaborar? Abaixo está a URL de acesso ao projeto no Github:

https://github.com/SeleniumHQ/selenium

Introdução ao Selenium WebDriver
06:06
Introdução ao Selenium WebDriver - Apêndice
01:18

Java JDK Link
http://www.oracle.com/technetwork/pt/java/javase/downloads/jdk8-downloads-2133151.html

IntelliJ IDEA
https://www.jetbrains.com/idea/download/#section=mac

JUnit
https://mvnrepository.com/artifact/junit/junit/4.12

Selenium WebDriver
https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/3.6.0

ChromeDriver
https://sites.google.com/a/chromium.org/chromedriver/downloads

Extras

Outros Drivers
https://github.com/mozilla/geckodriver/releases (Firefox)
http://selenium-release.storage.googleapis.com/index.html?path=3.6/ (Internet Explorer) 

Cucumber-JVM
https://cucumber.io/docs/reference/jvm

Downloads e dependências
08:16
Downloads e dependências - Apêndice
00:11

Neste teste vimos que é necessário ter métodos anotados com @Test para que sejam interpretados como um teste válido ao clicar em "executar". A forma de nomear métodos é sempre tema de perguntas, por isso, separei um post que possui 7 recomendações diferentes de como nomear seus testes, veja no link abaixo:

https://vitalflux.com/7-popular-unit-test-naming-conventions/

Também vimos que é possível utilizar métodos da classe Assert do JUnit para validar valores obtidos durante os testes, dentre as asserções mais comuns estão:

assertEquals(String valorEsperado, String valorAtual, String mensagemErro)

Validar se o valorAtual é igual ao valorEsperado, caso não sejam, a mensagermErro é apresentada.

assertTrue(boolean condicaoAtual, String mensagemErro)

Validar se a condicaoAtual é verdadeira, caso não seja, a mensagermErro é apresentada.

Quer conhecer todas as asserções da classe Assert? Visite a URL abaixo:

http://junit.sourceforge.net/javadoc/org/junit/Assert.html

Seu navegador não abriu uma janela maximizada?

Sem problemas, para maximizar, use o comando a seguir logo abaixo da instanciação da classe ChromeDriver:

navegador.manage().window().maximize();

Ou, se está num MAC OS X, como eu, use o comando abaixo:

navegador.manage().window().setSize(new Dimension(1280, 800));

Lembrando que o primeiro parâmetro (1280) representa a largura e o segundo (800) representa a altura da janela do navegador.

Criando o projeto e abrindo o navegador
23:14
Criando o projeto e abrindo o navegador - Apêndice
00:47

Para acelerar o desenvolvimento dos seus scripts, nada melhor que conversar com os desenvolvedores da aplicação que você irá testar, ou mesmo, você mesmo colocar a mão no código e tentar identificar como a aplicação foi construída e quais são suas principais características.

Caso você não conheça muito sobre HTML e seus elementos, segue abaixo dois links que poderão lhe ajudar bastante:

Elementos mais comuns no HTML
https://www.w3schools.com/html/html_elements.asp

Atributos constantemente usados em elementos
https://www.w3schools.com/html/html_attributes.asp

Identificando elementos e programando um script de teste
16:36
Identificando elementos e programando um script de teste​ - Apêndice
00:23
+ Automatizando testes com Selenium WebDriver
10 lectures 01:40:01

O método findElement provavelmente é o método que você mais vai utilizar durante sua trajetória na automação de testes com Selenium WebDriver. Isso porque ele retorna um objeto do tipo WebElement que representa um objeto qualquer contido na página, por exemplo, um botão, um campo, uma caixa de textos, etc.

Alguns dos métodos mais utilizados em um WebElement são:

click()

Para clicar em um determinado elemento.

sendKeys(String texto)

Para atribuir um texto a um elemento, esse método pode ser mesclado com o uso da classe Keys, que possibilita, por exemplo, o digitar de teclas especiais como Shift, Enter, Backspace, etc.

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/Keys.html

getText()

Retorna o texto contido entre o abrir e fechar da tag. No código <a id="mensagem">Este é meu texto</a>, o getText() retornaria "Este é meu texto".

clear()

Limpa um campo que já possui um valor default.

getAttribute(String atributo)

Retorna o texto contido em um atributo. No código <a id="mensagem">Este é meu texto</a>, o getAttribute("id") retornaria "mensagem".

Você pode ter acesso a todos os métodos da classe WebElement através do link abaixo:

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebElement.html

Preview 23:31
Codificando o teste com Selenium WebDriver - Apêndice
00:41

Além das anotações @Test, @Before e @After ainda há outras três anotações, vejamos no próximo parágrafo.

@BeforeClass

Método público, sem retorno e estático usado para executar comandos antes da execução do primeiro teste contido no projeto.

@AfterClass

Método público, sem retorno e estático usado para executar comandos depois da execução do último teste contido no projeto.

@Ignore(String motivo)

Permite que testes sejam ignorados.

Usando @Before e @After do JUnit
08:00
Usando @Before e @After do JUnit - Apêndice
00:15

Escrever scripts de teste de software é muito semelhante a escrever um software, em minha opinião, a principal diferença é que o script de teste é burro, ou seja, não restringimos a quantidade de condicionais dentro dele para reduzir a probabilidade de falhas no script. Em contrapartida, um software possui dezenas, centenas ou milhares de condicionais. 

Algumas práticas de teste de software são sombra do desenvolvimento de softwares, por exemplo, o desejo de melhora do código e sanitização do mesmo. Neste vídeo falamos sobre ter apenas asserções no fim do código, isso é uma prática herdada do Padrão AAA, que refere-se a Arrange, Act e Assert, respectivamente, Preparação do teste, Ação e Asserções, ou seja, validações. O padrão AAA foi herdado do teste de unidade, veja mais no link abaixo:

https://www.typemock.com/unit-test-patterns-for-net#aaa

Vimos nesse vídeo a necessidade de uso da classe Select, para ter acesso a métodos que não foram disponibilizados nativamente na interface WebElement. Veja abaixo a relação completa de métodos disponíveis para interação com comboboxes:

http://seleniumhq.github.io/selenium/docs/api/java/index.html

Lidando com Combo boxes e toast messages
30:41
Lidando com Combo boxes e toast messages - Apêndice
00:42

Lembre-se, todos os métodos de teste precisam ter a anotação @Test e serem públicos e sem retorno, ou seja, void.

XPath é um completo mecanismo de pesquisa em arquivos baseados em XML, além dos comando básicos de pesquisa, há uma série de métodos e axes que permitem navegar em elementos que estão ao redor de um determinado elemento. Vimos isso na utilização dos axes ancestor e following. Veja abaixo uma lista com todos os axes disponíveis no XPath:

https://www.w3schools.com/xml/xpath_axes.asp

A classe ExpectedConditions, como vimos no vídeo, possui uma série de estratégias. Elas nos ajudam a criar formas de aguardar que certos eventos aconteçam, como por exemplos que um determinado seja removido do DOM (caso que vimos no vídeo relacionado ao staleness). Abaixo está um link com todas as estratégias de espera, ou seja, métodos da classe ExpectedConditions:

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

As estratégias mais utilizadas são:

alertIsPresent() 

Aguarda até que uma mensagem Javascript seja apresentada.

elementToBeClickable(By localizador)

Aguarda até que um elemento esteja pronto para receber um clique, por exemplo, ele poderia ficar desabilitado durante algum período e então teríamos de esperar até que ficasse habilitado novamente.

visibilityOfElementLocated(By localizador)

Aguarda até que as propriedades CSS display e hidden possuam valores que possibilitam a visualização do elemento pelo usuário.

Esperas explícitas, janelas Javascript e identificadores XPath avançados
21:37
Esperas explícitas, janelas JS e identificadores XPath avançados - Apêndice
00:52

Quando escrito de forma correta, um teste, mesmo sem evidências gráficas, torna-se muito didático e informativo. Em alguns contextos, como por exemplo, em empresas que necessitam de alto controle sobre os testes que são executados, faz-se necessário o uso de screenshots durante a execução do mesmo. Evidências em casos como esse são extremamente necessários.

Nesse vídeo criamos uma classe com Generators, bem, nessa classe podemos colocar quantos geradores forem necessários, apenas para facilitar nosso trabalho. Logo, um dos geradores que faz muito sentido estar no seu projeto é o criação e CNPJ da empresa:

https://github.com/muriloferreira/utilities/blob/master/GeraCpfCnpj.java

Try e Catch são comandos para tratar trechos de código. Basicamente, sua estrutura diz o seguinte:

try {

   // Linha 2

} catch (Exception e) {

  // Linha 4

} finally {

  // Linha 6

}

Se o problema na Linha 2 ter uma falha, veremos que a Linha 4 será executada. Se caso a Linha 2 tiver sucesso, a linha 4 não será executada. Em ambos os casos, a linha 6 é apresentada.

Gerando evidências de teste com screenshots
12:58
Gerando evidências de teste com screenshots - Apêndice
00:42
+ Estratégias de teste
8 lectures 01:24:26

Data-Driven Testing é uma estratégia de testes que visa impedir a duplicação de scripts quando apenas os dados de entrada ou saída são diferentes. A idéia, como vimos no vídeo, é inputar parâmetros de entrada e saída nos métodos de teste e fazer com que os testes consumam um arquivo externo com os dados que serão utilizados nos testes. Quanto mais linhas o arquivo externo tiver, mais testes são executados.

Além do formato CSV, é possível trabalhar com XLS (Excel) ou mesmo JSON como DataLoader. Abaixo segue os links com os artigos que apresentam como usar esses outros DataLoaders:

  • https://github.com/EaseTech/easytest-core/wiki/Passing-JSON-Object-in-test-data
  • https://github.com/EaseTech/easytest/wiki/EasyTest-:-Loading-Data-using-Excel

O Easy Test permite a adição de dados de mais de um teste no arquivo de base de dados, vejamos como seria:

# Arquivo: ClasseDeTesteComDoisMetodos.csv

meuPrimeiroMetodo,nome,idade,mensagem

                                ,Julio,31,Sucesso

meuSegundoMetodo,salario,mensagem

                                ,1000,Sucesso

Testes dirigidos a dados (Data-driven testing)
17:02
Testes dirigidos a dados (Data-driven testing) - Apêndice
00:33

Segundo Martin Fowler, a regra de ouro do Page Objects é permitir que todo software possa fazer qualquer interação que um humano faria perante ao software além de ver tudo o que ele veria.

https://martinfowler.com/bliki/PageObject.html

Lembretes:
  • Ao adicionar um método em uma página devemos saber qual é a próxima page para ele
  • Toda page precisa ter uma construtor que alimente a propriedade navegador, do tipo WebDriver
  • A classe inicial deve ser instanciada e deve ser usada dentro de um teste do JUNT
Page objects (Parte 1)
22:05
Page objects (Parte 1) - Apêndice
00:19
Errata:
  • Ao invés de return new SecretaPage(navegador) seria mais apropriado usar return clicarSignIn() uma vez que ele já retorna um new SecretaPage
  • Poderíamos também fazer um return digitarLogin(“julio0001”).digitarSenha(“123456”) .clicarSignIn();

Há vários conceitos de Java e orientação a objeto nesse vídeo, entre eles, conceitos, sintaxe e formas de pensar orientado a objetos. Veja abaixo um vídeo que apresenta os principais fundamente em teste para começar a testes:

https://youtu.be/YPTlx9vbikM

Lembretes: 

  • Use “Alt + Enter” para importar classes no Windows e “Option + Enter” no Mac OS X
Page objects (Parte 2)
23:03
Page objects (Parte 2) - Apêndice
00:21

Asserções em Page Objects tem um debate muito constante, a pergunta é: faço asserções dentro da página ou coloco-as dentro dos métodos de uma classe da Page, chamado "validarAlgo" por exemplo.

Segundo Martin Fowler, devemos deixar asserções dentro dos testes e não dentro das pages, para evitar duplicações e também para dar responsabilidade única às páginas:

"There are differences of opinion on whether page objects should include assertions themselves, or just provide data for test scripts to do the assertions. Advocates of including assertions in page objects say that this helps avoid duplication of assertions in test scripts, makes it easier to provide better error messages, and supports a more TellDontAsk style API. Advocates of assertion-free page objects say that including assertions mixes the responsibilities of providing access to page data with assertion logic, and leads to a bloated page object."

E contínua dando seu feedback quando a estruturação deste recurso.

"I favor having no assertions in page objects. I think you can avoid duplication by providing assertion libraries for common assertions - which can also make it easier to provide good diagnostics."

Fonte: https://martinfowler.com/bliki/PageObject.html

Page objects (Parte 3)
20:16
Page objects (Parte 3) - Apêndice
00:47
+ Execução de testes
4 lectures 21:51

Errata 

+ Altere o nome da constante URL (linha 11 e 37) para URLBrowserStack, assim você não terá o problema que ocorreu comigo durante o vídeo no minuto 06:4

+ Não se esqueça de descimentar o comando navegador.quit(), caso contrário ficará preso na sessão e como há apenas 2 sessões disponíveis durante o trial do BrowserStack, ficará sem executar testes.

Crie sua conta no BrowserStack no link abaixo

https://www.browserstack.com/users/sign_up

Acesso à documentação Java no BrowserStack
https://www.browserstack.com/automate/java

Saucelabs é um dos principais concorrentes do BrowserStack:
https://saucelabs.com/


Executando testes na nuvem (Browserstack)
12:53
Executando testes na nuvem (Browserstack) - Apêndice
00:23

Download do Maven
https://maven.apache.org/download.cgi

Variáveis de ambiente no Windows, Mac OS X ou Linux
https://www.java.com/pt_BR/download/help/path.xml

Executando testes via linha de comando
08:30
Executando testes via linha de comando - Apêndice
00:05
+ Encerramento
2 lectures 01:36

Agora que finalizamos este treinamento, todo o código foi disponibilizado no Github:

https://github.com/juliointest/curso-webdriver-java.git

Encerramento e mensagem do instrutor
01:29
Vídeos interessantes e Projeto no Github
00:07
Requirements
  • Você precisa conhecer sobre lógica da programação e ter noções básicas de Java
Description

Neste treinamento te ensinarei como criar seus scripts usando a biblioteca Selenium WebDriver usando a linguagem de programação Java. Você aprenderá o que é o Selenium WebDriver, como configurá-lo em seu computador, quais são os desafios e práticas relacionadas a atividade de automação de testes e, de fato, automatizará testes em uma aplicação real, criada exclusivamente para este treinamento.

Veremos também características bem atuais, como, por exemplo, a forma de execução dos testes via linha de comando e a execução deles na nuvem.

É um treinamento bastante enxuto e que vai diretamente ao ponto principal que é a sua compreensão da biblioteca e a mentalidade de alguém que sabe o que e o porque automatizar algo.

Criaremos nosso projeto em Java usando IntelliJ IDEA e Maven em um computador com sistema operacional Mac OS X, mas todos os passos que diferem entre esse sistema operacional e outros como Windows e Linux serão apresentados em cada vídeo.

Who this course is for:
  • Curiosos que desejam aprender a automatizar testes em um framework open source em Java