JavaScriptExecutor w Selenium WebDriver (przykład)

⚡ Inteligentne podsumowanie

JavaScriptExecutor w Selenium WebDriver działa JavaSkrypt w przeglądarce, gdy lokalizatory okazują się niewystarczające. LessPrzykłady obejmują executeScript, executeAsyncScript, przewijanie, klikanie, alerty i wprowadzanie danych w formularzach.

  • ⚙️ RozwiÄ…zuje ograniczenia: Omija ukryte elementy i JavaStrony z duĹĽÄ… iloĹ›ciÄ… skryptĂłw.
  • đź§© Dwie metody: executeScript uruchamia synchronizacjÄ™; executeAsyncScript obsĹ‚uguje asynchroniczność za pomocÄ… wywoĹ‚ania zwrotnego.
  • 📜 ZwĂłj: PrzewiĹ„ okno, przejdĹş do współrzÄ™dnych lub przewiĹ„ element do widoku.
  • 🖱️. Ukryte klikniÄ™cia: Wyzwalacz click() na elementach, do ktĂłrych WebDriver nie moĹĽe dotrzeć.
  • 📝 Kontrola formularza: Wstrzykiwanie wartoĹ›ci i odczytywanie tekstu z trudnych elementĂłw.
  • 🤖 Fragmenty kodu AI: NarzÄ™dzia AI generujÄ… JavaKod ScriptExecutor i naprawa niestabilnych selektorĂłw.

JavaScriptExecutor w Selenium

Czym jest JavaScriptExecutor?

JavaScriptExecutor to interfejs, który pomaga w wykonywaniu JavaSkrypt przez Selenium Sterownik internetowy. JavaScriptExecutor udostępnia dwie metody: „executescript” i „executeAsyncScript” umożliwiające uruchomienie kodu JavaScript w wybranym oknie lub bieżącej stronie.

JavaWykonawca skryptu

Dlaczego potrzebujemy JavaScriptExecutor?

In Selenium Webdriver i lokalizatory takie jak XPath, CSS itp. służą do identyfikowania i wykonywania operacji na stronie internetowej.

W przypadku, gdy te lokalizatory nie działają, możesz skorzystać JavaScriptExecutor. Możesz użyć JavaScriptExecutor wykonuje żądaną operację na elemencie internetowym.

Selenium obsługuje javaScriptExecutor. Nie ma potrzeby stosowania dodatkowej wtyczki ani dodatku. Wystarczy zaimportować (org.openqa.selenium.JavascriptWykonawca) w skrypcie, jak używać JavaScriptExecutor.

JavaMetody ScriptExecutor w Selenium

wykonajSkrypt

Ta metoda jest wykonywana JAVASCRIPT w kontekście aktualnie wybranej ramki lub okna Selenium. Skrypt używany w tej metodzie działa w treści funkcji anonimowej (funkcji bez nazwy). Możemy mu także przekazywać skomplikowane argumenty.

Skrypt może zwracać wartości. Zwracane typy danych to

  • Boolean
  • dĹ‚ugo
  • sznur
  • Lista
  • Element sieciowy.

JavascriptSkładnia executora:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • Scenariusz - To jest JavaSkrypt, ktĂłry naleĹĽy wykonać.
  • Argumenty – To argumenty do scenariusza. To opcjonalne.

wykonajAsyncScript

Dzięki asynchronicznemu skryptowi Twoja strona renderuje się szybciej. Zamiast zmuszać użytkowników do czekania na pobranie skryptu przed renderowaniem strony. Ta funkcja wykona asynchroniczny fragment JavaSkrypt w kontekście aktualnie wybranej ramki lub okna w SeleniumWykonany w ten sposób kod JS jest jednowątkowy i zawiera różnorodne funkcje wywołania zwrotnego, które działają synchronicznie.

Jak używać JavaScriptExecutor w Selenium

Oto procedura krok po kroku dotyczÄ…ca uĹĽycia JavaScriptExecutor w Selenium:

Krok 1) Zaimportuj pakiet.

import org.openqa.selenium.JavascriptExecutor;

Krok 2) UtwĂłrz odniesienie.

JavascriptExecutor js = (JavascriptExecutor) driver;

Krok 3) Zadzwoń do JavascriptMetoda wykonawcy.

js.executeScript(script, args);

Przykład kliknięcia elementu za pomocą JavaExecutor skryptów w Selenium

W przypadku skryptu wykonawczego zobaczymy jeden po drugim trzy różne przykłady.

1) Przykład: Kliknij przycisk, aby się zalogować i wygenerować okno alertów JavaScriptExecutor.

