SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Introdução à
Automação de Testes
com Selenium
Rodrigo Gouveia
Agenda
1. Introdução
2. Visão Geral do Selenium
3. Selenium WebDriver
4. O Padrão Page Object
5. Boas Práticas
1. Introdução
Por que é importante testar software? Não é perda
de tempo?
1. Introdução
1. Introdução
 Técnicas de Teste:
 Caixa Branca
 Caixa Preta(Funcional)
 Caixa Cinza
 Tipos de Teste
 Manual
 Automático,
 Performance(carga, estresse),
 Segurança
 etc...
1. Introdução
O que são testes funcionais?
“Teste baseado na análise de
especificação da funcionalidade de
um componente ou sistema”
1. Introdução
 Por que é importante automatizar testes?
 Testes executados de forma mais rápida e mais barata
 Feedback sobre qualidade do código
 Permite aumentar a cobertura dos testes
 Racionalização de recursos
 Fiel reprodução do teste executado
 Aumentar qualidade do produto final
 Redução de custos(médio e longo prazo)
Visão Geral do Selenium
2. Visão Geral do Selenium
O que é Selenium?
“Selenium Automatiza navegadores”
2. Visão Geral do Selenium
 Realizar ações, comandos, entradas de valores em páginas
exibidas no navegador, executando tarefas como se fosse um
usuário real.
 Open Source(Licença Apache 2.0)
 Dois Sabores:
 Selenium Web Driver
 Selenium IDE
2. Visão Geral do Selenium
 Selenium IDE
 Permite “gravar” testes usando um plugin do Firefox
 Os testes são salvos como arquivos HTML
 Podem ser exportados para linguagens de programação:
O código exportado é geralmente frágil
Difícil manutenção
2. Visão Geral do Selenium
Script de Teste
em HTML
Selenium IDE
Plugin Firefox
2. Visão Geral do Selenium
 Quando usar?
 Deve ser usado apenas para criar scripts simples, para testes
exploratórios e possivelmente descartáveis
 Não devem ser usados para automação de grandes sistemas
Selenium Web Driver
3. Selenium Web Driver
 Testes são codificados utilizando alguma linguagem de
programação
 Testes mais robustos e escaláveis
 Permite que o teste seja distribuído em várias máquinas,
executado em diferentes tipos de navegadores e/ou
sistemas operacionais
3. Selenium Web Driver
 Os comandos são enviados para um driver que os
executa no navegador
 Cada navegador tem um driver específico
 Os testes podem ser executados na máquina local ou em
uma máquina remota (Selenium-Server)
 Os testes podem ser executados de forma distribuída
(Selenium-Grid)
3. Selenium Web Driver
Código-fonte Driver
3. Selenium Web Driver
 Etapas simplificadas de um script Selenium:
1. Inicializar o driver do navegador
2. Acessar(obter) a página do sistema que será testado
3. Obter um(alguns) elemento(s) da página
4. Executar alguma ação com esse(s) elemento(s)
5. Verificar o resultado da ação
3. Selenium Web Driver
1. Inicializar o driver do navegador
 Firefox:
 Chrome:
 Drivers disponíveis no site do Selenium
System.setProperty("webdriver.chrome.driver", “c:/chromedriver.exe");
WebDriver driver = new ChromeDriver();
System.setProperty("webdriver.gecko.driver", “c:/geckodriver.exe");
WebDriver driver = new FirefoxDriver();
http://www.seleniumhq.org/
3. Selenium Web Driver
2. Acessar(obter) a página do sistema que será testado
driver.get("http://www.ifpb.edu.br");
3. Obter um(alguns) elemento(s) da página
WebElement caixaBusca = driver.findElement(By.name("SearchableText"));
WebElement botaoPesquisar =
driver.findElement(By.className("searchButton"));
3. Selenium Web Driver
4. Executar alguma ação com esse(s) elemento(s)
5. Verificar o resultado da ação
caixaBusca.sendKeys("vestibular");
botaoPesquisar.click();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
List<WebElement> resultados =
driver.findElements(By.xpath("//div[@id='search-results']/dl/dt"));
Assert.assertTrue(resultados.size() > 1);
3. Selenium Web Driver
 Formas de obter elementos de interação na página Web:
 XPath
 ID(atributo id do HTML)
 Nome da Classe CSS (atributo class do HTML)
 Seletor CSS
 Nome(atributo name do HTML)
 Conteúdo de um Link
 Nome da Tag
3. Selenium Web Driver
 Muitas vezes é necessário sincronizar a execução do teste
com a dinâmica do site
 Tipos de sincronização:
 Sincronização implícita
 Sincronização explícita
3. Selenium Web Driver
 Sincronização implícita:
 O Selenium esperará uma certa quantidade de tempo, se o
elemento procurado na página não estiver disponível
 Se após o tempo configurado o elemento ainda não estiver
disponível na página, o teste falhará
 Vantagens: mais prático e menos linhas de código nos testes
 Desvantagem: tempo uniforme de espera
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
3. Selenium Web Driver
 Sincronização explícita:
 O desenvolvedor controla o tempo de espera(sincronização) do
teste a cada etapa
 Deve-se informar uma condição de espera
Ex: Elemento visível na tela, texto presente na tela, valor de um
atributo de um elemento HTML, etc.
 Mais flexível que a sincronização implícita.
WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath("//div[@id='search-results']/dl/dt")));
3. Selenium Web Driver
 Resumindo os principais métodos da API:
 driver.get()
 driver.findElement(By)
 webElement.click()
 webElement.sendKeys()
 driver.switchTo().window()
 driver.switchTo().alert().accept();
 webDriverWait.until()
 driver.navigate()
4. Padrão Page Object
4. Padrão Page Object
 Testes funcionais automáticos de sistemas Web são suscetíveis
à mudanças na interface
 Uma alteração em um componente da tela pode quebrar
todos os testes
 Se o código que interage com esse componente for
repetido em vários testes, todos irão quebrar
 Manutenção dos testes ficará mais custosa
4. Padrão Page Object
 Solução: Padrão de projeto Page Object
 Crie uma classe para cada tela do sistema usadas nos testes
 As classes devem abstrair o código Selenium que interage
com os elementos da tela.
 Único ponto de mudança
4. Padrão Page Object
 Forneça uma API fácil de usar e que permita fazer tudo
aquilo que um humano poderia fazer usando a tela
 Ex: Se a tela possui dos campos de texto e um botão, a
API deve fornecer métodos para
preencher/limpar/recuperar o valor desses dois campos
e um método para pressionar o botão.
4. Padrão Page Object
 Ao invés de:
WebElement caixaBusca = driver.findElement(By.name("SearchableText"));
WebElement botaoPesquisar =
driver.findElement(By.className("searchButton"));
caixaBusca.sendKeys("vestibular");
botaoPesquisar.click();
List<WebElement> resultados =
driver.findElements(By.xpath("//div[@id='search-results']/dl/dt"));
Assert.assertTrue(resultados.size() > 1);
4. Padrão Page Object
 Use page object:
