0

I am trying to implement a script I found online that automatically loads jQuery into sites that don't currently have them. I am using Selenium Webdriver's JS Executor function; however, it keeps returning a Null Pointer Exception. I tried to look everywhere for an answer, but can't seem to understand what's going on. What gives?

/** Browser automation driver for this test instance. */
private WebDriver driver;

/** JavaScript Executor for this test instance. */
private JavascriptExecutor js = (JavascriptExecutor) driver;

//...Firefox browser initialized here

 public void JQuerify(final String Url){
    ReporterNG.log("Opening a webpage at: " + Url);
    driver.get(Url);

    ReporterNG.log("Converting JS file to a String");

        String jQueryLoader = getLoadJQuery();

        // give jQuery time to load asynchronously
        driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);

        js.executeAsyncScript(jQueryLoader);
        //THE PROBLEM ALWAYS OCCURS WITH THIS ^^^^^

        ReporterNG.log("jQuery loaded!");
        //THIS NEVER PRINTS OUT DUE TO THE ERROR ^^^^
}

 /** dynamically load jQuery */
public static String getLoadJQuery(){
    String LoadJQuery = "(function(jqueryUrl, callback) {\n" +
            "if (typeof jqueryUrl != 'string') {" +
            "jqueryUrl = 'https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js';\n" +
            "}\n" +
            "if (typeof jQuery == 'undefined') {\n" +
            "var script = document.createElement('script');\n" +
            "var head = document.getElementsByTagName('head')[0];\n" +
            "var done = false;\n" +
            "script.onload = script.onreadystatechange = (function() {\n" +
            "if (!done && (!this.readyState || this.readyState == 'loaded'\n" +
            "|| this.readyState == 'complete')) {\n" +
            "done = true;\n" +
            "script.onload = script.onreadystatechange = null;\n" +
            "head.removeChild(script);\n" +
            "callback();\n" +
            "}\n" +
            "});\n" +
            "script.src = jqueryUrl;\n" +
            "head.appendChild(script);\n" +
            "}\n" +
            "else {\n" +
            "callback();\n" +
            "}\n" +
            "})(arguments[0], arguments[arguments.length - 1]);\n";
    return LoadJQuery;
}

Any help would be greatly appreciated, as I am having the same problems with other similar applications of JS Executor. Thank you!

1 Answer 1

1

Make the JavascriptExecutor instance local to that method.

JavascriptExecutor js = (JavascriptExecutor) driver;
// give jQuery time to load asynchronously
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);
js.executeAsyncScript(jQueryLoader);
Sign up to request clarification or add additional context in comments.

1 Comment

That worked. Thanks so much! But do you happen to know why it requires a local instance?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.