W tym scenariuszu użyjemy „Guru99-calowa witryna demonstracyjna do zilustrowania JavaScriptExecutor. W tym przykładzie,

  • Uruchom przeglÄ…darkÄ™ internetowÄ…
  • otwĂłrz witrynÄ™ https://demo.guru99.com/V4/ oraz
  • zaloguj siÄ™ z danymi uwierzytelniajÄ…cymi

Kliknij przycisk, aby się zalogować i wygenerować okno alertów JavaWykonawca skryptu

  • WyĹ›wietl okno alertu po udanym logowaniu.
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');");   
    		
    }		
}

Wyjście: Gdy kod zostanie pomyślnie wykonany. Będziesz obserwować

  • PomyĹ›lne klikniÄ™cie przycisku logowania i
  • WyĹ›wietli siÄ™ okno alertu (patrz obrazek poniĹĽej).

Kliknij przycisk, aby się zalogować i wygenerować okno alertów JavaWykonawca skryptu

2) Przykład: przechwytywanie danych i nawigowanie do różnych stron za pomocą JavaScriptExecutor.

Wykonaj poniższy skrypt selenu. W tym przykładzie,

  • Uruchom witrynÄ™
  • Pobierz szczegóły witryny, takie jak URL witryny, tytuĹ‚u i nazwy domeny witryny.
  • NastÄ™pnie przejdĹş na innÄ… stronÄ™.
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/'");			
    }		
}

Wyjście: Gdy powyższy kod zostanie wykonany poprawnie, zostaną pobrane szczegóły witryny i nastąpi przejście do innej strony, jak pokazano poniżej.

Przechwytuj dane Scrape i przejdź do różnych stron za pomocą JavaWykonawca skryptu

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

Przechwytuj dane Scrape i przejdź do różnych stron za pomocą JavaWykonawca skryptu

3) Przykład: przewiń w dół za pomocą JavaScriptExecutor.

Wykonaj poniższy skrypt selenu. W tym przykładzie,

  • Uruchom witrynÄ™
  • PrzewiĹ„ w dół o 600 pikseli
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)");			
    }		
}

Wydajność: Kiedy powyższy kod zostanie wykonany, zostanie on przewinięty w dół o 600 pikseli (patrz obrazek poniżej).

Przewiń w dół za pomocą JavaWykonawca skryptu

Przykład executeAsyncScript w Selenium

Użycie executeAsyncScript pomaga poprawić wydajność testu. Pozwala pisać testy bardziej jak normalne kodowanie.

WykonawcaSync blokuje dalsze działania wykonywane przez Selenium przeglądarka, ale execAsync nie blokuje akcji. Wyśle wywołanie zwrotne do strony serwera Testy suite po ukończeniu skryptu. Oznacza to, że wszystko wewnątrz skryptu zostanie wykonane przez przeglądarkę, a nie serwer.

Przykład 1: Uśpienie testowanej przeglądarki.

W tym scenariuszu użyjemy „Guru99” strona demonstracyjna ilustrująca wykonanie skryptu w języku AsyncScript. W tym przykładzie

Krok 1) Zarejestruj czas rozpoczęcia przed odczekaniem 5 sekund (5000 milisekund) za pomocą metody executeAsyncScript().

Krok 2) Następnie należy odczekać 5 sekund za pomocą executeAsyncScript().

Krok 3) Następnie uzyskaj aktualny czas.

Krok 4) Podłożetract (czas bieżący – czas początkowy) = czas upływający.

Krok 5) Sprawdź, czy dane wyjściowe powinny wyświetlać więcej niż 5000 milisekund

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

Wyjście: Pomyślnie wyświetlono upływający czas dłuższy niż 5 sekund (5000 milisekund), jak pokazano poniżej:

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

FAQ

Gdy lokalizatory zawiodą, w przypadku ukrytych elementów, przewijania lub dostępu DOM, WebDriver nie ujawnia.

Tak. Copilot generuje fragmenty kodu, sugeruje wzorce przewijania i refaktoryzuje niestabilne testy.

Tak. Testim i selektory automatycznego leczenia Mabl i dodajÄ… JavaAwaryjne skrypty.

executeScript jest synchronizowany. executeAsyncScript jest wykonywany poprzez wywołanie zwrotne dla kodu asynchronicznego.

Wywołanie js.executeScript(“arguments[0].scrollIntoView(true);”, element).

Należy go używać wyłącznie w przypadku, gdy polecenia WebDriver zawiodą lub gdy konieczna jest manipulacja DOM.

Nie. Może zastąpić window.alert przed wyzwoleniem. Użyj API Alert dla natywnych okien dialogowych.

Rzutuj wynik executeScript, np. String t = (String) js.executeScript(“return document.title;”);.

Podsumuj ten post następująco: