Python
Python
2
1.1 1.13
1.2 1.14
1.3 1.15
1.4 1.16
1.5 1.17
1.6 1.18
1.7 1.19
1.8 1.20
1.9 1.21
1.10 1.22
1.11 1.23
1.12 1.23.1
3
Introdução
Introdução
Este livro é um guia prático para dezenas de maneiras específicas que você pode usar
para obter o máximo do WebDriver em seu desenvolvimento de automação de
testes. Este manual prático oferece soluções instantaneamente úteis para áreas
importantes, como a interação e o teste de aplicativos da Web e o uso das APIs do
WebDriver. Durante a leitura, você passará dos fundamentos do WebDriver às
práticas obrigatórias, desde como interagir, controlar e verificar páginas da Web e
tratamento de exceções até interações mais complexas, como objetos de página,
alertas e JavaScript, além de testes em dispositivos móveis e muito mais.
Por fim, você aprenderá a criar sua própria estrutura. Ao final do livro, você estará
confiante e capacitado para testar seus aplicativos Web com o WebDriver.
Sobre a tecnologia
Os aplicativos da Web são difíceis de testar porque muito depende da maneira
como o usuário interage com páginas individuais. A estrutura de teste da Web do
Selenium WebDriver ajuda a criar automação de teste confiável e de fácil
manutenção para seus aplicativos da Web em vários navegadores, sistemas
operacionais e linguagens de programação. Assim como um ser humano, ele pode
clicar em links, preencher formulários e ler as páginas da Web e, ao contrário de
um ser humano, não fica entediado. O WebDriver pode fazer quase tudo o que
você pedir - o truque é criar uma abordagem unificada para os testes. Felizmente,
é nesse ponto que este livro realmente se destaca.
O que há dentro
Técnicas específicas e práticas do WebDriver
4
Introdução
Depoimentos
5
Introdução
Agradecimentos
Agradecemos aos seguintes colaboradores:
entropicrune
Edko24
PulwerJR
Errata e discussão
Se você encontrar algum erro ou problema neste livro, ou se quiser falar sobre o
conteúdo:
https://github.com/selenium-webdriver-book/manuscript/issues
Sobre o leitor
4
Introdução
Este livro pressupõe que você se sinta à vontade para ler códigos em Java ou em uma
linguagem semelhante e que conheça os conceitos básicos de criação e teste de
aplicativos. Não é necessário ter experiência com o WebDriver.
Sobre os autores
5
Parte 1:
Fundamentos
Parte 1: Fundamentos
Nesta seção, apresentaremos o Selenium WebDriver. Ensinaremos técnicas comuns
que são úteis para escrever testes, como localizar, interagir e verificar elementos.
Também mostraremos como tornar seu código mais fácil de manter usando Page
Objects e como lidar com erros* Ao final desta seção, você será capaz de escrever
código para muitas páginas da Web comuns.
6
Capítulo 1: Primeiros
passos
O que é o WebDriver?
"Olá, WebDriver!"
Atualmente, cada vez mais transações comerciais são realizadas na Internet por
meio de páginas da Web criadas por pessoas. Alguns sites são simples o suficiente
para serem configurados por uma ou duas pessoas, mas outros são tão complexos
que são criados por centenas ou até milhares de desenvolvedores. Antes de cada
lançamento, o site deve ser testado para garantir que esteja livre de bugs críticos. É
demorado testar todo o site manualmente e, à medida que o site cresce, o custo
dos testes também aumenta. Mais do que isso, com o passar do tempo, um novo
recurso que foi bem testado quando foi disponibilizado pela primeira vez pode ser
esquecido mais tarde - corremos o risco de perder a consistência e a qualidade e,
como resultado, surgem bugs no que pensávamos ser peças sólidas de
funcionalidade.
Antes do Selenium WebDriver, havia o Selenium 1.0, que permitia a automação por
meio da injeção de JavaScript em páginas da Web. O WebDriver é uma
reinvenção dessa ideia, mas é mais confiável, mais poderoso e mais
dimensionável.
O Selenium evoluiu, assim como a World Wide Web. HTML5 e CSS3 agora são padrão;
os aplicativos da Web ricos em AJAX não são mais nem mesmo de ponta. Isso significa
que a automação da Web é agora um tópico mais complexo e interessante.
7
Capítulo 1: Primeiros
passos
Este capítulo abordará rapidamente os conceitos básicos, garantindo que, ao final dele,
você compreenda a arquitetura básica e possa escrever código básico.
8
Capítulo 1: Primeiros
passos
Neste capítulo, apresentaremos o WebDriver, o que ele é, como funciona e os
motivos para escolhê-lo. Também falaremos brevemente sobre algumas ferramentas
que usamos neste livro, as quais recomendamos a todos os desenvolvedores.
Também falaremos brevemente sobre algumas das ferramentas que usamos neste
livro, as q u a i s recomendamos a todos os desenvolvedores.
O que é o WebDriver?
O Selenium WebDriver automatiza os navegadores da Web. Ele fica no lugar da pessoa
que está usando um navegador da Web. Como um usuário, ele pode abrir um site,
clicar em links, preencher formulários e navegar. Ele também pode examinar a página,
observando os elementos nela contidos e fazendo escolhas com base no que vê.
O caso de uso mais comum do WebDriver é o teste automatizado. Até pouco tempo
atrás, para executar um teste de regressão em seu site, era necessário ter um
conjunto de scripts que deveriam ser executados manualmente por desenvolvedores
ou QAs. Todos os relatórios também precisariam ser agrupados manualmente. Isso
pode ser demorado e caro. Em vez disso, o WebDriver pode ser usado para
executar esses scripts e reunir automaticamente relatórios sobre o sucesso deles,
bastando pressionar um botão. Cada execução subsequente não será mais cara do
que a primeira.
9
Capítulo 1: Primeiros
passos
10
Capítulo 1: Primeiros
passos
Já se foi o tempo em que você precisava criar uma versão do seu site para o Internet
Explorer 6, um navegador difundido e notoriamente não compatível com os padrões, e
outra para outros navegadores. Embora a maioria dos navegadores modernos seja
muito mais consistente em seu comportamento, a aparência ou o comportamento
de uma página da Web ainda pode variar muito, pois o número de diferentes
navegadores, sistemas operacionais e plataformas de uso comum aumentou. Um
cliente de alto valor ainda pode reclamar que não consegue acessar seu site.
Historicamente, a única maneira de mitigar isso era ter um exército de QAs testando
manualmente em uma variedade de configurações diferentes, um processo demorado e
caro. O WebDriver pode executar testes em diferentes sistemas operacionais e
configurações de navegadores, e em uma fração do tempo de um ser humano.
Além disso, você pode usá-lo para executá-los de forma muito mais consistente e
confiável do que um testador manual.
Aplicativos e sites oferecem serviços úteis, mas, às vezes, eles só podem ser
acessados por páginas da Web. Outro caso de uso do WebDriver é tornar essas
páginas acessíveis aos aplicativos por meio do WebDriver. Talvez você tenha um
aplicativo de administração escrito há vários anos e um cliente ou proprietário de
produto tenha solicitado a automatização de algumas ações nele. Mas talvez
ninguém saiba onde está o código-fonte. Pode ser muito mais fácil usar o
WebDriver para automatizar essa tarefa.
1. Um navegador da Web.
3. Uma vinculação de linguagem (no nosso caso, Java) que faz solicitações HTTP
para essa API.
11
Capítulo 1: Primeiros
passos
O plug-in geralmente pode ser visto nas preferências do navegador, como na figura 1.3.
12
Capítulo 1: Primeiros
passos
O WebDriver imita mais de perto um usuário. Sempre que possível, ele usa eventos
nativos para operar, a fim de torná-lo preciso e estável.
O WebDriver se tornará um padrão W3C, portanto, você pode esperar que ele
seja suportado por um longo tempo.
O WebDriver tem uma sintaxe mais concisa do que o Selenium 1.0, o que torna
mais rápido escrever código.
13
Capítulo 1: Primeiros
passos
O que o WebDriver não pode fazer
14
Capítulo 1: Primeiros
passos
O WebDriver fornece uma maneira de controlar um navegador da Web, mas isso é
tudo. Quando você compra um carro novo, recebe um manual que informa como
operar o rádio e como trocar o óleo. Mas esse manual não informa o melhor lugar
para fazer a manutenção do carro nem ensina a dirigir. Assim como dirigir um
carro, há coisas que você deve fazer por si mesmo. Aqui estão algumas coisas que
o WebDriver não faz:
O WebDriver não sabe quando as coisas foram alteradas na página, portanto, você
não pode pedir que ele informe quando as coisas foram alteradas.
O WebDriver não fornece muitos utilitários para escrever seu código. Você precisa
escrevê-los por conta própria.
O WebDriver não oferece suporte integrado para elementos de página que são
compostos de vários elementos, como calendários JavaScript.
O WebDriver não fornece uma estrutura para escrever seu código. O JUnit é
uma escolha natural.
O WebDriver não gerencia o navegador. Por exemplo, você precisa fazer a limpeza
depois de usá-lo.
O WebDriver não instala nem mantém seus navegadores. Você precisa fazer isso
A história do selênio
O Selenium é um conjunto de ferramentas de teste da Web, incluindo o Selenium
IDE, o Selenium RC, o Selenium WebDriver e o Selenium Grid. O primeiro Selenium
é chamado Selenium Core, que saiu do escritório da ThoughtWorks em Chicago e foi
desenvolvido por Jason Huggins. Ele foi escrito para simular a ação de um usuário
humano com o Internet Explorer. Ele era diferente dos tipos de ferramentas
Record/Replay de outros fornecedores, pois não exigia uma ferramenta GUI
adicional para suportar sua operação. Precisava apenas do Java, que a maioria dos
desenvolvedores já tinha instalado em seus computadores.
15
Capítulo 1: Primeiros
passos
permite aos usuários gravar uma sessão de navegação no navegador, que pode ser
reproduzida posteriormente. O Selenium IDE foi integrado ao Firefox e forneceu a
mesma função de registro/reprodução que as outras ferramentas proprietárias.
16
Capítulo 1: Primeiros
passos
Como o Selenium IDE é uma ferramenta gratuita, ele logo conquistou uma grande fatia
do mercado entre os QAs e analistas de negócios que não tinham as habilidades de
programação necessárias para usar o Selenium Core. Mais tarde, o Selenium Core
evoluiu para o Selenium RC ("RC" significa "Controle Remoto"), juntamente com o
Selenium Grid, que permitia que os testes fossem executados em várias máquinas
ao mesmo tempo.
Hoje, quando as pessoas falam sobre "Selenium", geralmente estão falando sobre
o Selenium WebDriver.
17
Capítulo 1: Primeiros
passos
JavaScript, CSS e HTML - são as mesmas, independentemente da linguagem em que
você está escrevendo seus testes. Se você estiver usando uma das muitas linguagens
compatíveis com o WebDriver, como
18
Capítulo 1: Primeiros
passos
como C#, Ruby ou Python, você deve ser capaz de replicar muitas das técnicas deste
livro.
Você pode verificar se (e qual versão de) o JDK já está instalado em um terminal
usando o comando javac:
$ javac -versão
javac 1.8.0_20
Observe que é comum se referir a uma versão do Java pelo dígito do meio do
número completo da versão, portanto, "Java 1.8" é normalmente conhecido como
"Java 8".
Apache Maven
Ao longo deste livro, usaremos a ferramenta de compilação Apache Maven para
gerenciar nosso código. O principal motivo disso é que o Maven pode gerenciar as
muitas dependências de que precisamos para criar um aplicativo. Você pode verificar
se tem o Maven instalado no terminal:
$ mvn -version
Apache Maven 3.3.1
Caso não o tenha instalado, os usuários do Linux podem instalá-lo usando seu
gerenciador de pacotes (por exemplo, Apt ou Yum), e os usuários do OS X podem
instalá-lo usando o gerenciador de pacotes Homebrew (http://brew.sh)
19
Capítulo 1: Primeiros
passos
Ou (no Ubuntu Linux):
Google Chrome
O navegador Chrome é o navegador com o melhor suporte. Ao contrário de outros
navegadores, ele está disponível em todas as plataformas, é compatível com os
padrões e tem uma integração simples e pronta para uso com o WebDriver.
Mais adiante no livro, examinaremos outros navegadores, como o Firefox, mas ter o
Chrome instalado agora o ajudará a passar pelos primeiros capítulos.
Git
Você precisará instalar o Git se quiser conferir o código-fonte deste livro. No
OS-X usando o Brew:
O projeto de teste
Como parte desse projeto, colocamos todo o código-fonte no sistema de
controle de versão Git. Ele contém todo o código de amostra, bem como um
pequeno site no qual o código é executado.
20
Capítulo 1: Primeiros
passos
Você pode obter isso executando estes comandos:
O projeto tem um servidor da Web integrado que pode ser iniciado digitando o
seguinte:
mvn jetty:run
mvn verify
"Olá, WebDriver!"
Vamos dar uma olhada em um exemplo de uso do WebDriver para automatizar
uma tarefa básica e terminar com um exemplo funcional. Um script de automação
do WebDriver geralmente consiste em várias operações:
21
Capítulo 1: Primeiros
passos
2. Abra uma página da Web.
3. Interagir com essa página, por exemplo, clicando em links ou inserindo texto.
pom.xml
<groupId>hello-webdriver</groupId>
<artifactId>hello-webdriver</artifactId>
<versão>1.0.0-SNAPSHOT</versão>
<dependências>
<dependência>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId> (1)
<versão>LATEST</versão> (2)
<escopo>teste</scope>
</dependência>
<dependência>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<versão>4.12</versão>
<escopo>teste</scope>
</dependência>
</dependências>
<construção>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<versão>3.3</versão>
<configuração>
<fonte>1,8</fonte> (3)
<target>1.8</target>
</configuração>
</plugin>
<plugin>
22
Capítulo 1: Primeiros
passos
<artifactId>maven-failsafe-plugin</artifactId>
<versão>2.18.1</versão>
<execuções>
<execução>
<objetivos>
<objetivo>teste de integração</objetivo> (4)
<objetivo>verificar</objetivo>
</goals>
</execução>
</execuções>
</plugin>
</plugins>
</build>
</projeto>
Para iniciar o driver, você precisará de um programa binário especial para iniciá-lo. Para
o Chrome, ele se chama chromedriver e pode ser encontrado em
https://sites.google.com/a/chromium.org/chromedriver/downloads. Faça o download e
salve-o na raiz do projeto.
Criar src/test/java/swb/intro/HelloWebDriverIT.java :
HelloWebDriverIT.java
23
Capítulo 1: Primeiros
passos
pacote swb.ch01intro;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By; (1)
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
@Antes
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "chromedriver"); (3)
driver = new ChromeDriver(); (4)
}
@Após
public void tearDown() throws Exception {
driver.quit(); (5)
}
@Teste
public void helloWebDriver() throws Exception {
driver.get("http://localhost:8080/hello-webdriver.html"); (6)
WebElement pageHeading
= driver.findElement(By.tagName("h1")); (7)
assertEquals("Hello WebDriver!",
pageHeading.getText()); (8)
}
}
3. Informe ao driver da Web, por meio dessa propriedade do sistema, o local do binário
do driver.
24
Capítulo 1: Primeiros
passos
4. Crie um novo driver que se conecte a uma instância do navegador Chrome.
25
Capítulo 1: Primeiros
passos
5. Certifique-se de que o navegador seja encerrado quando o teste for concluído.
Você precisará iniciar o projeto de teste conforme mostrado na seção anterior antes
de executar o teste. Em seguida, ao executar o teste, você deverá ver o navegador
abrir uma página semelhante à figura Hello WebDriver.
Resumo
Você pode usar o WebDriver para economizar tempo e dinheiro automatizando as
tarefas do navegador.
Há alguns ótimos motivos para usar o WebDriver em vez de testes manuais. Por
exemplo, você pode economizar custos e melhorar a qualidade ao mesmo
tempo.
Você precisa de algumas ferramentas para começar. Neste livro, usaremos o Maven
e o Java.
1. https://maven.apache.org/surefire/maven-failsafe-plugin/
26
Capítulo 2: Localização de elementos
em uma página
Como usuário, a primeira coisa que você faz ao abrir uma página da Web é tentar
encontrar a parte da página em que está interessado. Se for a nossa rede social,
pode ser o ícone de novas mensagens; se for o nosso banco on-line, pode ser o
nosso saldo. Em seguida, você usa essas informações para considerar suas ações.
Da mesma forma, o WebDriver oferece uma ampla variedade de métodos para
localizar elementos em uma página. Isso nos permite examinar a página e verificar
se estamos vendo o que esperamos.
27
Capítulo 2: Localização de elementos
em uma página
Não apenas apresentaremos todos os principais métodos de localização de
elementos, mas também abordaremos para que cada um deles é mais adequado,
bem como as práticas de organização. Por fim, veremos como tornar o site que você
está automatizando fácil de automatizar.
28
Capítulo 2: Localização de elementos
em uma página
Ao final do capítulo, você terá uma excelente caixa de ferramentas com estratégias
robustas para localizar elementos de todos os tipos.
Essa interface fornece dois métodos: um que encontra todos os elementos que
correspondem a uma instância do que é conhecido como localizador e um segundo que
encontra o primeiro elemento que corresponde ou lança uma NoSuchElementException se
ele não for encontrado. Isso significa que o
O método findElements é útil para localizar elementos quando você não tem
certeza se eles estarão na página ou se deseja ter certeza de que eles não estão
na página.
O que é um localizador?
Um localizador descreve o que você deseja encontrar, e há um zoológico deles. Em
Java, você cria um localizador usando a classe By. Vamos dar uma olhada em um
exemplo de localização de um elemento de título h1 na página atual:
29
Capítulo 2: Localização de elementos
em uma página
Conforme discutido, há vários localizadores de núcleo que podem ser usados para
localizar elementos em uma página.
Localizador Uso
30
Capítulo 2: Localização de elementos
em uma página
driver.findElement(By.linkText("Forgotten Password"));
Qualquer parte da cadeia de caracteres "Forgotten Password" pode ser usada como
parâmetro para esse método:
driver.findElement(By.partialLinkText("Forgotten Password"));
driver.findElement(By.partialLinkText("Forgotten "));
driver.findElement(By.partialLinkText("en Passwo"));
Você deve ser cauteloso ao usar findElement com esse localizador. Você pode
encontrar outros elementos que contenham o mesmo texto parcial, portanto, ele não
deve ser usado para localizar um único elemento isoladamente. Naturalmente, você
pode usá-lo para localizar um grupo de elementos usando o método findElements.
31
Capítulo 2: Localização de elementos
em uma página
para localizá-lo:
32
Capítulo 2: Localização de elementos
em uma página
driver.findElement(By.className("btn"))
Localização por ID
A localização de um elemento por seu atributo id pode ser expressa da seguinte
forma:
driver.findElement(By.id("change-password"))
driver.findElement(By.name("email"));
33
Capítulo 2: Localização de elementos
em uma página
Esse localizador localiza elementos pelo nome da tag HTML. Como muitas vezes há
muitos usos repetidos da maioria das tags, nem sempre é possível usar esse método
para localizar um único elemento. Mas ele pode ser combinado com outros
localizadores para localizar elementos de forma eficaz. Uma das vezes em que ele
será útil é para localizar o cabeçalho da página, pois geralmente há apenas um
deles:
<h1>Bem-vindo ao WebDriver!</h1>
driver.findElement(By.tagName("h1"));
#change-password
Os seletores CSS podem ser usados para localizar a maioria dos outros seletores.
Você pode deduzir que, se não conseguir localizar o elemento usando um seletor
CSS, não conseguirá localizar o elemento usando qualquer localizador de
atributo id, nome de classe ou nome.
34
Capítulo 2: Localização de elementos
em uma página
Os seletores CSS podem ser mais lentos do que outros localizadores, e vale a pena
ter isso em mente se estiver pensando em usá-los. Este livro está focado no ensino
do WebDriver, não no ensino de CSS, portanto, você pode obter mais informações
sobre CSS no site da Mozilla: https://developer.mozilla.org/en-
US/docs/Web/CSS/Tutorials.
O CSS é uma boa opção se você não conseguir localizar um elemento pelo nome ou ID.
Vamos dar uma olhada em um exemplo de uso de um XPath para esse HTML:
driver.findElement(By.xpath("//a[@id='change-password']"));
Você pode usar o Web Developer Tools no Chrome para descobrir os XPaths e os
seletores CSS. O XPath que você obtém da ferramenta é //*[@id="change-password"]
, que pode ser usado diretamente, como na figura Copiando um XPath.
35
Capítulo 2: Localização de elementos
em uma página
Espero que você possa perceber que tem o mesmo poder que os seletores CSS, mas a
complexidade é muito maior.
Vamos dar uma olhada em alguns XPaths úteis, que são difíceis de fazer usando
outros localizadores.
retorna o texto do elemento e de todos os elementos que ele contém. Isso é útil se você
quiser localizar um parágrafo de texto que contenha algum estilo:
Aqui combinamos normalize-space com contains . Você pode usar isso para
localizar um elemento dentro de um elemento pai.
36
Capítulo 2: Localização de elementos
em uma página
Essa é uma expressão poderosa. Ela encontra um link em um parágrafo que
contém a frase "A visible paragraph" (Um parágrafo visível). O principal desafio das
expressões XPath é sua complexidade. Elas demoram um pouco para serem
aprendidas e, como não há segurança de tipo ou suporte completo automático na
maioria dos IDEs, pode ser caro trabalhar com elas e mantê-las.
O XPath é uma boa opção, mas geralmente é melhor tentar resolver os problemas
de localização usando primeiro os localizadores de CSS, nome ou ID, pois eles são
mais fáceis de entender para você e sua equipe.
37
Capítulo 2: Localização de elementos
em uma página
anotados:
InputBy.java
38
Capítulo 2: Localização de elementos
em uma página
Você notará que o construtor é privado para evitar a instanciação da classe. Para
ElementBy.java
<input name="email">
39
Capítulo 2: Localização de elementos
em uma página
input[name='email']
Ou vários atributos:
input[type='text'][name='email']
Observe que se o atributo for seu valor padrão, como o tipo poderia ser neste exemplo,
então seus valores serão indefinidos. Você não conseguirá localizá-lo dessa
forma.
<input name="password">
input[name^='passw']
Pelo sufixo:
<input name="password">
input[name$='sword']
<input name="password">
input[name*='sswor']
<input name="password">
<input type="submit">
input[name='password'] + input[type='submit']
40
Capítulo 2: Localização de elementos
em uma página
Ou, mais livremente, por qualquer elemento irmão:
input[name='email'] ~ input[type='submit']
<div>
<input name="email">
</div>
<form>
<div>
<input name="email">
</div>
</form>
entrada de formulário[name='email']
Você perceberá que a maioria dos exemplos aqui não contém mais do que dois
elementos. Isso é intencional. Pense nesse seletor longo:
Se você removesse uma dessas divs, o seletor se tornaria inválido. Considere este,
sugerido pelo Chrome:
Se as divs fossem reordenadas, isso não seria mais válido. Seletores ideais e
fáceis de manter são concisos e precisos.
41
Capítulo 2: Localização de elementos
em uma página
As tabelas HTML são uma forma comum de layout de dados em uma página da
Web. Como você pode querer localizar células pelo título da coluna da célula, é
necessário fazer uma série de pesquisas. Vamos ver uma técnica para tornar o
acesso a elas menos complexo.
Você deseja localizar elementos de forma robusta em uma tabela, mas as tabelas
podem mudar e as colunas podem ser reordenadas.
Localizar células de tabela usando seletores CSS. Você pode acessar as células de
uma tabela HTML usando seletores CSS. Considere a tabela de usuários na figura
Tabela de usuários http://localhost:8080/users-table.html.
users-table.html - http://localhost:8080/users-table.html
42
Capítulo 2: Localização de elementos
em uma página
1. No tbody da tabela
2. 1ª linha
3. 3ª coluna
Aqui está um seletor que encontrará "John Doe" na tabela da figura Tabela de
usuários http://localhost:8080/users-table.html:
Esse seletor localiza a terceira célula da primeira linha da tabela com o ID users-
table body. Isso é típico do acesso à tabela: localizar a célula nas coordenadas x/y.
Observe que a indexação é de 1 para N em vez de 0 para N-1. Esse seletor tem
uma consulta XPath equivalente:
//table[@id='users-table']/tbody/tr[1]/td[3]
43
Capítulo 2: Localização de elementos
em uma página
Nossa primeira tarefa é encontrar o índice da coluna que você deseja. Como você
deseja obter uma célula pelo título da coluna, pode fazer o seguinte:
TableIT.java
int columnNumber = 1;
while (!driver
.findElement(By.cssSelector(String.format("table#users-table th:nth-c
hild(%d)", columnNumber)))
.getText().equals("Name")) {
columnNumber++;
}
Esse loop será interrompido quando encontrar o cabeçalho; caso contrário, ele será
encerrado com um
NoSuchElementException se não conseguir encontrá-lo. Você pode encontrar a linha com
base no número retornado.
Por.cssSelector(
String.format("table#users-table tbody tr:nth-child(1) td:nth-child(%d)",
columnNumber))
Esse é um bom primeiro exemplo de como trabalhar com uma seção do DOM
de uma página, e não com um único elemento. Certas estruturas de página,
como formulários e tabelas, são razoavelmente complexas, e as relações entre
os elementos dentro delas são importantes para localizar o elemento específico
no qual você está interessado.
Essa também é uma ótima oportunidade para criar uma fábrica de localizadores:
TdBy.java
Você perceberá que pode usar localizadores baseados em XPath e CSS de forma
intercambiável. Mas quando você deve usar o XPath e quando deve usar o seletor CSS?
Não há regras rígidas e rápidas, mas como os XPaths são orientados pela estrutura do
documento que você está usando, é possível usar o seletor CSS.
44
Capítulo 2: Localização de elementos
em uma página
observando e CSS em torno do estilo, você pode se perguntar: "Estou localizando
com base na estrutura ou com base no estilo?"
WebElement implementa SearchContext . Isso significa que você pode encadear chamadas
para restringir o contexto até encontrar o elemento. Vamos dar uma olhada no HTML
bruto da página de login:
login.html - http://localhost:8080/login.html
<div class="container">
<h1>Login</h1>
A classe btn é usada duas vezes aqui. Para localizar o link "Forgotten Password", você
pode encadear duas chamadas findElement para encontrar exatamente o que deseja:
ChainedLocatorsIT.java
45
Capítulo 2: Localização de elementos
em uma página
motorista
.findElement(By.className("forgotten-password")) (1)
.findElement(By.tagName("a")); (2)
Você tem várias maneiras de pesquisar elementos comuns. Se o elemento for mais
difícil de encontrar, você poderá usar uma cadeia de invocações de findElement
para restringir o contexto da pesquisa até obter o elemento desejado. Isso é
realmente eficaz quando se trabalha com formulários. Você pode localizar o
formulário com um localizador cuidadosamente criado e, em seguida, ser um pouco
mais solto para encontrar os elementos que deseja dentro do formulário:
ChainedLocatorsIT.java
Composição do localizador
Você viu que realizamos repetidamente a mesma operação: encontrar um elemento
em uma página e, em seguida, restringir o escopo para encontrar outro elemento.
Você já viu isso com formulários e tabelas. O que você deve tentar fazer é manter
os localizadores simples: localizar uma célula em uma tabela ou uma entrada em
um formulário. Você pode combiná-los para fornecer uma localização mais
complexa.
O WebDriver não fornece isso de imediato, mas a biblioteca de suporte tem vários
localizadores úteis.
46
Capítulo 2: Localização de elementos
em uma página
las em seu
47
Capítulo 2: Localização de elementos
em uma página
projeto.
Pode ser que os desenvolvedores precisem alterar o nome para j_password . Você pode
negociar com eles para adicionar um ID a ele:
driver.findElement(new ByIdOrName("password"));
Isso funcionará antes e depois de a alteração ter sido feita. Um aspecto a ser
observado é que, se você usar ByIdOrName com findElements (plural), obterá o
superconjunto de elementos que correspondem: todos os elementos que têm o ID e
o nome.
Localizadores encadeados
Esse localizador executa uma sequência de correspondências, pesquisando no DOM
para encontrar o elemento. Provavelmente, a melhor explicação é usar um exemplo de
localização da entrada de e-mail no formulário de registro, mas sem usar nenhum
atributo principal da entrada de e-mail:
48
Capítulo 2: Localização de elementos
em uma página
3. encontrar uma e n t r a d a
LocalizadorComposiçãoIT.java
driver.findElement(
novo ByChained(
By.id("registration-form"),
By.xpath("//label[contains(.,'Email')]"),
By.tagName("input")
)
);
driver.findElement(By.id("registration-form"))
.findElement(By.xpath("//label[contains(.,'Email')]"))
.findElement(By.tagName("input"));
49
Capítulo 2: Localização de elementos
em uma página
Imagine que uma nova versão do seu site será lançada. Mas o HTML foi alterado de
modo que seus localizadores não funcionam mais - frustrante! Você pode atualizar
o localizador para a nova versão, mas isso pode não estar concluído ainda, ou pode
deixar seus testes "vermelhos" e garantir que todos saibam que eles precisam ser
atualizados em algum momento no futuro. Ou você pode garantir que seu teste seja
aprovado tanto com o código antigo quanto com o novo.
Esta técnica lhe mostrará como.
AllBy.java
@Override
public List<WebElement> findElements(SearchContext context) {
List<WebElement> elements = null;
para (By by : bys) {
List<WebElement> newElements = context.findElements(by);
Se (elementos == nulo) {
elements = newElements; (2)
} else {
elements.retainAll(newElements); (3)
}
}
retornar elementos;
}
}
50
Capítulo 2: Localização de elementos
em uma página
Você pode usá-lo da
seguinte forma:
LocatorCompositionIT.java
driver.findElement(AllBy.all(By.tagName("input"), By.name("password")))
AnyBy.java
@Override
public List<WebElement> findElements(SearchContext context) {
List<WebElement> elements = new ArrayList<>();
for (By by : bys) {
elements.addAll(context.findElements(by)); (1)
}
retornar elementos;
}
}
seguinte forma:
LocatorCompositionIT.java
driver.findElement(AnyBy.any(By.id("email"), By.name("email")))
NotBy.java
51
Capítulo 2: Localização de elementos
em uma página
@Override
public List<WebElement> findElements(SearchContext context) {
List<WebElement> elements =
context.findElements(By.cssSelector("*")); (1)
elements.removeAll(context.findElements(by));
return elements;
}
}
LocalizadorComposiçãoIT.java
driver.findElements(
AllBy.all(
By.name("contact"),
NotBy.not(By.cssSelector("*[value='email']"))
)
);
52
Capítulo 2: Localização de elementos
em uma página
Item Uso
Qualquer um deles pode ser legitimamente alterado por seu autor. Em nenhum
lugar da lista está escrito "usado para automação".
carrinho de compras.html
<input type="text"
name="cartDS.shoppingcart_ROW0_m_orderItemVector_ROW0_m_quantity"
class="form-control input-sm" value="1" size="2"/>
53
Capítulo 2: Localização de elementos
em uma página
O único aspecto que podemos alterar sem afetar o comportamento da página é o
nome da classe. Podemos acrescentar uma nova classe especial a ela, neste caso
wd-cart-item-0 :
<input type="text"
name="cartDS.shoppingcart_ROW0_m_orderItemVector_ROW0_m_quantity"
class="form-control input-sm wd-cart-item-0" value="1" size="2"/>
wd
Um prefixo de automação ("wd" para WebDriver, mas você pode querer auto
para automação).
i t e m do carrinho-0
driver.findElement(By.className(String.format("wd-cart-item-%d", 0)))
Em vez de ter o prefixo comum espalhado pelo seu código, essa técnica pode ser
combinada com fábricas de localizadores para produzir um código mais conciso,
por exemplo:
ElementBy.java
driver.findElement(ElementBy.automationId(String.format("cart-item-%d", 0)))
54
Capítulo 2: Localização de elementos
em uma página
Resumo
SearchContext é a interface principal para localizar elementos, os métodos
findElement e findElements são os métodos principais.
Você tem vários métodos diferentes para localizar elementos. Eles incluem ID,
nome, classe, CSS e XPath.
55
Capítulo 2: Localização de elementos
em uma página
Os localizadores XPath e CSS são poderosos. Esse poder pode gerar
complexidade e, portanto, o uso de padrões, como a composição e o padrão de
estratégia, pode ajudar muito a simplificar seu uso.
Agora que você já sabe como localizar elementos em uma página, chegou a hora
de abordar os vários métodos de interação com esses elementos. O foco do
próximo capítulo será trabalhar com os vários métodos que o WebDriver eo
WebElement fornecem para interagir com a página.
56
Capítulo 3: Interagindo com elementos em
uma página
Seja o usuário
Ao elaborar um teste para simular o comportamento de um usuário, vale a pena
colocar-se no lugar do usuário e, em seguida, detalhar as etapas que você
executaria. Gosto de considerar a meta que o usuário deseja atingir e quais
operações eu realizaria para atingir essa meta. Por exemplo:
57
Capítulo 3: Interagindo com elementos em
uma página
3. Clique ou faça tabulação na entrada denominada "Password" (Senha).
4. Digite a senha.
Inserção de texto
A inserção de texto é fundamental para várias tarefas comuns ao testar páginas da
Web. A mais comum seria o preenchimento de um formulário. Pense nas tarefas
que o usuário pode querer realizar:
Escreva um e-mail.
58
Capítulo 3: Interagindo com elementos em
uma página
O texto que você precisa digitar pode ser texto simples, mas talvez seja necessário
digitar texto rico, texto que pode conter negrito ou itálico, por exemplo.
Vamos dar uma olhada nos dois principais métodos que o WebDriver fornece para a
interação com o teclado.
WebElement.java
void clear();
...
}
E podemos usar esse teste para entender como funcionam o sendKey e o clear. Sem
limpar o texto primeiro, sendKey simplesmente anexará o texto ao final do texto
original,
LoginIT.java
@Teste
public void login() throws Exception {
driver.get("/login.html");
driver.findElement(By.cssSelector("input[type='submit']"))
.click();
}
59
Capítulo 3: Interagindo com elementos em
uma página
2. Precisamos limpar o texto dentro da entrada, caso contrário, o texto será
anexado ao texto original
Keyboard.java
60