JavaScriptExecutor u Selenium WebDriver (primjer)

โšก Pametni saลพetak

JavaScriptExecutor u Selenium WebDriver se pokreฤ‡e JavaSkripta unutar preglednika kada lokatori ne uspiju. LessObuhvaฤ‡aju primjere executeScript, executeAsyncScript, pomicanja, klikanja, upozorenja i unosa u obrasce.

  • ๏ธ Rjeลกava granice: Zaobilazi skrivene elemente i JavaStranice s puno skripti.
  • ๐Ÿงฉ Dvije metode: executeScript pokreฤ‡e sinkronizaciju; executeAsyncScript obraฤ‘uje asinkronost putem povratnog poziva.
  • ๐Ÿ“œ Svitak: Pomicanje prozora, skok na koordinate ili pomicanje elementa u prikaz.
  • ๐Ÿ–ฑ๏ธ Skriveni klikovi: Okidaฤ click() na elementima koje WebDriver ne moลพe dosegnuti.
  • ๐Ÿ“ Kontrola obrasca: Ubrizgajte vrijednosti i ฤitajte tekst iz teลกkih elemenata.
  • ๐Ÿค– Isjeฤci umjetne inteligencije: Alati umjetne inteligencije generiraju JavaScriptExecutor kod i ispravak nestabilnih selektora.

JavaScriptExecutor u Selenium

ล to je JavaScriptExecutor?

JavaScriptExecutor je suฤelje koje pomaลพe u izvrลกenju JavaSkripta kroz Selenium Webdriver. JavaScriptExecutor nudi dvije metode "executescript" & "executeAsyncScript" za pokretanje javascripta na odabranom prozoru ili trenutnoj stranici.

JavaScriptExecutor

Zaลกto nam treba JavaScriptExecutor?

In Selenium Webdriver, lokatori poput XPath, CSS, itd. koriste se za identifikaciju i izvoฤ‘enje operacija na web stranici.

U sluฤaju da ovi lokatori ne rade, moลพete ih koristiti JavaScriptExecutor. Moลพete koristiti JavaScriptExecutor za izvoฤ‘enje ลพeljene operacije na web elementu.

Selenium podrลพava javaScriptExecutor. Nema potrebe za dodatnim dodatkom ili dodatkom. Samo trebate uvesti (org.openqa.selen.Javascriptizvrลกitelj) u skripti za koriลกtenje JavaScriptExecutor.

JavaScriptExecutor metode u Selenium

izvrลกi skriptu

Ova metoda se izvrลกava JavaScript u kontekstu trenutno odabranog okvira ili prozora u Selenium. Skripta koriลกtena u ovoj metodi izvodi se u tijelu anonimne funkcije (funkcije bez naziva). Takoฤ‘er mu moลพemo proslijediti komplicirane argumente.

Skripta moลพe vratiti vrijednosti. Vraฤ‡eni tipovi podataka su

  • Booleova
  • Dug
  • Niz
  • Popis
  • WebElement.

JavascriptSintaksa izvrลกitelja:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • Script - Ovo je JavaSkripta koja se treba izvrลกiti.
  • argumenti โ€“ To su argumenti scenariju. Nije obavezno.

izvrลกi AsyncScript

S asinkronom skriptom vaลกa se stranica prikazuje brลพe. Umjesto da tjeraju korisnike da ฤekaju da se skripta preuzme prije nego ลกto se stranica renderira. Ova funkcija ฤ‡e izvrลกiti asinkroni dio JavaSkripta u kontekstu trenutno odabranog okvira ili prozora Selenium. Tako izveden JS jednonitni je s razliฤitim funkcijama povratnog poziva koje se izvode sinkrono.

Kako koristiti JavaScriptExecutor u Selenium

Ovdje je korak po korak postupak koriลกtenja JavaScriptExecutor u Selenium:

Korak 1) Uvezi paket.

import org.openqa.selenium.JavascriptExecutor;

Korak 2) Stvorite referencu.

JavascriptExecutor js = (JavascriptExecutor) driver;

Korak 3) Nazovite JavascriptMetoda izvrลกitelja.

js.executeScript(script, args);

Primjer klika na element pomoฤ‡u JavaScripExecutor u Selenium

Za executeScript, vidjet ฤ‡emo tri razliฤita primjera jedan po jedan.

1) Primjer: Kliknite gumb za prijavu i generiranje prozora upozorenja pomoฤ‡u JavaScriptExecutor.

U ovom scenariju koristit ฤ‡emo "GuruDemo stranica od 99โ€ za ilustraciju JavaScriptExecutor. U ovom primjeru,

