2012-10-08 18 views
4

我無法理解此HTMLUnit異常的含義。當我在網頁上的鏈接上調用click()時會發生這種情況。HtmlUnit異常

Exception class=[net.sourceforge.htmlunit.corejs.javascript.WrappedException] 
com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot read property "offsetWidth" from null (http://webapps6.doc.state.nc.us/opi/scripts/DHTMLmessages.js#95) (javascript url#297) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:534) 
at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537) 
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:432) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:407) 
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptIfPossible(HtmlPage.java:965) 
at com.gargoylesoftware.htmlunit.html.HtmlAnchor.doClickAction(HtmlAnchor.java:87) 
at com.gargoylesoftware.htmlunit.html.HtmlAnchor.doClickAction(HtmlAnchor.java:121) 
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1329) 
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1288) 
at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1257) 
at testapp.TestApp.main(TestApp.java:61) 
Caused by: net.sourceforge.htmlunit.corejs.javascript.WrappedException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot read property "offsetWidth" from null (http://webapps6.doc.state.nc.us.js#95) (javascript url#297) 
at net.sourceforge.htmlunit.corejs.javascript.Context.throwAsScriptRuntimeEx(Context.java:1802) 
at net.sourceforge.htmlunit.corejs.javascript.MemberBox.invoke(MemberBox.java:196) 
at net.sourceforge.htmlunit.corejs.javascript.FunctionObject.call(FunctionObject.java:479) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1701) 
at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:854) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164) 
at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429) 
at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:267) 
at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3183) 
at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:175) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$5.doRun(JavaScriptEngine.java:423) 
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:528) 
... 11 more 
+1

從堆棧跟蹤:裹com.gargoylesoftware.htmlunit.ScriptException:類型錯誤:無法從空讀取屬性「offsetWidth」 –

+1

添加的log4j作爲依賴於從打印這些信息停止的HtmlUnit。 – LanguagesNamedAfterCofee

回答

1

JS問題再次與HtmlUnit。您需要更正您的JS代碼,因爲它很可能包含錯誤。如果你不擁有JS代碼,那麼HtmlUnit不會解決這個問題。看看我提供的答案here

5

當您單擊並且此鏈接調用另一個頁面時,htmlUnit在導航過程中對異常可能非常冗長。如果您點擊瀏覽器並打開控制檯,可能會看到這些錯誤,缺少鏈接或圖像,調用腳本時出錯。

這些都不是必需的Javascript問題與HtmlUnit。

就像我在這裏說的HtmlUnit not creating HtmlPage object你可以設置或修改htmlUnit來防止不必要的日誌。您也可以設置log4j並禁用一些例外。

所以我們使用這些選項,使HTML navegating不會對第一個錯誤/問題回採我們使用:

webClient.getOptions().setThrowExceptionOnScriptError(false); 
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 

您還可以實現空類停止htmlUnity詳細的去了解與CSS/JavaScript錯誤控制檯:

webClient.setCssErrorHandler(new SilentCssErrorHandler());  
webClient.setJavaScriptErrorListener(new JavaScriptErrorListener(){}); 

小樣品測試案例:

@Test 
public void TestCall() throws FailingHttpStatusCodeException, MalformedURLException, IOException {  
    WebClient webClient = new WebClient(BrowserVersion.CHROME); 
    webClient.getOptions().setUseInsecureSSL(true); //ignore ssl certificate 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    String url = "https://www.wearvr.com/#game_id=game_4"; 
    HtmlPage myPage = webClient.getPage(url); 
    webClient.waitForBackgroundJavaScriptStartingBefore(200); 
    webClient.waitForBackgroundJavaScript(20000); 
    //do stuff on page ex: myPage.getElementById("main") 
    //myPage.asXml() <- tags and elements 
    System.out.println(myPage.asText()); 

} 

你也可以在這裏看到更多Turning HtmlUnit Warnings off

0

Htmlunit通常不能很好地處理js代碼。 如果你想點擊一個鏈接,最好找到使用htmlunit api的元素,例如 。

page.getHtmlElementById("some_div_id"); 
    page.getByXPath("//div");