JavaScriptExecutor in Selenium mit Beispiel

Was ist JavaSkriptExecutor?

JavaScriptExecutor ist eine Schnittstelle, die bei der Ausfรผhrung hilft JavaSkript durch Selenium Webtreiber. JavaScriptExecutor bietet zwei Methoden โ€žexecutescriptโ€œ und โ€žexecuteAsyncScriptโ€œ, um JavaScript im ausgewรคhlten Fenster oder auf der aktuellen Seite auszufรผhren.

JavaSkriptExecutor

Warum brauchen wir JavaSkriptExecutor?

In Selenium Webdriver und Locators wie XPath, CSS usw. werden verwendet, um eine Webseite zu identifizieren und Vorgรคnge darauf auszufรผhren.

Falls diese Locators nicht funktionieren, kรถnnen Sie verwenden JavaScriptExecutor. Sie kรถnnen verwenden JavaScriptExecutor zum Ausfรผhren einer gewรผnschten Operation an einem Webelement.

Selenium unterstรผtzt javaScriptExecutor. Es ist kein zusรคtzliches Plugin oder Add-on erforderlich. Sie mรผssen nur importieren (org.openqa.selenium.JavascriptTestamentsvollstrecker) im Skript als JavaSkriptExecutor.

JavaScriptExecutor-Methoden in Selenium

Skript ausfรผhren

Diese Methode wird ausgefรผhrt JavaSkript im Kontext des aktuell ausgewรคhlten Rahmens oder Fensters in Selenium. Das in dieser Methode verwendete Skript wird im Hauptteil einer anonymen Funktion (einer Funktion ohne Namen) ausgefรผhrt. Wir kรถnnen ihm auch komplizierte Argumente รผbergeben.

Das Skript kann Werte zurรผckgeben. Die zurรผckgegebenen Datentypen sind

  • Boolean
  • lang
  • Schnur
  • Liste
  • WebElement.

JavascriptExecutor-Syntax:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • Skript - Dies ist das JavaSkript, das ausgefรผhrt werden muss.
  • Argumente โ€“ Es sind die Argumente zum Skript. Es ist optional.

ausfรผhrenAsyncScript

Mit asynchronem Skript wird Ihre Seite schneller gerendert. Anstatt Benutzer zu zwingen, auf den Download eines Skripts zu warten, bevor die Seite gerendert wird. Diese Funktion fรผhrt einen asynchronen Teil aus JavaSkript im Kontext des aktuell ausgewรคhlten Rahmens oder Fensters in Selenium. Das so ausgefรผhrte JS ist ein Single-Thread mit verschiedenen Rรผckruffunktionen, die synchron ausgefรผhrt werden.

Anwendung JavaScriptExecutor in Selenium

Hier finden Sie eine Schritt-fรผr-Schritt-Anleitung zur Verwendung JavaScriptExecutor in Selenium:

Schritt 1) Importieren Sie das Paket.

import org.openqa.selenium.JavascriptExecutor;

Schritt 2) Erstellen Sie eine Referenz.

JavascriptExecutor js = (JavascriptExecutor) driver;

Schritt 3) Ruf den JavascriptExecutor-Methode.

js.executeScript(script, args);

Beispiel fรผr โ€žKlicken Sie auf ein Element mit JavaScripExecutor in Selenium

Fรผr โ€žexecuteScriptโ€œ sehen wir nacheinander drei verschiedene Beispiele.

1) Beispiel: Klicken Sie auf eine Schaltflรคche, um sich anzumelden und ein Warnfenster zu generieren mit JavaSkriptExecutor.

In diesem Szenario verwenden wir die Demo-Site โ€žGuru99โ€œ zur Veranschaulichung JavaIn diesem Beispiel

Klicken Sie auf eine Schaltflรคche, um sich anzumelden und ein Warnfenster zu generieren. JavaSkriptExecutor

  • Warnfenster bei erfolgreicher Anmeldung anzeigen.
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');");   
    		
    }		
}

Ausgang: Wenn der Code erfolgreich ausgefรผhrt wurde. Sie werden beobachten

  • Erfolgreicher Klick auf den Login-Button und die
  • Es wird ein Warnfenster angezeigt (siehe Abbildung unten).