Pritisnite gumb za prijavu i generiranje prozora upozorenja pomoฤ‡u JavaScriptExecutor

  • Prikaz prozora upozorenja nakon uspjeลกne prijave.
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');");   
    		
    }		
}

Izlaz: Kada se kod uspjeลกno izvede. Vi ฤ‡ete promatrati

  • Uspjeลกan klik na gumb za prijavu i
  • Prikazat ฤ‡e se prozor upozorenja (pogledajte sliku ispod).

Pritisnite gumb za prijavu i generiranje prozora upozorenja pomoฤ‡u JavaScriptExecutor

2) Primjer: Snimite skrape podatke i idite na razliฤite stranice pomoฤ‡u JavaScriptExecutor.

Izvrลกite donju selenium skriptu. U ovom primjeru,

  • Pokrenite stranicu
  • Dohvatite detalje stranice kao ลกto su URL stranice, naziv stranice i naziv domene stranice.
  • Zatim prijeฤ‘ite na drugu stranicu.
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/'");			
    }		
}

Izlaz: Kada se gornji kod uspjeลกno izvrลกi, dohvatit ฤ‡e pojedinosti web-mjesta i otiฤ‡i na drugu stranicu kao ลกto je prikazano u nastavku.

Snimite skrape podatke i idite na razliฤite stranice pomoฤ‡u JavaScriptExecutor

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

Snimite skrape podatke i idite na razliฤite stranice pomoฤ‡u JavaScriptExecutor

3) Primjer: Pomaknite se prema dolje pomoฤ‡u JavaScriptExecutor.

Izvrลกite donju selenium skriptu. U ovom primjeru,

  • Pokrenite stranicu
  • Pomaknite se prema dolje za 600 piksela
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)");			
    }		
}

Izlaz: Kada se gornji kod izvrลกi, pomaknut ฤ‡e se prema dolje za 600 piksela (pogledajte sliku ispod).

Pomaknite se prema dolje pomoฤ‡u JavaScriptExecutor

Primjer executeAsyncScript u Selenium

Koriลกtenje executeAsyncScript pomaลพe u poboljลกanju izvedbe vaลกeg testa. Omoguฤ‡uje test pisanja viลกe nalik normalnom kodiranju.

IzvrลกniSync blokira daljnje radnje koje izvodi Selenium preglednik, ali execAsync ne blokira akciju. Poslat ฤ‡e povratni poziv strani posluลพitelja Ispitivanje paket nakon ลกto je skripta gotova. To znaฤi da ฤ‡e sve unutar skripte izvrลกiti preglednik, a ne posluลพitelj.

Primjer 1: Izvoฤ‘enje mirovanja u pregledniku koji se testira.

U ovom scenariju koristit ฤ‡emo "GuruDemo stranica od 99โ€ za ilustraciju executeAsyncScript. U ovom primjeru ฤ‡ete

Korak 1) Zabiljeลพite vrijeme poฤetka prije ฤekanja od 5 sekundi (5000 milisekundi) pomoฤ‡u metode executeAsyncScript().

Korak 2) Zatim upotrijebite executeAsyncScript() da priฤekate 5 sekundi.

Korak 3) Zatim dohvatite trenutno vrijeme.

Korak 4) ispodtract (trenutno vrijeme โ€“ vrijeme poฤetka) = proteklo vrijeme.

Korak 5) Provjerite izlaz koji bi trebao prikazivati โ€‹โ€‹viลกe od 5000 milisekundi

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

Izlaz: Uspjeลกno prikazano proteklo vrijeme viลกe od 5 sekundi (5000 milisekundi) kao ลกto je prikazano u nastavku:

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

Pitanja i odgovori

Kada lokatori ne uspiju, WebDriver ne otkriva skrivene elemente, pomicanje ili pristup DOM-u.

Da. Copilot generira isjeฤke, predlaลพe obrasce pomicanja i refaktorira nestabilne testove.

Da. Testim i Mabl selektore za automatsko izljeฤenje i dodajte JavaRezervne skripte.

executeScript je sinkroniziran. executeAsyncScript se dovrลกava putem povratnog poziva za asinkroni kod.

Pozovite js.executeScript(โ€œarguments[0].scrollIntoView(true);โ€, element).

Koristite ga samo kada WebDriver naredbe ne uspiju ili je potrebna manipulacija DOM-om.

Ne. Moลพe nadjaฤati window.alert prije pokretanja. Koristite Alert API za izvorne dijaloge.

Pretvori rezultat executeScript, npr. String t = (String) js.executeScript(โ€œreturn document.title;โ€);.

Saลพmite ovu objavu uz: