JavaScriptExecutor i Selenium med Eksempel
Hvad er JavaScriptExecutor?
JavaScriptExecutor er en grรฆnseflade, der hjรฆlper med at udfรธre JavaScript igennem Selenium Webdriver. JavaScriptExecutor giver to metoder "executescript" og "executeAsyncScript" til at kรธre javascript pรฅ det valgte vindue eller den aktuelle side.
Hvorfor har vi brug for JavaScriptExecutor?
In Selenium Webdriver, locatorer som XPath, CSS osv. bruges til at identificere og udfรธre operationer pรฅ en webside.
Hvis disse lokatorer ikke virker, kan du bruge JavaScriptExecutor. Du kan bruge JavaScriptExecutor til at udfรธre en รธnsket handling pรฅ et webelement.
Selenium understรธtter javaScriptExecutor. Der er ikke behov for et ekstra plugin eller tilfรธjelse. Du skal bare importere (org.openqa.selenium.JavascriptExecutor) i scriptet, som skal bruges JavaScriptExecutor.
JavaScriptExecutor-metoder i Selenium
executeScript
Denne metode udfรธres JavaScript i sammenhรฆng med den aktuelt valgte ramme eller vindue i Selenium. Scriptet, der bruges i denne metode, kรธrer i brรธdteksten af โโen anonym funktion (en funktion uden navn). Vi kan ogsรฅ sende komplicerede argumenter til det.
Scriptet kan returnere vรฆrdier. De returnerede datatyper er
- Boolesk
- Lang
- String
- Liste
- WebElement.
JavascriptEksekutรธr syntaks:
JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript(Script,Arguments);
- Script - Dette er JavaScript, der skal udfรธres.
- argumenter โ Det er argumenterne til manuskriptet. Det er valgfrit.
eksekver AsyncScript
Med asynkront script gengives din side hurtigere. I stedet for at tvinge brugerne til at vente pรฅ, at et script downloades, fรธr siden gengives. Denne funktion vil udfรธre et asynkront stykke af JavaScript i sammenhรฆng med den aktuelt valgte ramme eller vindue i Selenium. Den sรฅledes udfรธrte JS er enkelttrรฅdet med en forskellig tilbagekaldsfunktion, som kรธrer synkront.
Brugsvejledning JavaScriptExecutor i Selenium
Her er en trin-for-trin proces om, hvordan du bruger JavaScriptExecutor i Selenium:
Trin 1) Importer pakken.
import org.openqa.selenium.JavascriptExecutor;
Trin 2) Opret en reference.
JavascriptExecutor js = (JavascriptExecutor) driver;
Trin 3) Ring til JavascriptEksekutรธr metode.
js.executeScript(script, args);
Eksempel pรฅ Klik pรฅ et element ved hjรฆlp af JavaScripExecutor i Selenium
For executeScript vil vi se tre forskellige eksempler et efter et.
1) Eksempel: Klik pรฅ en knap for at logge ind og generere advarselsvindue vha JavaScriptExecutor.
I dette scenarie vil vi bruge "Guru99"-demosiden til at illustrere JavaScriptExecutor. I dette eksempel,
- Start webbrowseren
- รฅbne webstedet https://demo.guru99.com/V4/ og
- log ind med legitimationsoplysninger
- Vis advarselsvindue ved vellykket login.
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');");
}
}
Output: Nรฅr koden er eksekveret med succes. Du vil observere
- Vellykket klik pรฅ login-knappen og
- Advarselsvindue vil blive vist (se billedet nedenfor).
2) Eksempel: Hent skrabedata og naviger til forskellige sider ved hjรฆlp af JavaScriptExecutor.
Udfรธr nedenstรฅende selenscript. I dette eksempel,
- Start stedet
- Hent detaljerne pรฅ webstedet som webstedets URL, titelnavn og domรฆnenavn pรฅ webstedet.
- Naviger derefter til en anden side.
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/'");
}
}
Output: Nรฅr ovenstรฅende kode er eksekveret med succes, vil den hente detaljerne pรฅ webstedet og navigere til en anden side som vist nedenfor.
[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) Eksempel: Rul ned vha JavaScriptExecutor.
Udfรธr nedenstรฅende selenscript. I dette eksempel,
- Start stedet
- Rul ned med 600 pixel
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)");
}
}
Produktion: Nรฅr ovenstรฅende kode udfรธres, vil den rulle ned med 600 pixels (se billedet nedenfor).
Eksempel pรฅ executeAsyncScript i Selenium
Brug af executeAsyncScript hjรฆlper med at forbedre ydeevnen af โโdin test. Det tillader skrivetest mere som en normal kodning.
ExecSync blokerer for yderligere handlinger, der udfรธres af Selenium browser, men execAsync blokerer ikke handling. Det vil sende et tilbagekald til serversiden Test suite, nรฅr scriptet er fรฆrdigt. Det betyder, at alt inde i scriptet vil blive udfรธrt af browseren og ikke serveren.
Eksempel 1: Udfรธrelse af en dvale i browseren under test.
I dette scenarie vil vi bruge "Guru99" demo site til at illustrere executeAsyncScript. I dette eksempel vil du
- Start browseren.
- ร ben side https://demo.guru99.com/V4/.
- Applikationen venter i 5 sekunder for at udfรธre en yderligere handling.
Trin 1) Indfang starttidspunktet, fรธr du venter i 5 sekunder (5000 millisekunder) ved at bruge executeAsyncScript()-metoden.
Trin 2) Brug derefter executeAsyncScript() til at vente 5 sekunder.
Trin 3) Fรฅ derefter det aktuelle tidspunkt.
Trin 4) Trรฆk fra (aktuel tid โ starttid) = passeret tid.
Trin 5) Bekrรฆft outputtet, det skal vise mere end 5000 millisekunder
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));
}
}
Output: Viste den passerede tid mere end 5 sekunder (5000 millisekunder) som vist nedenfor:
[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
===============================================
Resumรฉ
JavaScriptExecutor bruges nรฅr Selenium Webdriver kan ikke klikke pรฅ noget element pรฅ grund af et eller andet problem.
- JavaScriptExecutor giver to metoder "executescript" og "executeAsyncScript" til at hรฅndtere.
- Udfรธrte JavaScript ved hjรฆlp af Selenium Webdriver.
- Illustreret hvordan man klikker pรฅ et element igennem JavaScriptExecutor, hvis selen ikke kan klikke pรฅ elementet pรฅ grund af et eller andet problem.
- Genererede 'Alert'-vinduet vha JavaScriptExecutor.
- Navigerede til den anden side vha JavaScriptExecutor.
- Rullede ned i vinduet vha JavaScriptExecutor.
- Hentede URL, titel og domรฆnenavn vha JavaScriptExecutor.






