JavaScriptExecutor в Selenium WebDriver (пример)

⚡ Умное резюме

JavaScriptExecutor в Selenium WebDriver работает JavaВ случае неэффективности локаторов используйте скрипты, встроенные в браузер. LessВ этом разделе рассматриваются примеры использования executeScript, executeAsyncScript, scroll, click, alerts и form input.

  • ⚙️ Решает задачи на определение пределов: Обходит скрытые элементы и JavaСтраницы, содержащие большое количество скриптов.
  • 🧩 Два метода: executeScript выполняет синхронные операции; executeAsyncScript обрабатывает асинхронные операции через функцию обратного вызова.
  • 📜 Свиток: Прокрутка окна, переход к координатам или прокрутка элемента для отображения.
  • 🇧🇷 Скрытые клики: Вызывает метод click() для элементов, недоступных для WebDriver.
  • ???? Контроль формы: Внедряйте значения и считывайте текст из сложных элементов.
  • 🤖 Фрагменты кода ИИ: Инструменты ИИ генерируют JavaИсправьте код ScriptExecutor и исправьте нестабильные селекторы.

JavaScriptExecutor в Selenium

Что такое JavaСкриптExecutor?

JavaScriptExecutor — это интерфейс, который помогает выполнять JavaСценарий через Selenium Вебдрайвер. JavaScriptExecutor предоставляет два метода «executescript» и «executeAsyncScript» для запуска JavaScript в выбранном окне или на текущей странице.

JavaScriptExecutor

Зачем нам JavaСкриптExecutor?

In Selenium Webdriver, локаторы, такие как XPath, CSS и т. д., используются для идентификации и выполнения операций на веб-странице.

В случае, если эти локаторы не работают, вы можете использовать JavaScriptExecutor. Вы можете использовать JavaScriptExecutor для выполнения требуемой операции над веб-элементом.

Selenium поддерживает javaScriptExecutor. Нет необходимости в дополнительных плагинах или дополнениях. Вам просто нужно импортировать (org.openqa.selenium.Javascriptдушеприказчик) в сценарии, как использовать JavaScriptExecutor.

JavaМетоды ScriptExecutor в Selenium

выполнить скрипт

Этот метод выполняет JavaСценарий в контексте текущего выбранного кадра или окна в Selenium. Сценарий, используемый в этом методе, выполняется в теле анонимной функции (функции без имени). Мы также можем передавать ему сложные аргументы.

Скрипт может возвращать значения. Возвращаемые типы данных:

  • Логический
  • Длинное
  • строка
  • Список
  • ВебЭлемент.

JavascriptСинтаксис исполнителя:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • Сценарий - это JavaСкрипт, который необходимо выполнить.
  • аргументы – Это аргументы к сценарию. Это необязательно.

выполнитьAsyncScript

С асинхронным скриптом ваша страница отображается быстрее. Вместо того, чтобы заставлять пользователей ждать загрузки скрипта перед отображением страницы. Эта функция выполнит асинхронный фрагмент JavaСкрипт в контексте текущего выбранного кадра или окна в Selenium. Выполняемый таким образом JS является однопоточным с различными функциями обратного вызова, которые работают синхронно.

Как это работает? JavaScriptExecutor в Selenium

Вот пошаговый процесс использования JavaScriptExecutor в Selenium:

Шаг 1) Импортируйте пакет.

import org.openqa.selenium.JavascriptExecutor;

Шаг 2) Создайте ссылку.

JavascriptExecutor js = (JavascriptExecutor) driver;

Шаг 3) Позвоните JavascriptМетод исполнителя.

js.executeScript(script, args);

Пример щелчка по элементу с помощью JavaScripExecutor в Selenium

Для ExecuteScript мы увидим три разных примера один за другим.

1) Пример: нажмите кнопку, чтобы войти в систему и создать окно оповещения, используя JavaScriptExecutor.

В этом сценарии мы будем использовать «GuruДемонстрационный сайт размером 99 дюймов для иллюстрации. JavaScriptExecutor. В этом примере

  • Запустите веб-браузер
  • открыть сайт https://demo.guru99.com/V4/ и
  • войти с учетными данными