Klicken Sie auf eine Schaltflรคche, um sich anzumelden und ein Warnfenster zu generieren. JavaSkriptExecutor

2) Beispiel: Scrape-Daten erfassen und zu verschiedenen Seiten navigieren mit JavaSkriptExecutor.

Fรผhren Sie das folgende Selenium-Skript aus. In diesem Beispiel

  • Starten Sie die Site
  • Rufen Sie die Details der Site ab, beispielsweise die URL der Site, den Titelnamen und den Domรคnennamen der Site.
  • Navigieren Sie dann zu einer anderen Seite.
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/'");			
    }		
}

Ausgang: Wenn der obige Code erfolgreich ausgefรผhrt wird, werden die Sitedetails abgerufen und, wie unten gezeigt, zu einer anderen Seite navigiert.

Erfassen Sie Scrape-Daten und navigieren Sie zu verschiedenen Seiten mit JavaSkriptExecutor

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

Erfassen Sie Scrape-Daten und navigieren Sie zu verschiedenen Seiten mit JavaSkriptExecutor

3) Beispiel: Scrollen Sie nach unten mit JavaSkriptExecutor.

Fรผhren Sie das folgende Selenium-Skript aus. In diesem Beispiel

  • Starten Sie die Site
  • Scrollen Sie um 600 Pixel nach unten
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)");			
    }		
}

Ausgang: Wenn der obige Code ausgefรผhrt wird, scrollt er um 600 Pixel nach unten (siehe Bild unten).

Scrollen Sie nach unten mit JavaSkriptExecutor

Beispiel fรผr โ€žexecuteAsyncScriptโ€œ in Selenium

Die Verwendung von โ€žexecuteAsyncScriptโ€œ trรคgt dazu bei, die Leistung Ihres Tests zu verbessern. Dadurch kรถnnen Tests eher wie normale Codierung geschrieben werden.

Die ExekutiveSync blockiert weitere Aktionen, die von ausgefรผhrt werden Selenium Browser, aber execAsync blockiert die Aktion nicht. Es wird ein Rรผckruf an die Serverseite gesendet Tests suite, sobald das Skript fertig ist. Das bedeutet, dass alles im Skript vom Browser und nicht vom Server ausgefรผhrt wird.

Beispiel 1: Durchfรผhren eines Ruhezustands im zu testenden Browser.

In diesem Szenario verwenden wir die Demo-Site โ€žGuru99โ€œ, um โ€žexecuteAsyncScriptโ€œ zu veranschaulichen. In diesem Beispiel werden Sie

Schritt 1) Erfassen Sie die Startzeit, bevor Sie 5 Sekunden (5000 Millisekunden) warten, indem Sie die Methode executeAsyncScript() verwenden.

Schritt 2) Verwenden Sie dann โ€žexecuteAsyncScript()โ€œ, um 5 Sekunden zu warten.

Schritt 3) Rufen Sie dann die aktuelle Uhrzeit ab.

Schritt 4) Subtrahieren (aktuelle Zeit โ€“ Startzeit) = vergangene Zeit.

Schritt 5) รœberprรผfen Sie, ob die Ausgabe mehr als 5000 Millisekunden anzeigen sollte

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

Ausgang: Die verstrichene Zeit (mehr als 5 Sekunden (5000 Millisekunden)) wurde erfolgreich angezeigt, wie unten dargestellt:

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

Zusammenfassung

JavaScriptExecutor wird verwendet, wenn Selenium Webdriver kann aufgrund eines Problems nicht auf ein Element klicken.

  • JavaScriptExecutor bietet zwei Methoden โ€žexecutescriptโ€œ und โ€žexecuteAsyncScriptโ€œ zur Verarbeitung.
  • Habe das ausgefรผhrt JavaSkript verwenden Selenium Webtreiber.
  • Veranschaulicht, wie man auf ein Element klickt durch JavaScriptExecutor, wenn Selenium aufgrund eines Problems nicht auf das Element klicken kann.
  • Das Fenster โ€žAlarmโ€œ wurde erstellt mit JavaSkriptExecutor.
  • Zur anderen Seite navigiert mit JavaSkriptExecutor.
  • Im Fenster nach unten gescrollt mit JavaSkriptExecutor.
  • URL, Titel und Domรคnenname abgerufen mit JavaSkriptExecutor.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: