JavaScriptExecutor em Selenium com exemplo
O que é o 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.
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,
- Inicie o navegador da web
- abra o site https://demo.guru99.com/V4/ e
- login com credenciais
- 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).
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.
[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 ===============================================
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).
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 Ensaios 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á
- Inicie o navegador.
- Abrir site https://demo.guru99.com/V4/.
- O aplicativo aguarda 5 segundos para executar outra ação.
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.