HtmlUnit使用中JavaScript脚本错误防止其打印日志解决
2016-06-23 00:00
966 查看
摘要: HtmlUnit JavaScript 错误日志 Java 爬虫
HtmlUnit提供了优秀的JavaScript解决方案,通过该框架模拟浏览器,可以执行相应的JavaScript方法并获取执行后的结果。
然而,遇到的问题也蛮多,不过总有解决方案。
比如说http://xxx.xx.com中有一段JavaScript有错误,由于HtmlUnit太尽责了,给了我们两种选择:1. 抛出异常(大家可以看看源码,跑异常其实就是返回的ScriptResult对象为null);2. 忽略异常,但是打印一大堆日志.....我不知道你们受不受得了,反正我受不了,动手解决呗
做点操作:
其中webClient.setJavaScriptEngine(new MyJavaScriptEngine(webClient));//自定义JavaScript引擎,有js错误不打印 这个是重头戏,自定义一个MyJavaScriptEngine.java类,代码如下:
最后一行注掉就问题解决了,简单粗暴。还是那句话,欢迎拍砖~
转载请指明出处:http://my.oschina.net/u/1991646/blog/700166
HtmlUnit提供了优秀的JavaScript解决方案,通过该框架模拟浏览器,可以执行相应的JavaScript方法并获取执行后的结果。
然而,遇到的问题也蛮多,不过总有解决方案。
比如说http://xxx.xx.com中有一段JavaScript有错误,由于HtmlUnit太尽责了,给了我们两种选择:1. 抛出异常(大家可以看看源码,跑异常其实就是返回的ScriptResult对象为null);2. 忽略异常,但是打印一大堆日志.....我不知道你们受不受得了,反正我受不了,动手解决呗
做点操作:
final WebClient webClient = new WebClient(BrowserVersion.getDefault()); webClient.getOptions().setCssEnabled(false);//忽略Css webClient.getOptions().setJavaScriptEnabled(true);//忽略JavaScript webClient.getOptions().setThrowExceptionOnScriptError(false);//如果JavaScript有错误是否抛出,这里的抛出指的是下面获取到的ScriptResult对象为空 webClient.setJavaScriptEngine(new MyJavaScriptEngine(webClient));//自定义JavaScript引擎,有js错误不打印
其中webClient.setJavaScriptEngine(new MyJavaScriptEngine(webClient));//自定义JavaScript引擎,有js错误不打印 这个是重头戏,自定义一个MyJavaScriptEngine.java类,代码如下:
import com.gargoylesoftware.htmlunit.InteractivePage; import com.gargoylesoftware.htmlunit.ScriptException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebWindow; import com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine; import com.gargoylesoftware.htmlunit.javascript.JavaScriptErrorListener; import com.gargoylesoftware.htmlunit.javascript.host.Window; /** * 自定义JavaScript解析器(目的是为了不打印js存在的错误到日志) * @author 小风 * @datetime 2016年6月23日 下午10:19:40 */ public class MyJavaScriptEngine extends JavaScriptEngine{ public MyJavaScriptEngine(WebClient webClient) { super(webClient); } @Override protected void handleJavaScriptException(final ScriptException scriptException, final boolean triggerOnError) { // Trigger window.onerror, if it has been set. final InteractivePage page = scriptException.getPage(); if (triggerOnError && page != null) { final WebWindow window = page.getEnclosingWindow(); if (window != null) { final Window w = (Window) window.getScriptableObject(); if (w != null) { try { w.triggerOnError(scriptException); } catch (final Exception e) { handleJavaScriptException(new ScriptException(page, e, null), false); } } } } final JavaScriptErrorListener javaScriptErrorListener = getWebClient().getJavaScriptErrorListener(); if (javaScriptErrorListener != null) { javaScriptErrorListener.scriptException(page, scriptException); } // Throw a Java exception if the user wants us to. if (getWebClient().getOptions().isThrowExceptionOnScriptError()) { throw scriptException; } // Log the error; ScriptException instances provide good debug info. // LOG.info("Caught script exception", scriptException); } }
最后一行注掉就问题解决了,简单粗暴。还是那句话,欢迎拍砖~
转载请指明出处:http://my.oschina.net/u/1991646/blog/700166
相关文章推荐
- anjularjs之directive
- form表单使用ajaxsubmit上传文件,并验证
- (数据类型和值概述)JavaScript权威指南笔记3
- BZOJ 1443 [JSOI2009]游戏Game | UVALive 5882 Racing Car Trail
- JSON 合并
- JavaScript声明全局变量三种方式的异同
- 禁止拖拽时选中文本的方法
- javascript Cookie
- VLC web 插件javascript常用接口及属性
- js中style,currentStyle和getComputedStyle的区别
- JavaScript函数(三)
- Javascript 排序数组或对象
- arcgis api for js共享干货系列之一自写算法实现地图量算工具
- JSP 三个指令七个动作九个对象
- js学习笔记]PDF.js专题
- JavaScript函数(二)
- JSON
- javaScript设计模式之模板方法模式
- 人民币大写在线转换工具
- JavaScript设计模式