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.
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
- Starten Sie den Webbrowser
- รffnen Sie die Seite https://demo.guru99.com/V4/ ,
- Login mit Zugangsdaten
- 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).
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.
[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) 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).
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
- Starten Sie den Browser.
- Seite รถffnen https://demo.guru99.com/V4/.
- Die Anwendung wartet 5 Sekunden, um eine weitere Aktion auszufรผhren.
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.






