WebDriver executeAsyncScript vs executeScript

0
0

What is the difference between executeAsyncScript and executeScript? How can i use event such as window.onload? I tried something like this

((JavascriptExecutor) driver).executeAsyncScript("window.onload = function() {alert('Hello')}"); 

But of course it did not work…
So if anyone knows how it works please write an example

  • You must to post comments
0
0

I use executeScript. Example provided:

String cssSelector="...blablabla...";
JavascriptExecutor js = (JavascriptExecutor) driver;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder
.append("document.getElementById(\'"+cssSelector +"\').click();");
js
.executeScript(stringBuilder.toString());

Concerning details on alerts there is known issue. you can get details here

In accordance with documentation difference is:

executeScript

public java.lang.Object executeScript(java.lang.String script,
java
.lang.Object... args)

Description copied from interface: JavascriptExecutor
Executes JavaScript in the context of the currently selected frame or window. The script fragment provided will be executed as the body of
an anonymous function. Within the script, use document to refer to the
current document. Note that local variables will not be available once
the script has finished executing, though global variables will
persist. If the script has a return value (i.e. if the script contains
a return statement), then the following steps will be taken:

  • For an HTML element, this method returns a WebElement
  • For a decimal, a Double is returned
  • For a non-decimal number, a Long is returned
  • For a boolean, a Boolean is returned
  • For all other cases, a String is returned.
  • For an array, return a List with each object following the rules above. We support nested lists.
  • Unless the value is null or there is no return value, in which null is returned

Arguments must be a number, a boolean, a String, WebElement, or a List
of any combination of the above. An exception will be thrown if the
arguments do not meet these criteria. The arguments will be made
available to the JavaScript via the “arguments” magic variable, as if
the function were called via “Function.apply”

Specified by: executeScript in interface JavascriptExecutor
Parameters: script – The JavaScript to execute args – The arguments to
the script. May be empty Returns: One of Boolean, Long, String, List
or WebElement. Or null.

executeAsyncScript

public java.lang.Object executeAsyncScript(java.lang.String script,
java
.lang.Object... args)

Description copied from interface: JavascriptExecutor
Execute an asynchronous piece of JavaScript in the context of the currently selected frame or window. Unlike executing synchronous
JavaScript, scripts executed with this method must explicitly signal
they are finished by invoking the provided callback. This callback is
always injected into the executed function as the last argument.
The
first argument passed to the callback function will be used as the
script’s result. This value will be handled in the same way as the
synchronous case.

Example #1: Performing a sleep in the browser under test.

 long start = System.currentTimeMillis();
((JavascriptExecutor) driver).executeAsyncScript(
"window.setTimeout(arguments[arguments.length - 1], 500);");
System.out.println(
"Elapsed time: " + (System.currentTimeMillis() - start));

Example #2: Synchronizing a test with an AJAX application:

 WebElement composeButton = driver.findElement(By.id("compose-button"));
composeButton
.click();
((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"mailClient.getComposeWindowWidget().onload(callback);");
driver
.switchTo().frame("composeWidget");
driver
.findElement(By.id("to")).sendKeys("bog@example.com");

Example #3: Injecting a XMLHttpRequest and waiting for the result:

 Object response = ((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"var xhr = new XMLHttpRequest();" +
"xhr.open('GET', '/resource/data.json', true);" +
"xhr.onreadystatechange = function() {" +
" if (xhr.readyState == 4) {" +
" callback(xhr.responseText);" +
" }" +
"}" +
"xhr.send();");
JSONObject json = new JSONObject((String) response);
assertEquals
("cheese", json.getString("food"));

Script arguments must be a number, a boolean, a String, WebElement,
or a List of any combination of the above. An exception will be thrown
if the arguments do not meet these criteria. The arguments will be
made available to the JavaScript via the “arguments” variable.

Specified by: executeAsyncScript in interface JavascriptExecutor
Parameters: script – The JavaScript to execute. args – The arguments
to the script. May be empty. Returns: One of Boolean, Long, String,
List, WebElement, or null.

Detailed documentation is here

  • You must to post comments
Showing 1 result
Your Answer
Post as a guest by filling out the fields below or if you already have an account.
Name*
E-mail*
Website