HtmlUnit使用中JavaScript脚本错误防止其打印日志解决

本文介绍如何使用HtmlUnit模拟浏览器执行JavaScript,并提供了解决JavaScript错误导致的问题的方法。通过设置WebClient选项和自定义JavaScript引擎,可以有效避免JavaScript错误引发的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://my.oschina.net/u/1991646/blog/700166

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值