66

Do you know how can I turn Warnings, Notes, Errors in HtmlUnit off?

oneat
  • 10,394
  • 16
  • 49
  • 68

17 Answers17

106

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);
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
Arsen Zahray
  • 23,085
  • 46
  • 122
  • 219
  • 9
    HtmlUnit provides [SilentCssErrorHandler](http://htmlunit.sourceforge.net/apidocs/com/gargoylesoftware/htmlunit/SilentCssErrorHandler.html) so you don't have to make an empty anonymous inner class for `setCssErrorHandler(ErrorHandler)`. – Austin B Oct 15 '13 at 01:58
  • 13
    I didn't have to use all of these. Just using java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); worked for me. – D.S Apr 02 '14 at 01:23
  • 4
    It's worth mentioning that on some versions you must call `getOptions()` on webClient first to set the throw exception options in this example, like this: `webClient.getOptions().setThrowExceptionOnScriptError(false);` – Shahar Aug 13 '15 at 10:48
  • 1
    even with this I still get "RHINO USAGE WARNING" anyway to prevent rhino warnings? – Arya Jun 12 '17 at 22:17
  • 2
    still receiving warnings: "Script is not JavaScript" from c.g.htmlunit.html.HtmlScript – Michal Jun 25 '17 at 08:43
  • Can you update the answer for the latest version – Niteesh May 22 '21 at 19:28
53

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);
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
sha
  • 539
  • 4
  • 4
  • 1
    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); – ossobuko Apr 06 '20 at 21:15
41

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.

Mosty Mostacho
  • 41,294
  • 14
  • 93
  • 121
14

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

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
some_other_guy
  • 3,328
  • 4
  • 36
  • 55
12

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
stefan
  • 4,906
  • 12
  • 47
  • 82
Ivanov Artemk
  • 129
  • 1
  • 2
  • Worked for me, and doesn't turn off logging completely which is useful for me since I want to view the fatal errors. – vanval Dec 14 '16 at 20:26
6

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);
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
Adnan Ghaffar
  • 1,315
  • 7
  • 26
  • 44
3

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);
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
coding_idiot
  • 13,208
  • 9
  • 61
  • 115
3

Just add this string to your log4.properties:

log4j.logger.com.gargoylesoftware.htmlunit=fatal
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
mike
  • 519
  • 4
  • 7
3

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;
}
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
Howard
  • 31
  • 1
2

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");
Cody Gray
  • 230,875
  • 49
  • 477
  • 553
Alex Punnen
  • 4,132
  • 2
  • 47
  • 63
2

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.

Ahmed Ashour
  • 4,462
  • 10
  • 33
  • 49
1

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.

Cody Gray
  • 230,875
  • 49
  • 477
  • 553
Salman
  • 41
  • 1
1

I must be doing something different to everyone above. I have htmlunit set up as a Spring project currently and removing the logs required adding a logback.xml to my resources dir. Add the following as logback.xml to your main/java/resources dir - this will only output INFO level log statements and nothing below (When to use the different log levels)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>-->
    <!--<logger name="org.springframework.web" level="INFO"/>-->

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] [%logger{20}] %-5level - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>gdaxDesktop.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %logger{20} %-5level - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <!--<appender-ref ref="FILE"/>-->
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>
Rob Evans
  • 2,628
  • 1
  • 6
  • 14
0

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
stefan
  • 4,906
  • 12
  • 47
  • 82
vanval
  • 977
  • 9
  • 18
0

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.

Samuel Philipp
  • 9,983
  • 12
  • 32
  • 52
0

I am using spring-boot, only solved with this:

import com.gargoylesoftware.htmlunit.SilentCssErrorHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.javascript.SilentJavaScriptErrorListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HtmlUnitConfiguration {

    @Bean
    public WebClient webClient() {
        WebClient webClient = new WebClient();
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.setJavaScriptErrorListener(new SilentJavaScriptErrorListener());
        webClient.setCssErrorHandler(new SilentCssErrorHandler());

        return webClient;
    }
}

And then calling the bean with @Autowired or in class constructor. And without this line:

webClient.getOptions().setThrowExceptionOnScriptError(false);

The two lines under it will throw a bizarre error. This line has the magic.

Hinotori
  • 502
  • 6
  • 12
-1

Try this, it worked for me.

WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
Nital
  • 5,292
  • 20
  • 88
  • 174