When to Use JavaScriptExecutor

Good and Bad Uses

Use it forAvoid it for
scrolling, infinite scrollnormal clicks and typing (use WebDriver)
reading page state: readyState, localStoragebypassing a popup that a user would see
setting up test state quickly (feature flags, clearing storage)making a failing test "pass"
highlighting and debuggingreplacing proper waits

Decide Like a Reviewer

Example

A simple rule set a reviewer applies to every JavaScript call in a pull request:

import java.util.*;

public class Main {
    static String review(String script) {
        if (script.contains(".click()")) return "QUESTION: why not WebElement.click()? Is something covering it?";
        if (script.contains(".value =")) return "OK only for setup; also fire an input/change event";
        if (script.contains("scroll")) return "OK";
        if (script.startsWith("return ")) return "OK: read-only";
        return "REVIEW";
    }

    public static void main(String[] args) {
        List<String> scripts = List.of(
            "arguments[0].click();",
            "window.scrollBy(0, 600);",
            "return document.readyState;",
            "arguments[0].value = '2026-10-28';");
        for (String s : scripts) System.out.printf("%-36s -> %s%n", s, review(s));
    }
}

Output

arguments[0].click();                -> QUESTION: why not WebElement.click()? Is something covering it?
window.scrollBy(0, 600);             -> OK
return document.readyState;          -> OK: read-only
arguments[0].value = '2026-10-28';   -> OK only for setup; also fire an input/change event