Turning HtmlUnit Warnings off

丶灬走出姿态 提交于 2019-11-26 14:21:24
Arsen Zahray

Put this somewhere around the start of your code; it will shut its dirty mouth:

LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); 
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);

webClient = new WebClient(bv);
webClient.setCssEnabled(false);

webClient.setIncorrectnessListener(new IncorrectnessListener() {

    @Override
    public void notify(String arg0, Object arg1) {
        // TODO Auto-generated method stub

    }
});
webClient.setCssErrorHandler(new ErrorHandler() {

    @Override
    public void warning(CSSParseException exception) throws CSSException {
        // TODO Auto-generated method stub

    }

    @Override
    public void fatalError(CSSParseException exception) throws CSSException {
        // TODO Auto-generated method stub

    }

    @Override
    public void error(CSSParseException exception) throws CSSException {
        // TODO Auto-generated method stub

    }
});
webClient.setJavaScriptErrorListener(new JavaScriptErrorListener() {

    @Override
    public void timeoutError(HtmlPage arg0, long arg1, long arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public void scriptException(HtmlPage arg0, ScriptException arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void malformedScriptURL(HtmlPage arg0, String arg1, MalformedURLException arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public void loadScriptError(HtmlPage arg0, URL arg1, Exception arg2) {
        // TODO Auto-generated method stub

    }
});
webClient.setHTMLParserListener(new HTMLParserListener() {

    @Override
    public void warning(String arg0, URL arg1, int arg2, int arg3, String arg4) {
        // TODO Auto-generated method stub

    }

    @Override
    public void error(String arg0, URL arg1, int arg2, int arg3, String arg4) {
        // TODO Auto-generated method stub

    }
});

webClient.setThrowExceptionOnFailingStatusCode(false);
webClient.setThrowExceptionOnScriptError(false);
sha

The code in Arsen Zahray's answer helped in removing almost all the logs generated by HtmlUnit.

But one edit helps to remove them all. Use:

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 

instead of:

java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);

To remove all output from the latest version of HtmlUnit you just have to add these lines in a static block or in your main class:

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

It is NOT needed to override any method as some other answers state.

Ivanov Artemk

Here you can get info on how to manipulate logging of HtmlUnit.

This is what I added to my log4j.properties in order to disable verbose debugging messages from HtmlUnit components:

# Set specific logger levels.
log4j.logger.org.mortbay.log=fatal
log4j.logger.org.apache.http=fatal
log4j.logger.org.apache.http.headers=fatal
log4j.logger.org.apache.http.wire=fatal
# For HttpClient 3, which is used by FirefoxDriver
log4j.logger.httpclient.wire=fatal
log4j.logger.org.apache.commons=fatal
log4j.logger.com.gargoylesoftware.htmlunit=fatal
log4j.logger.com.gargoylesoftware.htmlunit.WebTestCase=fatal
# Change this to TRACE when enabling the debugger.
log4j.logger.com.gargoylesoftware.htmlunit.javascript.DebugFrameImpl=fatal
some_other_guy

Try the following code to turn the logging level down to off:

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
Adnan Ghaffar

I am using the code below and it works perfectly:

LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);
mike

Just add this string to your log4.properties:

log4j.logger.com.gargoylesoftware.htmlunit=fatal
coding_idiot

Turn the loggers off. But that is not a good solution, since you might want to have some uncommon issues in the logs.

I know HtmlUnit produces a lot of unimportant exceptions, warnings, etc. You can suppress of few of those using:

client.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.getOptions().setThrowExceptionOnScriptError(false);
client.getOptions().setPrintContentOnFailingStatusCode(false);

Have a look at the docs.

There is a sample log4 file used by the test suite, you can find it here, you can disable everything if you wish.

Alex Punnen

This worked for me:

@Test
    public void homePage() throws Exception {
        final WebClient webClient = new WebClient();   
 webClient.setThrowExceptionOnScriptError(false);
    final HtmlPage page = webClient.getPage("http://localhost:8080/web/guest/home");
Howard

Now in HtmlUnit 2.9, WebClient.setCssErrorHandler(new SilentCssErrorHandler()) can conveniently ignore the warnings and errors. For example:

@Override
protected WebClient modifyWebClient(WebClient client) {
    // currently does nothing, but may be changed in future versions
    WebClient modifiedClient = super.modifyWebClient(client);

    modifiedClient.getOptions().setThrowExceptionOnScriptError(false);
    modifiedClient.setCssErrorHandler(new SilentCssErrorHandler());

    return modifiedClient;
}
Salman

Try adding this to your code:

LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

Basically, this makes the logger log to NoOpLog, which doesn't write the log information anywhere.

vanval

One option which worked well for me is to change the HtmlUnit logger to log to a different file just so that I have those errors in case I need to refer it some time and it also doesn't clutter up my main logs. Below is the log4j change I made to log4j.properties:

log4j.logger.com.gargoylesoftware.htmlunit=ERROR, HTMLUNIT
log4j.additivity.com.gargoylesoftware.htmlunit=false
log4j.appender.HTMLUNIT = org.apache.log4j.RollingFileAppender
log4j.appender.HTMLUNIT.layout=org.apache.log4j.PatternLayout
log4j.appender.HTMLUNIT.layout.ConversionPattern=%m%n
log4j.appender.HTMLUNIT.File=logs/HtmlUnitLog4j.log
log4j.appender.HTMLUNIT.MaxFileSize=5MB
log4j.appender.HTMLUNIT.MaxBackupIndex=5

If you don't need JavaScript support, it is the easiest way to disable it:

WebClient client = new WebClient(BrowserVersion.BEST_SUPPORTED);
client.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.getOptions().setPrintContentOnFailingStatusCode(false);
client.getOptions().setThrowExceptionOnScriptError(false);
client.getOptions().setJavaScriptEnabled(false);
client.setCssErrorHandler(new SilentCssErrorHandler());
client.setHTMLParserListener(new HTMLParserListener() {
    @Override
    public void error(String message, URL url, String html, int line, int column, String key) {
    }

    @Override
    public void warning(String message, URL url, String html, int line, int column, String key) {
    }
});

You also disable exceptions and log on failing status codes, JavaScript, CSS errors and HTML parse errors.

If you need JavaScript support you can use a custom implementation for JavaScript errors:

client.setJavaScriptErrorListener(new JavaScriptErrorListener() {
    @Override
    public void timeoutError(HtmlPage arg0, long arg1, long arg2) {
    }

    @Override
    public void scriptException(HtmlPage arg0, ScriptException arg1) {
    }

    @Override
    public void malformedScriptURL(HtmlPage arg0, String arg1, MalformedURLException arg2) {
    }

    @Override
    public void loadScriptError(HtmlPage arg0, URL arg1, Exception arg2) {
    }
});

If you don't need you also can just disable it:

client.getOptions().setCssEnabled(false);

So there is no need to configure any other Logger.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!