Intermediate Chapter 12 · 10 min read

JavaScript Executor

Execute JavaScript in the browser context — scroll, manipulate DOM, handle hidden elements, extract data, and trigger events.

JavaScript Executor

Sometimes Selenium's built-in methods aren't enough. JavaScriptExecutor lets you run arbitrary JavaScript in the browser — scrolling, modifying DOM, clicking hidden elements, extracting computed styles, and more.

JavaScriptExecutorTest.java
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.*;
import java.time.Duration;

public class JavaScriptExecutorTest {

    WebDriver driver;
    JavascriptExecutor js;

    @BeforeMethod
    public void setup() {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        js = (JavascriptExecutor) driver;
    }

    @Test
    public void testScrollDown() {
        driver.get("https://www.selenium.dev/");

        // Scroll to bottom of page
        js.executeScript("window.scrollTo(0, document.body.scrollHeight)");

        // Scroll by pixels
        js.executeScript("window.scrollBy(0, 500)");

        // Scroll element into view
        WebElement footer = driver.findElement(By.tagName("footer"));
        js.executeScript("arguments[0].scrollIntoView(true);", footer);
    }

    @Test
    public void testClickHiddenElement() {
        driver.get("https://www.selenium.dev/selenium/web/web-form.html");

        WebElement element = driver.findElement(By.name("my-text"));
        // JS click bypasses visibility checks
        js.executeScript("arguments[0].click();", element);
    }

    @Test
    public void testGetPageInfo() {
        driver.get("https://www.selenium.dev/");

        String title = (String) js.executeScript("return document.title;");
        Long height = (Long) js.executeScript(
            "return document.body.scrollHeight;");
        String readyState = (String) js.executeScript(
            "return document.readyState;");

        System.out.println("Title: " + title);
        System.out.println("Page height: " + height);
        System.out.println("Ready state: " + readyState);

        Assert.assertEquals(readyState, "complete");
    }

    @Test
    public void testModifyDOM() {
        driver.get("https://www.selenium.dev/selenium/web/web-form.html");

        // Change element style
        WebElement input = driver.findElement(By.name("my-text"));
        js.executeScript(
            "arguments[0].style.border='3px solid red';", input);

        // Set value directly
        js.executeScript(
            "arguments[0].value='Set via JavaScript';", input);

        // Add text to page
        js.executeScript(
            "document.body.insertAdjacentHTML('beforeend', "
            + "'<p id="js-added">Added by JS</p>');");

        WebElement added = driver.findElement(By.id("js-added"));
        Assert.assertEquals(added.getText(), "Added by JS");
    }

    @Test
    public void testWaitForPageLoad() {
        driver.get("https://www.selenium.dev/");

        // Wait for jQuery (if present)
        // js.executeScript("return jQuery.active == 0");

        // Wait for document ready
        js.executeScript(
            "return document.readyState === 'complete'");
    }

    @AfterMethod
    public void teardown() { if (driver != null) driver.quit(); }
}
test_javascript_executor.py
from selenium import webdriver
from selenium.webdriver.common.by import By
import pytest

@pytest.fixture
def driver():
    d = webdriver.Chrome()
    d.implicitly_wait(10)
    yield d
    d.quit()


def test_scroll_down(driver):
    driver.get("https://www.selenium.dev/")

    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    driver.execute_script("window.scrollBy(0, 500)")

    footer = driver.find_element(By.TAG_NAME, "footer")
    driver.execute_script("arguments[0].scrollIntoView(true);", footer)


def test_click_hidden_element(driver):
    driver.get("https://www.selenium.dev/selenium/web/web-form.html")

    element = driver.find_element(By.NAME, "my-text")
    driver.execute_script("arguments[0].click();", element)


def test_get_page_info(driver):
    driver.get("https://www.selenium.dev/")

    title = driver.execute_script("return document.title;")
    height = driver.execute_script("return document.body.scrollHeight;")
    state = driver.execute_script("return document.readyState;")

    print(f"Title: {title}, Height: {height}, State: {state}")
    assert state == "complete"


def test_modify_dom(driver):
    driver.get("https://www.selenium.dev/selenium/web/web-form.html")

    input_el = driver.find_element(By.NAME, "my-text")
    driver.execute_script(
        "arguments[0].style.border='3px solid red';", input_el)
    driver.execute_script(
        "arguments[0].value='Set via JavaScript';", input_el)

    driver.execute_script(
        """document.body.insertAdjacentHTML('beforeend',
        '<p id="js-added">Added by JS</p>');"""
    )

    added = driver.find_element(By.ID, "js-added")
    assert added.text == "Added by JS" 

Selenium Intermediate JavaScript Executor

Written by PV

© 2026 All Rights Reserved