HtmlUnitexception

我无法理解此HTMLUnitexception的含义。 当我在网页上的链接上调用click()时会发生这种情况。

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 

当您单击并且此链接调用另一个页面时,htmlUnit在导航期间的exception可能非常详细。 如果您单击浏览器并打开控制台,可能会看到这些错误,缺少链接或图像,调用脚本时出错。

这些不是HtmlUnit的Javascript问题。

就像我在这里说的HtmlUnit没有创建HtmlPage对象,你可以设置或修改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()); } 

此外,您可以在此处看到更多关闭HtmlUnit警告

JS再次与HtmlUnit发生争执。 您需要更正JS代码,因为它很可能包含错误。 如果您不拥有JS代码,那么HtmlUnit将无法解决此问题。 看看我在这里提供的答案。

Htmlunit通常不能很好地处理js代码。 如果要单击链接,最好使用htmlunit api查找元素,例如。

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