Usando a classe Java "myclass" que criamos no tutorial anterior, vamos tentar criar um script WebDriver que:
- buscar a página inicial da Mercury Tours
- verifique seu título
- imprima o resultado da comparação
- feche-o antes de encerrar todo o programa.
Código WebDriver
Abaixo está o código WebDriver real para a lógica apresentada pelo cenário acima
Nota: Iniciando o Firefox 35, você precisa usar o driver gecko criado pela Mozilla para usar o Web Driver. Selenium 3.0, gecko e firefox têm problemas de compatibilidade e configurá-los corretamente pode se tornar uma tarefa difícil. Se o código não funcionar, faça downgrade para o Firefox versão 47 ou inferior. Como alternativa, você pode executar seus scripts no Chrome. Selenium funciona fora da caixa para o Chrome. Você só precisa alterar 3 linhas de código para fazer seu script funcionar com Chrome ou Firefox
package newproject;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;// comente a linha acima e descomente a linha abaixo para usar o Chrome// import org.openqa.selenium.chrome.ChromeDriver;public class PG1 {public static void main (String [] args) {// declaração e instanciação de objetos / variáveisSystem.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Driver WebDriver = novo FirefoxDriver ();// comente as 2 linhas acima e descomente as 2 linhas abaixo para usar o Chrome//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe ");// Driver WebDriver = new ChromeDriver ();String baseUrl = "http://demo.guru99.com/test/newtours/";StringesperadoTitle = "Bem-vindo: Mercury Tours";String actualTitle = "";// inicie o Fire fox e direcione-o para a URL basedriver.get (baseUrl);// obtém o valor real do títuloactualTitle = driver.getTitle ();/ ** compare o título real da página com o esperado e imprima* o resultado foi "Aprovado" ou "Reprovado"* /if (actualTitle.contentEquals (expectedTitle)) {System.out.println ("Teste aprovado!");} outro {System.out.println ("Teste falhou");}// feche Fire foxdriver.close ();}}
Explicando o código
Importando Pacotes
Para começar, você precisa importar os dois pacotes a seguir:
- org.openqa.selenium. * - contém a classe WebDriver necessária para instanciar um novo navegador carregado com um driver específico
- org.openqa.selenium.firefox.FirefoxDriver - contém a classe FirefoxDriver necessária para instanciar um driver específico do Firefox no navegador instanciado pela classe WebDriver
Se o seu teste precisa de ações mais complicadas, como acessar outra classe, fazer capturas de tela do navegador ou manipular arquivos externos, definitivamente você precisará importar mais pacotes.
Instanciando objetos e variáveis
Normalmente, é assim que um objeto driver é instanciado.
Uma classe FirefoxDriver sem parâmetros significa que o perfil padrão do Firefox será iniciado por nosso programa Java. O perfil padrão do Firefox é semelhante a iniciar o Firefox no modo de segurança (nenhuma extensão é carregada).
Por conveniência, salvamos o URL base e o título esperado como variáveis.
Iniciando uma Sessão de Navegador
O método get () do WebDriver é usado para iniciar uma nova sessão do navegador e direcioná-la para a URL que você especifica como seu parâmetro.
Obtenha o título da página real
A classe WebDriver possui o método getTitle () que sempre é usado para obter o título da página carregada no momento.
Compare os valores esperados e reais
Esta parte do código simplesmente usa uma estrutura básica de Java if-else para comparar o título real com o esperado.
Encerrando uma Sessão do Navegador
O método " close () " é usado para fechar a janela do navegador.
Encerrando todo o programa
Se você usar este comando sem fechar todas as janelas do navegador primeiro, todo o seu programa Java será encerrado, deixando a janela do navegador aberta.
Executando o Teste
Existem duas maneiras de executar código no Eclipse IDE.
- Na barra de menu do Eclipse, clique em Executar> Executar.
- Pressione Ctrl + F11 para executar todo o código.
Se você fizesse tudo corretamente, o Eclipse produziria "Teste aprovado!"
Localizando Elementos GUI
A localização de elementos no WebDriver é feita usando o método " findElement (By. Locator ()) ". A parte "localizador" do código é igual a qualquer um dos localizadores discutidos anteriormente nos capítulos do Selenium IDE desses tutoriais. Na verdade, é recomendável que você localize os elementos da GUI usando o IDE e, uma vez identificado com êxito, exporte o código para o WebDriver.
Aqui está um código de amostra do Selenium que localiza um elemento por seu id. O Facebook é usado como URL base.
package newproject;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class PG2 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Driver WebDriver = novo FirefoxDriver ();String baseUrl = "http://www.facebook.com";String tagName = "";driver.get (baseUrl);tagName = driver.findElement (By.id ("email")). getTagName ();System.out.println (tagName);driver.close ();System.exit (0);}}
Usamos o método getTagName () para extrair o nome da tag daquele elemento específico cujo id é "email". Quando executado, este código deve ser capaz de identificar corretamente o nome da tag "input" e irá imprimi-lo na janela do Console do Eclipse.
Resumo para localização de elementos
Variação | Descrição | Amostra |
---|---|---|
De. nome da classe | encontra elementos com base no valor do atributo "class" | findElement (By.className ("someClassName")) |
De. cssSelector | encontra elementos com base no mecanismo seletor CSS subjacente do driver | findElement (By.cssSelector ("input # email")) |
De. eu ia | localiza elementos pelo valor de seu atributo "id" | findElement (By.id ("someId")) |
De. Texto do link | encontra um elemento de link pelo texto exato que exibe | findElement (By.linkText ("REGISTRATION")) |
De. nome | localiza elementos pelo valor do atributo "name" | findElement (By.name ("someName")) |
De. parcialLinkText | localiza os elementos que contêm o texto do link fornecido | findElement (By.partialLinkText ("REG")) |
De. tagName | localiza os elementos por seu nome de tag | findElement (By.tagName ("div")) |
De. xpath | localiza elementos via XPath | findElement (By.xpath ("// html / body / div / table / tbody / tr / td [2] / table / tbody / tr [4] / td / table / tbody / tr / td [2] / table / tbody / tr [2] / td [3] / form / table / tbody / tr [5] ")) |
Nota sobre como usar findElement (By.cssSelector ())
By.cssSelector () não oferece suporte ao recurso "contém" . Considere o código Selenium IDE abaixo -
No Selenium IDE acima, todo o teste foi aprovado. No entanto, no script Selenium WebDriver abaixo, o mesmo teste gerou um erro porque o WebDriver não oferece suporte à palavra-chave "contém" quando usada no método By.cssSelector ().
Comandos Comuns
Instanciando Elementos da Web
Em vez de usar a sintaxe longa "driver.findElement (By.locator ())" toda vez que você acessar um elemento específico, podemos instanciar um objeto WebElement para ele. A classe WebElement está contida no pacote "org.openqa.selenium. *".
Clicar em um elemento
Clicar é talvez a forma mais comum de interagir com os elementos da web . O método click () é usado para simular o clique de qualquer elemento. O exemplo Selenium Java a seguir mostra como click () foi usado para clicar no botão "Sign-In" da Mercury Tours.
Os itens a seguir devem ser observados ao usar o método click ().
- Não requer nenhum parâmetro / argumento.
- O método aguarda automaticamente o carregamento de uma nova página, se aplicável.
- O elemento a ser clicado deve ser visível (altura e largura não devem ser iguais a zero).
Obter comandos
Os comandos Get buscam várias informações importantes sobre a página / elemento. Aqui estão alguns comandos "get" importantes com os quais você deve estar familiarizado.
Comandos | Uso |
---|---|
get () Amostra de uso: |
|
getTitle () Amostra de uso: |
|
getPageSource () Amostra de uso: |
|
getCurrentUrl () Amostra de uso: |
|
getText () Amostra de uso: |
|
Comandos de navegação
Esses comandos permitem que você atualize, entre e alterne entre diferentes páginas da web.
navegar (). para () Amostra de uso: |
|
navegar (). atualizar () Amostra de uso: |
|
navegar (). voltar () Amostra de uso: |
|
navegar (). avançar () Exemplo de uso: |
|
Fechando e saindo das janelas do navegador
close () Amostra de uso: |
|
quit () Amostra de uso: |
|
Para ilustrar claramente a diferença entre close () e quit (), tente executar o código abaixo. Ele usa uma página da web que abre automaticamente uma janela no carregamento da página e abre outra após sair.
Observe que apenas a janela do navegador pai foi fechada e não as duas janelas pop-up.
Mas se você usar quit (), todas as janelas serão fechadas - não apenas a janela principal. Tente executar o código abaixo e você notará que os dois pop-ups acima também serão fechados automaticamente.
package newproject;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class PG3 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Driver WebDriver = novo FirefoxDriver ();driver.get ("http://www.popuptest.com/popuptest2.html");driver.quit (); // usando QUIT todas as janelas serão fechadas}}
Alternando entre quadros
Para acessar os elementos da GUI em um Frame, devemos primeiro direcionar o WebDriver para focar no frame ou janela pop-up antes de podermos acessar os elementos dentro deles. Tomemos, por exemplo, a página da web http://demo.guru99.com/selenium/deprecated.html
Esta página possui 3 frames cujos atributos de "nome" estão indicados acima. Desejamos acessar o link "Obsoleto" circulado acima em amarelo. Para fazer isso, devemos primeiro instruir o WebDriver a alternar para o quadro "classFrame" usando o método "switchTo (). Frame ()" . Usaremos o atributo name do frame como parâmetro para a parte "frame ()".
package newproject;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class PG4 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Driver WebDriver = novo FirefoxDriver ();driver.get ("http://demo.guru99.com/selenium/deprecated.html");driver.switchTo (). frame ("classFrame");driver.findElement (By.linkText ("Obsoleto")). click ();driver.close ();}}
Depois de executar esse código, você verá que o quadro "classFrame" é levado para a página "API obsoleta", o que significa que nosso código foi capaz de acessar o link "Obsoleto".
Alternar entre janelas pop-up
O WebDriver permite que janelas pop-up como alertas sejam exibidas, ao contrário do Selenium IDE. Para acessar os elementos dentro do alerta (como a mensagem que ele contém), devemos usar o método "switchTo (). Alert ()" . No código a seguir, usaremos esse método para acessar a caixa de alerta e, em seguida, recuperar sua mensagem usando o método "getText ()" e, em seguida, fechar automaticamente a caixa de alerta usando "switchTo (). Alert (). Accept () " método.
Primeiro, vá para http://jsbin.com/usidix/1 e clique manualmente no botão "Go!" botão lá e veja por si mesmo o texto da mensagem.
Vamos ver o código de exemplo do Selenium para fazer isso-
pacote mypackage;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class myclass {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Driver WebDriver = novo FirefoxDriver ();String alertMessage = "";driver.get ("http://jsbin.com/usidix/1");driver.findElement (By.cssSelector ("input [value = \" Go! \ "]")). click ();alertMessage = driver.switchTo (). alert (). getText ();driver.switchTo (). alert (). accept ();System.out.println (alertMessage);driver.quit ();}}
No console do Eclipse, observe que a mensagem de alerta impressa é:
Espera
Existem dois tipos de espera.
- Espera implícita - usada para definir o tempo de espera padrão em todo o programa
- Espera explícita - usada para definir o tempo de espera apenas para uma determinada instância
Espera implícita
- É mais simples codificar do que as esperas explícitas.
- Geralmente é declarado na parte de instanciação do código.
- Você só precisará de um pacote adicional para importar.
Para começar a usar uma espera implícita, você teria que importar este pacote para o seu código.
Então, na parte de instanciação do seu código, adicione isso.
Espera explícita
Esperas explícitas são feitas usando as classes WebDriverWait e ExpectedCondition . Para o seguinte exemplo do Selenium WebDriver, devemos esperar até 10 segundos para que um elemento cujo id é "nome de usuário" se torne visível antes de prosseguir para o próximo comando. Aqui estão as etapas.
Passo 1
Importe estes dois pacotes:
Passo 2
Declare uma variável WebDriverWait. Neste exemplo, usaremos "myWaitVar" como o nome da variável.
etapa 3
Use myWaitVar com ExpectedConditions em partes onde você precisa que a espera explícita ocorra. Nesse caso, usaremos a espera explícita na entrada "nome de usuário" (Mercury Tours HomePage) antes de digitar o texto "tutorial" nele.
Condições
Os seguintes métodos são usados em operações condicionais e de loop -
- isEnabled () é usado quando você deseja verificar se um determinado elemento está habilitado ou não antes de executar um comando.
- isDisplayed () é usado quando você deseja verificar se um determinado elemento é exibido ou não antes de executar um comando.
- isSelected () é usado quando você deseja verificar se uma determinada caixa de seleção, botão de rádio ou opção em uma caixa suspensa está selecionada. Não funciona em outros elementos.
Usando condições esperadas
A classe ExpectedConditions oferece um conjunto mais amplo de condições que você pode usar em conjunto com o método until () de WebDriverWait.
Abaixo estão alguns dos métodos ExpectedConditions mais comuns.
- alertIsPresent () - espera até que uma caixa de alerta seja exibida.
- elementToBeClickable () - Espera até que um elemento esteja visível e, ao mesmo tempo, ativado. O exemplo de Código Selenium abaixo irá aguardar até que o elemento com se torne visível e habilitado antes de atribuir esse elemento como uma variável WebElement chamada "txtUserName".
- frameToBeAvailableAndSwitchToIt () - Espera até que o quadro fornecido já esteja disponível e, em seguida, alterna automaticamente para ele.
Captura de exceções
Ao usar isEnabled (), isDisplayed () e isSelected (), o WebDriver presume que o elemento já existe na página. Caso contrário, ele lançará uma NoSuchElementException . Para evitar isso, devemos usar um bloco try-catch para que o programa não seja interrompido.
WebElement txtbox_username = driver.findElement (By.id ("nome de usuário"));tentar{if (txtbox_username.isEnabled ()) {txtbox_username.sendKeys ("tutorial");}}catch (NoSuchElementException nsee) {System.out.println (nsee.toString ());}
Se você usar esperas explícitas, o tipo de exceção que você deve capturar é "TimeoutException".
Resumo
- Para começar a usar a API WebDriver, você deve importar pelo menos esses dois pacotes.
- org.openqa.selenium. *
- org.openqa.selenium.firefox.FirefoxDriver
- O método get () é equivalente ao comando "abrir" do Selenium IDE.
- A localização de elementos no WebDriver é feita usando o método findElement () .
- A seguir estão as opções disponíveis para localizar elementos no WebDriver:
- De. nome da classe
- De. cssSelector
- De. eu ia
- De. Texto do link
- De. nome
- De. parcialLinkText
- De. tagName
- De. xpath
- O By.cssSelector () não oferece suporte ao recurso "contém" .
- Você pode instanciar um elemento usando a classe WebElement .
- Clicar em um elemento é feito usando o método click () .
- O WebDriver fornece estes comandos get úteis :
- obter()
- getTitle ()
- getPageSource ()
- getCurrentUrl ()
- getText ()
- WebDriver fornece esses comandos de navegação úteis
- navegar (). avançar ()
- navegar (). voltar ()
- navegar para()
- navegar (). atualizar ()
- Os métodos close () e quit () são usados para fechar as janelas do navegador. Close () é usado para fechar uma única janela; enquanto quit () é usado para fechar todas as janelas associadas à janela pai que o objeto WebDriver estava controlando.
- Os métodos switchTo (). Frame () e switchTo (). Alert () são usados para direcionar o foco do WebDriver para um quadro ou alerta, respectivamente.
- As esperas implícitas são usadas para definir o tempo de espera em todo o programa, enquanto as esperas explícitas são usadas apenas em partes específicas.
- Você pode usar os métodos isEnabled (), isDisplayed (), isSelected () e uma combinação dos métodos WebDriverWait e ExpectedConditions ao verificar o estado de um elemento. No entanto, eles não verificam se o elemento não existe.
- Quando isEnabled (), isDisplayed () ou isSelected () foi chamado enquanto o elemento não existia, WebDriver lançará uma NoSuchElementException .
- Quando os métodos WebDriverWait e ExpectedConditions eram chamados enquanto o elemento não existia, WebDriver lançava uma TimeoutException .
Observação:
driver.get (): É usado para ir para o site específico, mas não mantém o histórico do navegador e cookies, portanto, não podemos usar o botão avançar e retroceder, se clicarmos nele, a página não será programada
driver.navigate (): é usado para ir ao site específico, mas mantém o histórico do navegador e os cookies, para que possamos usar o botão avançar e voltar para navegar entre as páginas durante a codificação do Testcase