JavaScriptExecutor em Selenium com exemplo

O que รฉ a JavaExecutor de script?

JavaScriptExecutor รฉ uma interface que ajuda a executar JavaRoteiro atravรฉs de Selenium Driver da Web. JavaScriptExecutor fornece dois mรฉtodos โ€œexecutescriptโ€ e โ€œexecuteAsyncScriptโ€ para executar javascript na janela selecionada ou na pรกgina atual.

JavaExecutor de script

Por que precisamos JavaExecutor de script?

In Selenium Webdriver, localizadores como XPath, CSS, etc. sรฃo usados โ€‹โ€‹para identificar e realizar operaรงรตes em uma pรกgina da web.

Caso esses localizadores nรฃo funcionem, vocรช pode usar JavaScriptExecutor. Vocรช pode usar JavaScriptExecutor para executar uma operaรงรฃo desejada em um elemento da web.

Selenium suporta javaScriptExecutor. Nรฃo hรก necessidade de um plugin ou complemento extra. Vocรช sรณ precisa importar (org.openqa.selenium.JavascriptExecutor) no script para usar JavaExecutor de script.

JavaMรฉtodos ScriptExecutor em Selenium

executeScript

Este mรฉtodo executa JavaScript no contexto do quadro ou janela atualmente selecionado em Selenium. O script usado neste mรฉtodo รฉ executado no corpo de uma funรงรฃo anรดnima (uma funรงรฃo sem nome). Tambรฉm podemos passar argumentos complicados para ele.

O script pode retornar valores. Os tipos de dados retornados sรฃo

  • Booleano
  • longo
  • Tanga
  • Lista
  • Elemento Web.

JavascriptSintaxe do executor:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • Script - Isto รฉ o JavaScript que precisa ser executado.
  • Argumentos โ€“ Sรฃo os argumentos do roteiro. ร‰ opcional.

executeAsyncScript

Com o script assรญncrono, sua pรกgina รฉ renderizada mais rapidamente. Em vez de forรงar os usuรกrios a esperar o download de um script antes que a pรกgina seja renderizada. Esta funรงรฃo executarรก uma parte assรญncrona de JavaScript no contexto do quadro ou janela atualmente selecionado em Selenium. O JS executado dessa forma รฉ de thread รบnico com vรกrias funรงรตes de retorno de chamada que sรฃo executadas de forma sรญncrona.

Como usar JavaScriptExecutor em Selenium

Aqui estรก um processo passo a passo sobre como usar JavaScriptExecutor em Selenium:

Passo 1) Importe o pacote.

import org.openqa.selenium.JavascriptExecutor;

Passo 2) Crie uma referรชncia.

JavascriptExecutor js = (JavascriptExecutor) driver;

Passo 3) Ligue para o JavascriptMรฉtodo executor.

js.executeScript(script, args);

Exemplo de clicar em um elemento usando JavaScriptExecutor em Selenium

Para executeScript, veremos trรชs exemplos diferentes, um por um.

1) Exemplo: Clique em um botรฃo para fazer login e gerar a janela de Alerta usando JavaExecutor de script.

Neste cenรกrio, usaremos o site de demonstraรงรฃo โ€œGuru99โ€ para ilustrar JavaScriptExecutor. Neste exemplo,

Clique em um botรฃo para fazer login e gerar janela de alerta usando JavaExecutor de script

  • Exibir janela de alerta em caso de login bem-sucedido.
import org.openqa.selenium.By;		
import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.WebElement;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				


    @Test		
    public void Login() 					
    {		
        WebDriver driver= new FirefoxDriver();			
        		
        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("https://demo.guru99.com/V4/");			
        		
        WebElement button =driver.findElement(By.name("btnLogin"));			
        		
        //Login to Guru99 		
        driver.findElement(By.name("uid")).sendKeys("mngr34926");					
        driver.findElement(By.name("password")).sendKeys("amUpenu");					
        		
        //Perform Click on LOGIN button using JavascriptExecutor		
        js.executeScript("arguments[0].click();", button);
                                
        //To generate Alert window using JavascriptExecutor. Display the alert message 			
        js.executeScript("alert('Welcome to Guru99');");   
    		
    }		
}

Saรญda: Quando o cรณdigo รฉ executado com sucesso. Vocรช vai observar

  • Clique com sucesso no botรฃo de login e no
  • A janela de alerta serรก exibida (veja imagem abaixo).

Clique em um botรฃo para fazer login e gerar janela de alerta usando JavaExecutor de script

2) Exemplo: capture dados de raspagem e navegue para pรกginas diferentes usando JavaExecutor de script.

Execute o script Selenium abaixo. Neste exemplo,

  • Lanรงar o site
  • Obtenha os detalhes do site, como URL do site, nome do tรญtulo e nome de domรญnio do site.
  • Em seguida, navegue para uma pรกgina diferente.
import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				

    @Test		
    public void Login() 					
    {		
        WebDriver driver= new FirefoxDriver();			
        		
        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("https://demo.guru99.com/V4/");
			
        //Fetching the Domain Name of the site. Tostring() change object to name.		
        String DomainName = js.executeScript("return document.domain;").toString();			
        System.out.println("Domain name of the site = "+DomainName);					
          		
        //Fetching the URL of the site. Tostring() change object to name		
        String url = js.executeScript("return document.URL;").toString();			
        System.out.println("URL of the site = "+url);					
          		
       //Method document.title fetch the Title name of the site. Tostring() change object to name		
       String TitleName = js.executeScript("return document.title;").toString();			
       System.out.println("Title of the page = "+TitleName);					

        		
      //Navigate to new Page i.e to generate access page. (launch new url)		
      js.executeScript("window.location = 'https://demo.guru99.com/'");			
    }		
}