PaginaPrincipalPO paginaPrincipal = new PaginaPrincipalPO();
PageFactory.initElements(driver, paginaPrincipal);
paginaPrincipal.setCampoBusca(("vestibular");
paginaPrincipal.pesquisar();
PaginaResultadosPO paginaResultados = new PaginaResultadosPO();
PageFactory.initElements(driver, paginaResultados);
int totalResultados = paginaResultados.getTotalResultados();
Assert.assertTrue(totalResultados > 1);
Os métodos do
PageObjects
abstraem o código
do Selenium
Inicializa uma
instância de page
object
4. Padrão Page Object
public class PaginaPrincipalPO {
@FindBy(name="SearchableText")
private WebElement campoBusca;
@FindBy(className="searchButton")
private WebElement botaoPesquisar;
public String getCampoBusca(){
return campoBusca.getAttribute("value");
}
public void setCampoBusca(String valor){
campoBusca.sendKeys(valor);
}
public void pesquisar(){
botaoPesquisar.click();
}
}
5. Boas Práticas
5. Boas Práticas
 Escolha bem a forma como localizar os elementos da tela
 Isso definirá o quão “forte” seu teste será em relação às
mudanças de interface
 Prefira localizar elementos HTML pelo seu ID (atributo id do
HTML) ou nome(atributo name)
 Não use ID quando eles forem gerados automaticamente
 Um mesmo valor de name pode ser utilizado em vários
elementos
5. Boas Práticas
 Se não for possível utilizar ID ou nome, use Xpath ou um
seletor CSS
 Monte uma expressão Xpath ou seletor CSS que seja
resistente em relação à mudanças na interface
 Exemplo de Xpath fraco:
driver.findElements(By.xpath("//div[1]/div/div/div[2]/form/input"));
5. Boas Práticas
 Exemplo de Xpath forte:
 Use o inspetor de elementos do Chorme/Firefox para auxiliar
na criação do Xpath ou do seletor CSS
 Use plug-ins disponíveis para o Chrome e Firefox
driver.findElements(By.xpath("//*[@id='search-results']/ol/li"));
5. Boas Práticas
5. Boas Práticas
 Mantenha o código de seus testes limpo e organizado
 Trate o código dos testes da mesma forma que o código de
produção
 Baixo acoplamento
 Alta coesão
 Evite repetições de código
 Use PageObjects
5. Boas Práticas
 Sempre coloque ID nos elementos HTML de suas páginas Web
 Lembre-se: o código de seus testes também será mantido por
outros desenvolvedores
Outras opções(pagas)
Links úteis
 http://www.seleniumhq.org/
 https://martinfowler.com/bliki/PageObject.html
 https://www.w3schools.com/xml/xpath_syntax.asp
 https://www.w3schools.com/cssref/css_selectors.asp
 http://www.istqb.org/
 http://www.bstqb.org.br/
Obrigado!
rodrigoagouveia@gmail.com
@rodrigoagouveia

Mais conteúdo relacionado

Mais procurados

Automacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com SeleniumAutomacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com SeleniumFabrício Lemos
 
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driverJúlio de Lima
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Usando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSFUsando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSFJadson Santos
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Selenium
SeleniumSelenium
Seleniumfatec
 
Curso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCurso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCristiano Caetano
 
#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?
#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?
#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?Mayara Fernandes
 
Framework de testes cecom
Framework de testes cecomFramework de testes cecom
Framework de testes cecomlucasbarsand
 
Assespro pr-workshop-robot framework
Assespro pr-workshop-robot frameworkAssespro pr-workshop-robot framework
Assespro pr-workshop-robot frameworkMayara Fernandes
 
Tutorial de instalação do Maven
Tutorial de instalação do MavenTutorial de instalação do Maven
Tutorial de instalação do MavenAllan Alves
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium Mayron Cachina
 
Testes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio NasTestes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio NasWordCamp Floripa
 
Vale Security Conference - 2011 - 6 - Thiago Bordini
Vale Security Conference - 2011 - 6 - Thiago BordiniVale Security Conference - 2011 - 6 - Thiago Bordini
Vale Security Conference - 2011 - 6 - Thiago BordiniVale Security Conference
 
Nem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkNem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkRodrigo Matola
 

Mais procurados (20)

Testes de carga com j meter
Testes de carga com j meterTestes de carga com j meter
Testes de carga com j meter
 
Automacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com SeleniumAutomacão de Testes Funcionais com Selenium
Automacão de Testes Funcionais com Selenium
 
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
13º É dia de Java: Automação de Testes Funcionais com Selenium Web driver
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Usando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSFUsando JMeter para testar sua aplicação JSF
Usando JMeter para testar sua aplicação JSF
 
Jmeter apresentacao
Jmeter apresentacaoJmeter apresentacao
Jmeter apresentacao
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Selenium
SeleniumSelenium
Selenium
 
Curso treinamento automação de testes com selenium
Curso treinamento automação de testes com seleniumCurso treinamento automação de testes com selenium
Curso treinamento automação de testes com selenium
 
#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?
#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?
#1 Robot Floripa - Robot Framework: O que é? Onde vive? Do que se alimenta?
 
Framework de testes cecom
Framework de testes cecomFramework de testes cecom
Framework de testes cecom
 
Assespro pr-workshop-robot framework
Assespro pr-workshop-robot frameworkAssespro pr-workshop-robot framework
Assespro pr-workshop-robot framework
 
Tutorial de instalação do Maven
Tutorial de instalação do MavenTutorial de instalação do Maven
Tutorial de instalação do Maven
 
Aula maven
Aula   mavenAula   maven
Aula maven
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 
Jboss tutorial
Jboss tutorialJboss tutorial
Jboss tutorial
 
Testes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio NasTestes automatizados end-to-end com WordPress por Fabio Nas
Testes automatizados end-to-end com WordPress por Fabio Nas
 
Vale Security Conference - 2011 - 6 - Thiago Bordini
Vale Security Conference - 2011 - 6 - Thiago BordiniVale Security Conference - 2011 - 6 - Thiago Bordini
Vale Security Conference - 2011 - 6 - Thiago Bordini
 
Nem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkNem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot Framework
 
Introdução ao maven
Introdução ao mavenIntrodução ao maven
Introdução ao maven
 

Semelhante a Introdução Automação Testes Selenium

Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosElias Nogueira
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaCharles Kilesse
 
Ruby para testers III - Selenium
Ruby para testers III - SeleniumRuby para testers III - Selenium
Ruby para testers III - SeleniumTestRock!
 
Automação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira ÁgilAutomação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira ÁgilElias Nogueira
 
Caipira agil automacao front end selenium
Caipira agil automacao front end seleniumCaipira agil automacao front end selenium
Caipira agil automacao front end seleniumQualister
 
[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com Codeception[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com CodeceptionQualister
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Vanderson Silva
 
[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)
[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)
[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)Júlio de Lima
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizadosCristian R. Silva
 
Curso Básico de Selenium
Curso Básico de SeleniumCurso Básico de Selenium
Curso Básico de SeleniumAutotic
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netRenato Groff
 
Testando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a pontaTestando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a pontatdc-globalcode
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETslides_teltools
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidiMasters
 

Semelhante a Introdução Automação Testes Selenium (20)

Selenium - WebDriver
Selenium - WebDriverSelenium - WebDriver
Selenium - WebDriver
 
cypress.pdf
cypress.pdfcypress.pdf
cypress.pdf
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completa
 
Ruby para testers III - Selenium
Ruby para testers III - SeleniumRuby para testers III - Selenium
Ruby para testers III - Selenium
 
Automação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira ÁgilAutomação de Teste em Front End - Caipira Ágil
Automação de Teste em Front End - Caipira Ágil
 
Caipira agil automacao front end selenium
Caipira agil automacao front end seleniumCaipira agil automacao front end selenium
Caipira agil automacao front end selenium
 
[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com Codeception[TDC2015] De unitário a aceitação: Automação de testes com Codeception
[TDC2015] De unitário a aceitação: Automação de testes com Codeception
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3
 
[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)
[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)
[TDC2016] Ruby in Tests: Automatizando testes de Unidade, API e GUI (Web)
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
Curso Básico de Selenium
Curso Básico de SeleniumCurso Básico de Selenium
Curso Básico de Selenium
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.net
 
Testando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a pontaTestando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
Testando sua aplicação asp.net mvc de forma automatizada de ponta a ponta
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps Android
 

Introdução Automação Testes Selenium

  • 1. Introdução à Automação de Testes com Selenium Rodrigo Gouveia
  • 2. Agenda 1. Introdução 2. Visão Geral do Selenium 3. Selenium WebDriver 4. O Padrão Page Object 5. Boas Práticas
  • 3. 1. Introdução Por que é importante testar software? Não é perda de tempo?
  • 5. 1. Introdução  Técnicas de Teste:  Caixa Branca  Caixa Preta(Funcional)  Caixa Cinza  Tipos de Teste  Manual  Automático,  Performance(carga, estresse),  Segurança  etc...
  • 6. 1. Introdução O que são testes funcionais? “Teste baseado na análise de especificação da funcionalidade de um componente ou sistema”
  • 7. 1. Introdução  Por que é importante automatizar testes?  Testes executados de forma mais rápida e mais barata  Feedback sobre qualidade do código  Permite aumentar a cobertura dos testes  Racionalização de recursos  Fiel reprodução do teste executado  Aumentar qualidade do produto final  Redução de custos(médio e longo prazo)
  • 8. Visão Geral do Selenium
  • 9. 2. Visão Geral do Selenium O que é Selenium? “Selenium Automatiza navegadores”
  • 10. 2. Visão Geral do Selenium  Realizar ações, comandos, entradas de valores em páginas exibidas no navegador, executando tarefas como se fosse um usuário real.  Open Source(Licença Apache 2.0)  Dois Sabores:  Selenium Web Driver  Selenium IDE
  • 11. 2. Visão Geral do Selenium  Selenium IDE  Permite “gravar” testes usando um plugin do Firefox  Os testes são salvos como arquivos HTML  Podem ser exportados para linguagens de programação: O código exportado é geralmente frágil Difícil manutenção
  • 12. 2. Visão Geral do Selenium Script de Teste em HTML Selenium IDE Plugin Firefox
  • 13.
  • 14. 2. Visão Geral do Selenium  Quando usar?  Deve ser usado apenas para criar scripts simples, para testes exploratórios e possivelmente descartáveis  Não devem ser usados para automação de grandes sistemas
  • 16. 3. Selenium Web Driver  Testes são codificados utilizando alguma linguagem de programação  Testes mais robustos e escaláveis  Permite que o teste seja distribuído em várias máquinas, executado em diferentes tipos de navegadores e/ou sistemas operacionais
  • 17. 3. Selenium Web Driver  Os comandos são enviados para um driver que os executa no navegador  Cada navegador tem um driver específico  Os testes podem ser executados na máquina local ou em uma máquina remota (Selenium-Server)  Os testes podem ser executados de forma distribuída (Selenium-Grid)
  • 18. 3. Selenium Web Driver Código-fonte Driver
  • 19. 3. Selenium Web Driver  Etapas simplificadas de um script Selenium: 1. Inicializar o driver do navegador 2. Acessar(obter) a página do sistema que será testado 3. Obter um(alguns) elemento(s) da página 4. Executar alguma ação com esse(s) elemento(s) 5. Verificar o resultado da ação
  • 20. 3. Selenium Web Driver 1. Inicializar o driver do navegador  Firefox:  Chrome:  Drivers disponíveis no site do Selenium System.setProperty("webdriver.chrome.driver", “c:/chromedriver.exe"); WebDriver driver = new ChromeDriver(); System.setProperty("webdriver.gecko.driver", “c:/geckodriver.exe"); WebDriver driver = new FirefoxDriver(); http://www.seleniumhq.org/
  • 21. 3. Selenium Web Driver 2. Acessar(obter) a página do sistema que será testado driver.get("http://www.ifpb.edu.br"); 3. Obter um(alguns) elemento(s) da página WebElement caixaBusca = driver.findElement(By.name("SearchableText")); WebElement botaoPesquisar = driver.findElement(By.className("searchButton"));
  • 22. 3. Selenium Web Driver 4. Executar alguma ação com esse(s) elemento(s) 5. Verificar o resultado da ação caixaBusca.sendKeys("vestibular"); botaoPesquisar.click(); driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); List<WebElement> resultados = driver.findElements(By.xpath("//div[@id='search-results']/dl/dt")); Assert.assertTrue(resultados.size() > 1);
  • 23. 3. Selenium Web Driver  Formas de obter elementos de interação na página Web:  XPath  ID(atributo id do HTML)  Nome da Classe CSS (atributo class do HTML)  Seletor CSS  Nome(atributo name do HTML)  Conteúdo de um Link  Nome da Tag
  • 24. 3. Selenium Web Driver  Muitas vezes é necessário sincronizar a execução do teste com a dinâmica do site  Tipos de sincronização:  Sincronização implícita  Sincronização explícita
  • 25. 3. Selenium Web Driver  Sincronização implícita:  O Selenium esperará uma certa quantidade de tempo, se o elemento procurado na página não estiver disponível  Se após o tempo configurado o elemento ainda não estiver disponível na página, o teste falhará  Vantagens: mais prático e menos linhas de código nos testes  Desvantagem: tempo uniforme de espera driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
  • 26. 3. Selenium Web Driver  Sincronização explícita:  O desenvolvedor controla o tempo de espera(sincronização) do teste a cada etapa  Deve-se informar uma condição de espera Ex: Elemento visível na tela, texto presente na tela, valor de um atributo de um elemento HTML, etc.  Mais flexível que a sincronização implícita. WebDriverWait wait = new WebDriverWait(driver, timeout); wait.until(ExpectedConditions.visibilityOfElementLocated( By.xpath("//div[@id='search-results']/dl/dt")));
  • 27. 3. Selenium Web Driver  Resumindo os principais métodos da API:  driver.get()  driver.findElement(By)  webElement.click()  webElement.sendKeys()  driver.switchTo().window()  driver.switchTo().alert().accept();  webDriverWait.until()  driver.navigate()
  • 28. 4. Padrão Page Object
  • 29. 4. Padrão Page Object  Testes funcionais automáticos de sistemas Web são suscetíveis à mudanças na interface  Uma alteração em um componente da tela pode quebrar todos os testes  Se o código que interage com esse componente for repetido em vários testes, todos irão quebrar  Manutenção dos testes ficará mais custosa
  • 30. 4. Padrão Page Object  Solução: Padrão de projeto Page Object  Crie uma classe para cada tela do sistema usadas nos testes  As classes devem abstrair o código Selenium que interage com os elementos da tela.  Único ponto de mudança
  • 31. 4. Padrão Page Object  Forneça uma API fácil de usar e que permita fazer tudo aquilo que um humano poderia fazer usando a tela  Ex: Se a tela possui dos campos de texto e um botão, a API deve fornecer métodos para preencher/limpar/recuperar o valor desses dois campos e um método para pressionar o botão.
  • 32. 4. Padrão Page Object  Ao invés de: WebElement caixaBusca = driver.findElement(By.name("SearchableText")); WebElement botaoPesquisar = driver.findElement(By.className("searchButton")); caixaBusca.sendKeys("vestibular"); botaoPesquisar.click(); List<WebElement> resultados = driver.findElements(By.xpath("//div[@id='search-results']/dl/dt")); Assert.assertTrue(resultados.size() > 1);
  • 33. 4. Padrão Page Object  Use page object: PaginaPrincipalPO paginaPrincipal = new PaginaPrincipalPO(); PageFactory.initElements(driver, paginaPrincipal); paginaPrincipal.setCampoBusca(("vestibular"); paginaPrincipal.pesquisar(); PaginaResultadosPO paginaResultados = new PaginaResultadosPO(); PageFactory.initElements(driver, paginaResultados); int totalResultados = paginaResultados.getTotalResultados(); Assert.assertTrue(totalResultados > 1); Os métodos do PageObjects abstraem o código do Selenium Inicializa uma instância de page object
  • 34. 4. Padrão Page Object public class PaginaPrincipalPO { @FindBy(name="SearchableText") private WebElement campoBusca; @FindBy(className="searchButton") private WebElement botaoPesquisar; public String getCampoBusca(){ return campoBusca.getAttribute("value"); } public void setCampoBusca(String valor){ campoBusca.sendKeys(valor); } public void pesquisar(){ botaoPesquisar.click(); } }
  • 36. 5. Boas Práticas  Escolha bem a forma como localizar os elementos da tela  Isso definirá o quão “forte” seu teste será em relação às mudanças de interface  Prefira localizar elementos HTML pelo seu ID (atributo id do HTML) ou nome(atributo name)  Não use ID quando eles forem gerados automaticamente  Um mesmo valor de name pode ser utilizado em vários elementos
  • 37. 5. Boas Práticas  Se não for possível utilizar ID ou nome, use Xpath ou um seletor CSS  Monte uma expressão Xpath ou seletor CSS que seja resistente em relação à mudanças na interface  Exemplo de Xpath fraco: driver.findElements(By.xpath("//div[1]/div/div/div[2]/form/input"));
  • 38. 5. Boas Práticas  Exemplo de Xpath forte:  Use o inspetor de elementos do Chorme/Firefox para auxiliar na criação do Xpath ou do seletor CSS  Use plug-ins disponíveis para o Chrome e Firefox driver.findElements(By.xpath("//*[@id='search-results']/ol/li"));
  • 40. 5. Boas Práticas  Mantenha o código de seus testes limpo e organizado  Trate o código dos testes da mesma forma que o código de produção  Baixo acoplamento  Alta coesão  Evite repetições de código  Use PageObjects
  • 41. 5. Boas Práticas  Sempre coloque ID nos elementos HTML de suas páginas Web  Lembre-se: o código de seus testes também será mantido por outros desenvolvedores
  • 43. Links úteis  http://www.seleniumhq.org/  https://martinfowler.com/bliki/PageObject.html  https://www.w3schools.com/xml/xpath_syntax.asp  https://www.w3schools.com/cssref/css_selectors.asp  http://www.istqb.org/  http://www.bstqb.org.br/