When you want to execute JavaScript on the browser :)
This was my answer to a question on Quora
https://www.quora.com/When-should-I-use-JavaScriptExecutor-in-Selenium-WebDriver/answer/Aaron-Evans
JavaScriptExecutor is an interface that defines 2 methods:
in Java (and similarly in C#):
Object executeScript(String script, Object... args)
and
Object executeAsyncScript(String script, Object... args)
which take as an argument a string representing the JavaScript code you want to execute on the browser and (optionally) one or more arguments. If the second argument is a WebElement
it will apply the script to the corresponding HTML element. Arguments are added to the JS magic arguments
variable which represents the values passed to a function. If the code executed returns a value, that is returned to your Selenium code
Each driver is responsible for implementing it for the browser.
RemoteWebDriver implements it as well.
But when *you* as a Selenium user want to use JavaScriptExecutor is when you assign a driver to the base type WebDriver, which does not implement it.
in this case, you cast your driver instance (which really does implement executeScript()
and executeScriptAsync()
.
For example
WebDriver driver = new ChromeDriver();
// base type ‘WebDriver’ does not define executeScript() although our instance that extends RemoteWebDriver actually does implement it.
// So we need to cast it to ‘JavaScriptExecutor’ to let the Java compiler know.
JavaScriptExecutor js = (JavaScriptExecutor) driver;
js.executeScript(“alert(‘hi from Selenium’);”
if you keep your instance typing, you do not need to cast to JavaScriptExecutor.
RemoteWebDriver driver = new RemoteWebDriver(url, capabilities);
// information about our type is not lost so the Java compiler knows our object implements executeScript()
WebElement element = driver.findElement(By.id(“mybutton”));
driver.executeScript(“arguments[0].click();", element);
// in the above case it adds the element to arguments and performs a click() event (in JavaScript in the browser) on our element
String htmlsnippet = driver.executeScript(“return document.querySelector(‘#myid’).outerHTML” , element);
// this time we use native JavaScript on the browser to find an element and return its HTML, bypassing Selenium’s ability to do so.
The above two examples illustrate ways you can accomplish in JavaScript what you would normally use Selenium for.
Why would you do this?
Well, sometimes the driver has a bug, or it can be more efficient (or reliable) to do in JavaScript, or you might want to combine multiple actions in 1 WebDriver call.