Нажмите кнопку, чтобы войти в систему и создать окно оповещения, используя JavaScriptExecutor

  • Отображать окно оповещения при успешном входе в систему.
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');");   
    		
    }		
}

Выход: Когда код выполняется успешно. Вы будете наблюдать

  • Успешное нажатие кнопки входа в систему и
  • Появится окно оповещения (см. изображение ниже).

Нажмите кнопку, чтобы войти в систему и создать окно оповещения, используя JavaScriptExecutor

2) Пример: сбор данных очистки и переход на разные страницы с помощью JavaScriptExecutor.

Выполните приведенный ниже сценарий селена. В этом примере

  • Запустить сайт
  • Получите подробную информацию о сайте, например: URL название сайта, заголовок и доменное имя сайта.
  • Затем перейдите на другую страницу.
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/'");			
    }		
}

Выход: Когда приведенный выше код будет выполнен успешно, он получит подробную информацию о сайте и перейдет на другую страницу, как показано ниже.

Собирайте данные очистки и переходите на разные страницы, используя 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
===============================================

Собирайте данные очистки и переходите на разные страницы, используя JavaScriptExecutor

3) Пример: прокрутите вниз с помощью JavaScriptExecutor.

Выполните приведенный ниже сценарий селена. В этом примере

  • Запустить сайт
  • Прокрутите вниз на 600 пикселей
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)");			
    }		
}

Результат: Когда приведенный выше код будет выполнен, он прокрутится вниз на 600 пикселей (см. изображение ниже).

Прокрутите вниз, используя JavaScriptExecutor

Пример executeAsyncScript в Selenium

Использование ExecuteAsyncScript помогает повысить производительность вашего теста. Это позволяет писать тесты, больше похожие на обычное программирование.

ExecSync блокирует дальнейшие действия, выполняемые Selenium браузер, но execAsync не блокирует действие. Он отправит обратный вызов на серверную сторону Тестирование suite после завершения сценария. Это означает, что все внутри скрипта будет выполняться браузером, а не сервером.

Пример 1: переход в режим сна в тестируемом браузере.

В этом сценарии мы будем использовать «GuruДемонстрационный сайт размером 99 дюймов для иллюстрации функции executeAsyncScript. В этом примере вы...

  • Запустите браузер.
  • Открытый сайт https://demo.guru99.com/V4/.
  • Приложение ждет 5 секунд, чтобы выполнить дальнейшее действие.

Шаг 1) Зафиксируйте время начала перед ожиданием в течение 5 секунд (5000 миллисекунд) с помощью метода ExecuteAsyncScript().

Шаг 2) Затем используйте выполнениеAsyncScript() и подождите 5 секунд.

Шаг 3) Затем получите текущее время.

Шаг 4) нижеtract (текущее время – время начала) = прошедшее время.

Шаг 5) Убедитесь, что вывод должен отображать более 5000 миллисекунд.

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

Выход: Успешно отобразилось пройденное время более 5 секунд (5000 миллисекунд), как показано ниже:

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

Когда локаторы не работают для скрытых элементов, прокрутки или доступа к DOM, WebDriver их не предоставляет.

Да. Copilot генерирует фрагменты кода, предлагает варианты прокрутки и перерабатывает нестабильные тесты.

Да. Testim и селекторы автоматического лечения Mabl и добавить JavaРезервные варианты скрипта.

executeScript выполняется синхронно. executeAsyncScript завершается через коллбэк для асинхронного кода.

Вызовите js.executeScript(“arguments[0].scrollIntoView(true);”, element).

Используйте его только в тех случаях, когда команды WebDriver завершаются с ошибкой или требуется манипулирование DOM.

Нет. Он может переопределить window.alert перед срабатыванием. Используйте Alert API для нативных диалоговых окон.

Преобразуйте результат выполнения скрипта, например: String t = (String) js.executeScript(“return document.title;”);.

Подведем итог этой публикации следующим образом: