64

你知道如何关闭 HtmlUnit 中的警告、注释、错误吗?

4

17 回答 17

105

把它放在代码开头的某个地方;它会闭上它肮脏的嘴:

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);
于 2011-08-26T06:33:53.540 回答
53

Arsen Zahray 的答案中的代码有助于删除 HtmlUnit 生成的几乎所有日志。

但是一次编辑有助于将它们全部删除。采用:

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

代替:

java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
于 2012-07-26T15:12:33.273 回答
40

要从最新版本的 HtmlUnit 中删除所有输出,您只需在静态块或主类中添加这些行:

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

不需要像其他一些答案状态那样覆盖任何方法。

于 2013-09-01T22:29:45.823 回答
13

尝试以下代码将日志记录级别关闭:

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
于 2012-10-22T10:53:03.167 回答
12

在这里,您可以获得有关如何操作 HtmlUnit 日志记录的信息。

这是我添加到我log4j.properties的以禁用来自 HtmlUnit 组件的详细调试消息:

# 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
于 2012-10-28T17:15:50.173 回答
6

我正在使用下面的代码,它运行良好:

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);
于 2015-02-12T18:53:20.667 回答
3

关闭记录器。但这不是一个好的解决方案,因为您可能希望在日志中出现一些不常见的问题。

我知道 HtmlUnit 会产生很多不重要的异常、警告等。您可以使用以下方法抑制其中的一些:

client.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.getOptions().setThrowExceptionOnScriptError(false);
client.getOptions().setPrintContentOnFailingStatusCode(false);
于 2013-11-03T13:32:31.653 回答
3

只需将此字符串添加到您的log4.properties

log4j.logger.com.gargoylesoftware.htmlunit=fatal
于 2014-06-21T21:50:16.617 回答
2

看看文档

测试套件使用了一个示例 log4 文件,您可以在此处找到它,您可以根据需要禁用所有内容。

于 2010-08-31T02:04:17.620 回答
2

这对我有用:

@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");
于 2012-11-06T11:28:03.683 回答
2

现在在 HtmlUnit 2.9 中,WebClient.setCssErrorHandler(new SilentCssErrorHandler())可以方便地忽略警告和错误。例如:

@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;
}
于 2015-12-22T03:57:41.867 回答
1

尝试将此添加到您的代码中:

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

基本上,这会使记录器记录到NoOpLog,它不会将日志信息写入任何地方。

于 2013-05-13T05:12:37.227 回答
1

我必须对上面的每个人做一些不同的事情。我目前已将 htmlunit 设置为 Spring 项目,并删除了添加logback.xml到我的资源目录所需的日志。将以下内容添加logback.xml到您的main/java/resources目录中 - 这将仅输出INFO级别日志语句,以下不输出(何时使用不同的日志级别

<?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>
于 2020-07-14T23:07:44.260 回答
0

对我来说效果很好的一个选项是将 HtmlUnit 记录器更改为记录到不同的文件,这样我就有这些错误,以防我需要在一段时间内引用它,而且它也不会弄乱我的主日志。以下是log4j我所做的更改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
于 2016-12-14T22:40:58.833 回答
0

如果您不需要 JavaScript 支持,这是禁用它的最简单方法:

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) {
    }
});

您还可以禁用异常并记录失败的状态代码、JavaScript、CSS 错误和 HTML 解析错误。

如果您需要 JavaScript 支持,您可以对 JavaScript 错误使用自定义实现:

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) {
    }
});

如果您不需要,也可以禁用它:

client.getOptions().setCssEnabled(false);

因此无需配置任何其他 Logger。

于 2019-04-12T22:22:14.270 回答
0

我正在使用spring-boot,只解决了这个问题:

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;
    }
}

然后使用 @Autowired 或在类构造函数中调用 bean。没有这条线:

webClient.getOptions().setThrowExceptionOnScriptError(false);

它下面的两行会抛出一个奇怪的错误。这条线有魔力。

于 2022-01-04T02:56:58.360 回答
-1

试试这个,它对我有用。

WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
于 2021-01-06T01:12:56.460 回答