2013-07-02 80 views
0

我想實現一個我在網上發現的腳本,它自動將jQuery加載到當前沒有它們的站點中。我使用Selenium Webdriver的JS Executor函數;但是,它一直返回一個空指針異常。我試圖到處尋找答案,但似乎無法理解發生了什麼。是什麼賦予了?使用WebDriver JS執行程序來執行.js文件 - >空指針異常

/** 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; 
} 

任何幫助將不勝感激,因爲我有與JS Executor的其他類似的應用程序相同的問題。謝謝!

回答

1

JavascriptExecutor實例作爲該方法的本地實例。

JavascriptExecutor js = (JavascriptExecutor) driver; 
// give jQuery time to load asynchronously 
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); 
js.executeAsyncScript(jQueryLoader); 
+0

工作。非常感謝!但是你碰巧知道爲什麼它需要一個本地實例嗎? – kusold