HtmlUnit使用中JavaScript腳本錯誤防止其打印日誌解決

HtmlUnit提供了優秀的JavaScript解決方案,經過該框架模擬瀏覽器,能夠執行相應的JavaScript方法並獲取執行後的結果。javascript

然而,遇到的問題也蠻多,不過總有解決方案。html

好比說http://xxx.xx.com中有一段JavaScript有錯誤,因爲HtmlUnit太盡責了,給了咱們兩種選擇:1. 拋出異常(你們能夠看看源碼,跑異常其實就是返回的ScriptResult對象爲null);2. 忽略異常,可是打印一大堆日誌.....我不知道大家受不受得了,反正我受不了,動手解決唄java

作點操做:web

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/700166ide

相關文章
相關標籤/搜索