如何阻止HtmlUnit抛出网页JavaScript代码引发的错误?
解决HtmlUnit忽略JavaScript错误无效的问题
你设置setThrowExceptionOnScriptError(false)后仍看到JS错误输出,是因为这个配置仅阻止代码抛出异常终止流程,但默认的DefaultJavaScriptErrorListener依然会打印错误日志。以下是解决方法:
1. 替换默认JavaScript错误监听器
自定义一个空的错误监听器,完全屏蔽JS错误的日志输出:
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX)) { webClient.getOptions().setThrowExceptionOnScriptError(false); // 替换为空监听器,阻止错误日志打印 webClient.setJavaScriptErrorListener(new JavaScriptErrorListener() { @Override public void scriptException(HtmlPage page, ScriptException scriptException) {} @Override public void timeoutError(HtmlPage page, long allowedTime, long executionTime) {} @Override public void malformedScriptURL(HtmlPage page, String url, MalformedURLException malformedURLException) {} @Override public void loadScriptError(HtmlPage page, URL scriptUrl, Exception exception) {} }); // 后续登录代码... HtmlPage page = webClient.getPage("https://me.spc.com/systems"); HtmlForm loginForm = (HtmlForm) page.getElementById("logOnForm"); loginForm.getInputByName("j_username").type("my_username"); HtmlElement userNameSubmit = (HtmlElement) page.getElementById("logOnFormSubmit"); page = (HtmlPage) userNameSubmit.click(); HtmlForm passForm = (HtmlForm) page.getElementById("logOnForm"); passForm.getInputByName("j_password").type("password123"); HtmlElement passwordSubmit = (HtmlElement) page.getElementById("logOnFormSubmit"); page = (HtmlPage) passwordSubmit.click(); } catch (Exception e){ System.out.println("ERROR " + e); }
2. 补充其他错误忽略配置
如果还遇到其他类型的错误(如HTTP状态码、CSS错误),可以添加以下配置:
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); // 忽略HTTP状态码错误 webClient.setCssErrorHandler(new SilentCssErrorHandler()); // 忽略CSS错误
3. 调整日志框架级别
若上述方法仍有日志输出,可通过日志框架(如Logback、Log4j)调整HtmlUnit相关包的日志级别,比如将com.gargoylesoftware.htmlunit.javascript的日志级别设为WARN或更高,避免打印DEBUG/INFO级别的错误日志。
内容的提问来源于stack exchange,提问作者Aleksandar Grujic
相关产品推荐
相关产品推荐

