JavaScriptExecutor dans Selenium avec exemple

Qu'est-ce que le JavaExรฉcuteur de script ?

JavaScriptExecutor est une interface qui permet d'exรฉcuter JavaScรฉnario ร  travers Selenium Pilote Web. JavaScriptExecutor fournit deux mรฉthodes ยซ executescript ยป et ยซ executeAsyncScript ยป pour exรฉcuter JavaScript sur la fenรชtre sรฉlectionnรฉe ou la page actuelle.

JavaExรฉcuteur de script

Pourquoi avons-nous besoin JavaExรฉcuteur de script ?

In Selenium Webdriver, des localisateurs comme XPath, CSS, etc. sont utilisรฉs pour identifier et effectuer des opรฉrations sur une page Web.

Au cas oรน ces localisateurs ne fonctionneraient pas, vous pouvez utiliser JavaScriptExecutor. Vous pouvez utiliser JavaScriptExecutor pour effectuer une opรฉration souhaitรฉe sur un รฉlรฉment Web.

Selenium prend en charge javaScriptExecutor. Il nโ€™y a pas besoin dโ€™un plugin ou dโ€™un module complรฉmentaire supplรฉmentaire. Il vous suffit d'importer (org.openqa.sรฉlรฉnium.JavascriptExรฉcuteur) dans le script quant ร  l'utilisation JavaExรฉcuteur de script.

JavaMรฉthodes ScriptExecutor dans Selenium

exรฉcuterScript

Cette mรฉthode exรฉcute Javascรฉnario dans le contexte du cadre ou de la fenรชtre actuellement sรฉlectionnรฉ dans Selenium. Le script utilisรฉ dans cette mรฉthode s'exรฉcute dans le corps d'une fonction anonyme (une fonction sans nom). On peut aussi lui transmettre des arguments compliquรฉs.

Le script peut renvoyer des valeurs. Les types de donnรฉes renvoyรฉs sont

  • Boolean
  • Long
  • Chaรฎne
  • Liste
  • WebElement.

JavascriptSyntaxe de l'exรฉcuteur :

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • scรฉnario - C'est le JavaScript qui doit รชtre exรฉcutรฉ.
  • Arguments โ€“ Ce sont les arguments du script. C'est facultatif.

exรฉcuterAsyncScript

Avec un script asynchrone, votre page s'affiche plus rapidement. Au lieu de forcer les utilisateurs ร  attendre qu'un script soit tรฉlรฉchargรฉ avant que la page ne s'affiche. Cette fonction exรฉcutera une partie asynchrone de JavaScript dans le contexte du cadre ou de la fenรชtre actuellement sรฉlectionnรฉ dans SeleniumLe JS ainsi exรฉcutรฉ est monothread avec une fonction de rappel variรฉe qui s'exรฉcute de maniรจre synchrone.

Comment l'utiliser ? JavaScriptExecutor dans Selenium

Voici un processus รฉtape par รฉtape sur la faรงon d'utiliser JavaScriptExecutor dans Selenium:

ร‰tape 1) Importez le package.

import org.openqa.selenium.JavascriptExecutor;

ร‰tape 2) Crรฉez une rรฉfรฉrence.

JavascriptExecutor js = (JavascriptExecutor) driver;

ร‰tape 3) Appeler le JavascriptMรฉthode exรฉcuteur.

js.executeScript(script, args);

Exemple de clic sur un รฉlรฉment en utilisant JavaScriptExecutor dans Selenium

Pour performScript, nous verrons trois exemples diffรฉrents un par un.

1) Exemple : cliquez sur un bouton pour vous connecter et gรฉnรฉrer une fenรชtre d'alerte ร  l'aide de JavaExรฉcuteur de script.

Dans ce scรฉnario, nous utiliserons le site de dรฉmonstration ยซ Guru99 ยป pour illustrer JavaScriptExecutor. Dans cet exemple,

Cliquez sur un bouton pour vous connecter et gรฉnรฉrer une fenรชtre d'alerte ร  l'aide de JavaExรฉcuteur de script

  • Afficher la fenรชtre d'alerte en cas de connexion rรฉussie.
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');");   
    		
    }		
}

Sortie : Lorsque le code est exรฉcutรฉ avec succรจs. Vous observerez

  • Cliquez avec succรจs sur le bouton de connexion et sur le
  • Une fenรชtre d'alerte s'affichera (voir l'image ci-dessous).

Cliquez sur un bouton pour vous connecter et gรฉnรฉrer une fenรชtre d'alerte ร  l'aide de JavaExรฉcuteur de script

2) Exemple : capturez les donnรฉes de scrape et accรฉdez ร  diffรฉrentes pages ร  l'aide de JavaExรฉcuteur de script.