Saรญda: Quando o cรณdigo acima for executado com sucesso, ele irรก buscar os detalhes do site e navegar para uma pรกgina diferente conforme mostrado abaixo.

Capture dados de raspagem e navegue para pรกginas diferentes usando JavaExecutor de script

[TestNG] Running:		
  C:\Users\gauravn\AppData\Local\Temp\testng-eclipse-467151014\testng-customsuite.xml		

log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies).		
log4j:WARN Please initialize the log4j system properly.		
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.		
Domain name of the site = demo.guru99.com		
URL of the site = https://demo.guru99.com/V4/		
Title of the page = Guru99 Bank Home Page		
PASSED: Login		

===============================================		
    Default test		
    Tests run: 1, Failures: 0, Skips: 0
===============================================

Capture dados de raspagem e navegue para pรกginas diferentes usando JavaExecutor de script

3) Exemplo: Role para baixo usando JavaExecutor de script.

Execute o script Selenium abaixo. Neste exemplo,

  • Lanรงar o site
  • Role para baixo em 600 pixels
import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				

    @Test		
    public void Login() 					
    {		
        WebDriver driver= new FirefoxDriver();			
        		
        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("http://moneyboats.com/");			
     
        //Maximize window		
        driver.manage().window().maximize();		
        		
        //Vertical scroll down by 600  pixels		
        js.executeScript("window.scrollBy(0,600)");			
    }		
}

saรญda: Quando o cรณdigo acima for executado, ele rolarรก 600 pixels para baixo (veja a imagem abaixo).

Role para baixo usando JavaExecutor de script

Exemplo de executeAsyncScript em Selenium

Usar o executeAsyncScript ajuda a melhorar o desempenho do seu teste. Ele permite escrever testes mais como uma codificaรงรฃo normal.

O executivoSync bloqueia outras aรงรตes executadas pelo Selenium navegador, mas execAsync nรฃo bloqueia a aรงรฃo. Ele enviarรก um retorno de chamada para o servidor Testes suรญte assim que o script estiver concluรญdo. Isso significa que tudo dentro do script serรก executado pelo navegador e nรฃo pelo servidor.

Exemplo 1: Realizando um sleep no navegador em teste.

Neste cenรกrio, usaremos o site de demonstraรงรฃo โ€œGuru99โ€ para ilustrar o executeAsyncScript. Neste exemplo, vocรช irรก

Passo 1) Capture a hora de inรญcio antes de esperar 5 segundos (5000 milissegundos) usando o mรฉtodo executeAsyncScript().

Passo 2) Em seguida, use executeAsyncScript() para aguardar 5 segundos.

Passo 3) Entรฃo, obtenha a hora atual.

Passo 4) Subtrair (hora atual โ€“ hora de inรญcio) = tempo passado.

Passo 5) Verifique a saรญda, ela deve exibir mais de 5000 milissegundos

import java.util.concurrent.TimeUnit;		

import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				

    @Test		
    public void Login() 					
    {		
        		
        WebDriver driver= new FirefoxDriver();			

        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("https://demo.guru99.com/V4/");			
     
          //Maximize window		
          driver.manage().window().maximize();		
        		
          //Set the Script Timeout to 20 seconds		
          driver.manage().timeouts().setScriptTimeout(20, TimeUnit.SECONDS);			
             
          //Declare and set the start time		
          long start_time = System.currentTimeMillis();			
                   
          //Call executeAsyncScript() method to wait for 5 seconds		
          js.executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 5000);");			
          		
         //Get the difference (currentTime - startTime)  of times.		
         System.out.println("Passed time: " + (System.currentTimeMillis() - start_time));					
                    		
    }		
}			

Saรญda: Exibido com sucesso o tempo decorrido em mais de 5 segundos (5000 milissegundos), conforme mostrado abaixo:

[TestNG] Running:		
C:\Users\gauravn\AppData\Local\Temp\testng-eclipse-387352559\testng-customsuite.xml		
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies).		
log4j:WARN Please initialize the log4j system properly.		
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.		
Passed time: 5022		
PASSED: Login		

===============================================		
    Default test		
    Tests run: 1, Failures: 0, Skips: 0		
===============================================

Resumo

JavaScriptExecutor รฉ usado quando Selenium O Webdriver nรฃo consegue clicar em nenhum elemento devido a algum problema.

  • JavaScriptExecutor fornece dois mรฉtodos โ€œexecutescriptโ€ e โ€œexecuteAsyncScriptโ€ para manipular.
  • Executou o JavaScript usando Selenium Driver da Web.
  • Ilustrou como clicar em um elemento atravรฉs JavaScriptExecutor, se o Selenium nรฃo clicar no elemento devido a algum problema.
  • Gerou a janela 'Alerta' usando JavaExecutor de script.
  • Navegou para a pรกgina diferente usando JavaExecutor de script.
  • Rolei a janela para baixo usando JavaExecutor de script.
  • URL, tรญtulo e nome de domรญnio obtidos usando JavaExecutor de script.

Resuma esta postagem com: