Selenium Driver da Web Java Exemplo de programa
Selenium Java Exemplo
Com o Java class “myclass” que criamos no tutorial anterior, vamos tentar criar um script WebDriver que:
- buscar Mercury Página inicial dos passeios
- verifique seu título
- imprima o resultado da comparação
- feche-o antes de encerrar todo o programa.
Selenium Código de exemplo do WebDriver
Abaixo está o código WebDriver real para a lógica apresentada pelo cenário acima
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; //comment the above line and uncomment below line to use Chrome //import org.openqa.selenium.chrome.ChromeDriver; public class PG1 { public static void main(String[] args) { // declaration and instantiation of objects/variables System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); //comment the above 2 lines and uncomment below 2 lines to use Chrome //System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe"); //WebDriver driver = new ChromeDriver(); String baseUrl = "https://demo.guru99.com/test/newtours/"; String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = ""; // launch Fire fox and direct it to the Base URL driver.get(baseUrl); // get the actual value of the title actualTitle = driver.getTitle(); /* * compare the actual title of the page with the expected one and print * the result as "Passed" or "Failed" */ if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); } //close Fire fox driver.close(); } }
Nota: começando 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 árdua. Se o código não funcionar, faça downgrade para Firefox versão 47 ou inferior. Alternativamente, você pode executar seus scripts no Chrome. Selenium funciona imediatamente para o Chrome. Você só precisa alterar 3 linhas de código para fazer seu script funcionar com o Chrome ou Firefox
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.FirefoxDirigir – contém o FirefoxClasse de driver necessária para instanciar um Firefox-driver específico no navegador instanciado pela classe WebDriver
Se o seu teste precisar de ações mais complicadas, como acessar outra classe, tirar screenshots do navegador ou manipular arquivos externos, definitivamente você precisará importar mais pacotes.
Instanciando objetos e variáveis
Normalmente, é assim que um objeto driver é instanciado.
WebDriver driver = new FirefoxDriver();
A FirefoxClasse de driver sem parâmetros significa que o padrão Firefox perfil será lançado pelo nosso Java programa. O padrão Firefox perfil é semelhante ao lançamento 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 do navegador
WebDriver's get() O método é usado para iniciar uma nova sessão do navegador e direcioná-la para a URL que você especifica como parâmetro.
driver.get(baseUrl);
Obtenha o título real da página
A classe WebDriver tem o getTitle () método que é sempre usado para obter o título da página atualmente carregada.
actualTitle = driver.getTitle();
Compare os valores esperados e reais
Esta parte do código simplesmente usa um básico Java estrutura if-else para comparar o título real com o esperado.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Encerrando uma sessão do navegador
O "fechar()”O método é usado para fechar a janela do navegador.
driver.close();
Encerrando todo o programa
Se você usar este comando sem fechar todas as janelas do navegador primeiro, todo o seu Java o programa terminará deixando a janela do navegador aberta.
System.exit(0);
Executando o teste
Existem duas maneiras de executar código em Eclipse IDE.
- On Eclipsebarra de menu, clique em Executar > Executar.
- Imprensa Ctrl + F11 para executar todo o código.
Se você fez tudo certo, Eclipse geraria “Teste aprovado!”
Localizando Elementos da GUI
A localização de elementos no WebDriver é feita usando o botão “encontrarElemento(Por.localizador()”Método. A parte “localizador” do código é igual a qualquer um dos localizadores discutidos anteriormente no Selenium IDE capítulos desses tutoriais. Na verdade, é recomendado que você localize os elementos GUI usando IDE e, uma vez identificados com sucesso, exporte o código para o WebDriver.
Aqui está uma Selenium código de exemplo 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"); WebDriver driver = new 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); } }
Utilizou-se o getNomeTag() método 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 em Eclipsejanela do console.
Resumo para localizar elementos
Variação | Descrição | Amostra |
---|---|---|
Por.className | encontra elementos com base no valor do atributo “class” | findElement(By.className(“someClassName”)) |
Por.cssSelector | encontra elementos com base no mecanismo seletor CSS subjacente do driver | findElement(Por.cssSelector(“entrada#email”)) |
Por.id | localiza elementos pelo valor de seu atributo “id” |
findElement(By.id(“algumId”)) |
Por.linkText | encontra um elemento de link pelo texto exato que ele exibe |
findElement(By.linkText(“REGISTRO”)) |
Por.nome | localiza elementos pelo valor do atributo “nome” |
findElement(By.nome(“algumNome”)) |
Por.partialLinkText | localiza elementos que contêm o texto do link fornecido |
findElement(By.partialLinkText(“REG”)) |
Por.tagName | localiza elementos pelo nome da tag |
findElement(By.tagName(“div”)) |
Por.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 o uso de findElement(By.cssSelector())
By.cssSelector()
não suporta o recurso “contém”. Considere o Selenium Código IDE abaixo –
In Selenium IDE acima, todo o teste passou. Contudo no Selenium Script WebDriver abaixo, o mesmo teste gerou um erro porque o WebDriver não suporta a palavra-chave “contém” quando usado no método By.cssSelector().
Comandos Comuns
Instanciando Elementos da Web
Em vez de usar a longa sintaxe “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 click()
método é usado para simular o clique de qualquer elemento. O seguinte Selenium Java exemplo mostra como click()
foi usado para clicar em Mercury Botão “Entrar” dos passeios.
Os seguintes itens 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 estar 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()
Uso da amostra: |
|
getTitle ()
Uso da amostra: |
|
getPageSource()
Uso da amostra: |
|
getCurrentUrl()
Uso da amostra: |
|
getText ()
Uso da amostra: |
|
Comandos de navegação
Esses comandos permitem que você atualize, entre e alterne entre diferentes páginas da web.
navegar para()
Uso da amostra: |
|
navegar().atualizar()
Uso da amostra: |
|
navegar().voltar()
Uso da amostra: |
|
navegar().avançar()
Uso da amostra: |
|
Fechando e saindo do navegador Windows
fechar()
Uso da amostra: |
|
Sair()
Uso da amostra: |
|
Para ilustrar claramente a diferença entre close()
e pela quit()
, tente executar o código abaixo. Ele usa uma página da web que abre automaticamente uma janela ao carregar a página e abre outra após sair.
Observe que apenas a janela principal do navegador 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 pai. 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"); WebDriver driver = new FirefoxDriver(); driver.get("http://www.popuptest.com/popuptest2.html"); driver.quit(); // using QUIT all windows will close } }
Alternando entre quadros
Para acessar elementos GUI em um quadro, devemos primeiro direcionar o WebDriver para focar no quadro ou janela pop-up antes de podermos acessar os elementos dentro deles. Tomemos, por exemplo, a página web https://demo.guru99.com/selenium/deprecated.html
Esta página possui 3 frames cujos atributos “nome” estão indicados acima. Desejamos acessar o link “Obsoleto” circulado acima em amarelo. Para fazer isso, devemos primeiro instruir o WebDriver a mudar para o quadro “classFrame” usando o “switchTo().frame()” método. 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"); WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/selenium/deprecated.html"); driver.switchTo().frame("classFrame"); driver.findElement(By.linkText("Deprecated")).click(); driver.close(); } }
Após executar este código, você verá que o quadro “classFrame” é levado para a página “API obsoleta”, o que significa que nosso código conseguiu acessar o link “Obsoleto”.
Alternando entre pop-ups Windows
O WebDriver permite que janelas pop-up como alertas sejam exibidas, ao contrário de Selenium IDE. Para acessar os elementos do alerta (como a mensagem que ele contém), devemos usar o "switchTo().alert()"
método. No código abaixo, usaremos este método para acessar a caixa de alerta e então recuperar sua mensagem usando o "getText()"
método e, em seguida, feche automaticamente a caixa de alerta usando o "switchTo().alert().accept()"
método.
Primeiro, vá para https://output.jsbin.com/usidix/1 e clique manualmente em “Ir!” botão lá e veja você mesmo o texto da mensagem.
Vamos ver o Selenium código de exemplo para fazer isso-
package 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"); WebDriver driver = new 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 Eclipse console, 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 durante todo o programa
- Espera explícita – usada para definir o tempo de espera apenas para uma instância específica
Espera implícita
- É mais simples codificar do que 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.
Em seguida, na parte de instanciação do seu código, adicione isto.
Espera explícita
As esperas explícitas são feitas usando as classes WebDriverWait e ExpectedCondition. Para o seguinte Selenium Exemplo do WebDriver, devemos esperar até 10 segundos para que um elemento cujo id seja “nome de usuário” fique visível antes de prosseguir para o próximo comando. Aqui estão as etapas.
-
Importe estes dois pacotes:
-
Declare uma variável WebDriverWait. Neste exemplo, usaremos “myWaitVar” como o nome da variável.
-
Use myWaitVar com ExpectedConditions em partes onde você precisa que a espera explícita ocorra. Neste caso, usaremos espera explícita no “nome de usuário” (Mercury Tours HomePage) antes de digitarmos o texto “tutorial” nela.
Condições
Os seguintes métodos são usados em operações condicionais e de loop —
- está ativado() é usado quando você deseja verificar se um determinado elemento está habilitado ou não antes de executar um comando.
- é exibido() é usado quando você deseja verificar se um determinado elemento é exibido ou não antes de executar um comando.
- é selecionado() é usado quando você deseja verificar se um determinado caixa de seleção, botão de opção ou opção em uma caixa suspensa é selecionado. 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() do WebDriverWait.
Abaixo estão alguns dos métodos ExpectedConditions mais comuns.
- alertIsPresent() – espera até que uma caixa de alerta seja exibida.
- elementToBeClickable() – Aguarda até que um elemento esteja visível e, ao mesmo tempo, habilitado. A amostra Selenium O código abaixo irá esperar até que o elemento com id=”username” se torne visível e habilitado antes de atribuir esse elemento como uma variável WebElement chamada “txtUserName”.
- frameToBeAvailableAndSwitchToIt() – Aguarda até que o quadro fornecido já esteja disponível e depois alterna automaticamente para ele.
Captura de exceções
Ao usar isEnabled(), isDisplayed() e isSelected(), o WebDriver assume que o elemento já existe na página. Caso contrário, lançará um 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("username")); try{ 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.FirefoxDirigir
- O
get()
método é o equivalente a Selenium Comando “abrir” do IDE. - A localização de elementos no WebDriver é feita usando o
findElement()
método. - A seguir estão as opções disponíveis para localização de elementos no WebDriver:
- Por.className
- Por.cssSelector
- Por.id
- Por.linkText
- Por.nome
- Por.partialLinkText
- Por.tagName
- Por.xpath
- O By.cssSelector() não apoiar o “contém” recurso.
- Você pode instanciar um elemento usando a classe WebElement.
- Clicar em um elemento é feito usando o
click()
método. - WebDriver fornece estes comandos get úteis:
- get()
- getTitle ()
- getPageSource()
- getCurrentUrl()
- getText ()
- WebDriver fornece estes 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 janelas do navegador.
Close()
é usado para fechar uma única janela; enquantoquit()
é usado para fechar todas as janelas associadas à janela pai que o objeto WebDriver estava controlando. - O
switchTo().frame()
e pelaswitchTo().alert()
métodos são usados para direcionar o foco do WebDriver para um quadro ou alerta, respectivamente. Implicit waits
são usados para definir o tempo de espera ao longo do programa, enquantoexplicit waits
são usados apenas em porções específicas.- Você pode usar isEnabled(), isDisplayed(),isSelected() e uma combinação de WebDriverEspere e pela Condições esperadas métodos ao verificar o estado de um elemento. Porém, eles não verificam se o elemento não existe.
- Quando isEnabled(), isDisplayed() ou isSelected() foi chamado enquanto o elemento não existia, o WebDriver lançará um NoSuchElementException.
- Quando os métodos WebDriverWait e ExpectedConditions eram chamados enquanto o elemento não existia, o WebDriver lançaria um
TimeoutException
.
Nota:
driver.get()
: Este método é usado para navegar para um site específico. No entanto, ele não mantém o histórico do navegador ou cookies. Como resultado, os botões de avançar e voltar não funcionarão, e clicar neles não agendará a navegação da página.
driver.navigate()
: Este método também é usado para navegar para um site específico, mas mantém o histórico do navegador e os cookies. Isso permite que os botões de avançar e voltar sejam usados para navegação entre páginas durante a codificação de um caso de teste.