package com.abmash.core.browser.interaction;
import java.util.ArrayList;
import java.util.List;
import net.jsourcerer.webdriver.jserrorcollector.JavaScriptError;
import org.openqa.selenium.JavascriptExecutor;
import com.abmash.api.Browser;
import com.abmash.core.browser.JavaScriptResult;
import com.abmash.core.tools.JavaScriptParameterConverter;
public class JavaScriptExecution extends ActionOnBrowser {
private String script = null;
private Boolean sync = true;
private Object[] args = null;
private JavaScriptResult result = null;
public JavaScriptExecution(Browser browser, String script, Boolean sync, Object... args) {
super(browser);
this.script = script;
this.sync = sync;
this.args = convertArguments(args);
}
private Object[] convertArguments(Object... args) {
ArrayList<Object> arguments = new ArrayList<Object>();
for (Object arg: args) {
Object argument = new JavaScriptParameterConverter().apply(arg);
arguments.add(argument);
}
return arguments.toArray();
}
@Override
protected void perform() {
browser.log().trace("Executing JavaScript: " + script);
executeScript();
}
private void executeScript() {
try {
if(sync) {
result = new JavaScriptResult(executeSyncScript());
} else {
result = new JavaScriptResult(executeAsyncScript());
}
} catch(Exception e) {
// try {
// Thread.sleep(500);
// } catch (InterruptedException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
String jsMessage = ""/* + (String) browser.javaScript("return window.jsErrors").getReturnValue()*/;
List<JavaScriptError> jsErrors = new ArrayList<JavaScriptError>();
try {
jsErrors = JavaScriptError.readErrors(browser.getWebDriver());
} catch (Exception e2) {
System.err.println("Warning: fetching JavaScriptErrors failed: " + e2.getMessage());
e2.printStackTrace();
}
String errorMessage = "JavaScript execution failed: " + jsMessage;
errorMessage += "\n" + jsErrors;
errorMessage += "\n" + e.getMessage();
errorMessage += "\n >> for the following script:\n" + script;
errorMessage += "\n >> with the following arguments:\n" + args.toString();
System.err.println(errorMessage + "\n");
e.printStackTrace();
}
// TODO output
if(!result.isNull()) browser.log().debug("returnValue class: " + result.getClass());
}
private Object executeSyncScript() {
return ((JavascriptExecutor) browser.getWebDriver()).executeScript(script, args);
}
private Object executeAsyncScript() {
return ((JavascriptExecutor) browser.getWebDriver()).executeAsyncScript(script, args);
}
public JavaScriptResult getResult() {
return result;
}
}