Exรฉcutez le script sรฉlรฉnium ci-dessous. Dans cet exemple,

  • Lancer le site
  • Rรฉcupรฉrez les dรฉtails du site comme l'URL du site, le nom du titre et le nom de domaine du site.
  • Accรฉdez ensuite ร  une autre page.
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/'");			
    }		
}

Sortie : Lorsque le code ci-dessus est exรฉcutรฉ avec succรจs, il rรฉcupรจre les dรฉtails du site et accรจde ร  une autre page, comme indiquรฉ ci-dessous.

Capturez les donnรฉes de rรฉcupรฉration et accรฉdez ร  diffรฉrentes pages ร  l'aide JavaExรฉcuteur 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
===============================================

Capturez les donnรฉes de rรฉcupรฉration et accรฉdez ร  diffรฉrentes pages ร  l'aide JavaExรฉcuteur de script

3) Exemple : faites dรฉfiler vers le bas en utilisant JavaExรฉcuteur de script.

Exรฉcutez le script sรฉlรฉnium ci-dessous. Dans cet exemple,

  • Lancer le site
  • Faites dรฉfiler vers le bas de 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)");			
    }		
}

Sortie: Lorsque le code ci-dessus est exรฉcutรฉ, il dรฉfilera vers le bas de 600 pixels (voir l'image ci-dessous).

Faites dรฉfiler vers le bas en utilisant JavaExรฉcuteur de script

Exemple de executeAsyncScript dans Selenium

Lโ€™utilisation dโ€™executeAsyncScript permet dโ€™amรฉliorer les performances de votre test. Il permet d'รฉcrire un test plus comme un codage normal.

L'exรฉcutifSync bloque d'autres actions effectuรฉes par le Selenium navigateur mais execAsync ne bloque pas l'action. Il enverra un rappel au cรดtรฉ serveur Tests suite une fois le script terminรฉ. Cela signifie que tout ce qui se trouve dans le script sera exรฉcutรฉ par le navigateur et non par le serveur.

Exemple 1 : Effectuer une mise en veille dans le navigateur testรฉ.

Dans ce scรฉnario, nous utiliserons le site de dรฉmonstration ยซ Guru99 ยป pour illustrer executeAsyncScript. Dans cet exemple, vous allez

ร‰tape 1) Capturez l'heure de dรฉbut avant d'attendre 5 secondes (5000 millisecondes) ร  l'aide de la mรฉthode executeAsyncScript().

ร‰tape 2) Ensuite, utilisez executeAsyncScript() pour attendre 5 secondes.

ร‰tape 3) Ensuite, obtenez lโ€™heure actuelle.

ร‰tape 4) Soustraire (heure actuelle โ€“ heure de dรฉbut) = temps รฉcoulรฉ.

ร‰tape 5) Vรฉrifiez la sortie, elle doit afficher plus de 5000 millisecondes

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));					
                    		
    }		
}			

Sortie : Affichage rรฉussi du temps รฉcoulรฉ pendant plus de 5 secondes (5000 millisecondes), comme indiquรฉ ci-dessous :

[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		
===============================================

Rรฉsumรฉ

JavaScriptExecutor est utilisรฉ lorsque Selenium Webdriver ne parvient ร  cliquer sur aucun รฉlรฉment en raison d'un problรจme.

  • JavaScriptExecutor fournit deux mรฉthodes ยซ executescript ยป et ยซ executeAsyncScript ยป ร  gรฉrer.
  • Exรฉcutรฉ le JavaScript utilisant Selenium Pilote Web.
  • Illustrรฉ comment cliquer sur un รฉlรฉment via JavaScriptExecutor, si le sรฉlรฉnium ne parvient pas ร  cliquer sur l'รฉlรฉment en raison d'un problรจme.
  • Gรฉnรฉration de la fenรชtre 'Alerte' en utilisant JavaExรฉcuteur de script.
  • Naviguรฉ vers la page diffรฉrente en utilisant JavaExรฉcuteur de script.
  • Faites dรฉfiler la fenรชtre vers le bas en utilisant JavaExรฉcuteur de script.
  • URL, titre et nom de domaine rรฉcupรฉrรฉs ร  l'aide de JavaExรฉcuteur de script.

Rรฉsumez cet article avec :