5

为什么 HtmlUnit 比 GUI 浏览器慢很多?例如,HtmlUnit在 14 秒内(关闭 CSS 支持时)加载此页面http://oltexpress.airkiosk.com/cgi-bin/airkiosk/I7/181002i?O2=2而 FF 在 5 秒内完成(在清除缓存后,具有 CSS 支持)。我知道,现代浏览器在处理糟糕的 JS 代码时并没有那么严格,而 HtmlUnit 是,但这里的时间差异仍然是无法容忍的。

任何想法如何加快使用 HtmlUnit 的工作?有人玩过 HtmlUnit 缓存吗?

4

3 回答 3

5

要回答您关于为什么速度慢的问题:

这纯粹是因为 HTMLUnit 有很多反对它的东西:

  • 它以一种编译语言运行,没有像 FireFox 等浏览器的许多本机优化。
  • 它需要格式良好的 XML,而不是 HTML(非严格),这意味着它必须将 HTML 转换为 XML。
  • 然后它必须通过解析器运行 JavaScript,修复代码中的任何问题,然后在 Java 本身内部进行处理。
  • 同样正如@Arya 指出的那样,它一次请求一个东西,所以很多 javascript 文件会导致速度变慢,许多图像会导致速度变慢。

要回答有关如何加快速度的问题:

作为一般规则,我禁用(除非需要它们):

  • JavaScript
  • 图片
  • CSS
  • 小程序。

我还获得了源代码并删除了 ActiveX 支持并重新编译。如果您想阻止代码加载那些额外的页面,您可以使用下面的代码给出响应,而无需从网络下载。

WebClient browser;
browser.setWebConnection(new WebConnectionWrapper(browser) {
    @Override
    public WebResponse getResponse(final WebRequest request) throws IOException {
        if (/* Perform a test here */) {
            return super.getResponse(request); // Pass the responsibility up.
        } else {
            /* Give the program a response, but leave it empty. */
            return new StringWebResponse("", request.getUrl());
        }
    }
});

我注意到的其他事情:

  • HTMLUnit 不是线程安全的,这意味着您可能应该为每个线程创建一个新的。
  • HTMLUnit 确实缓存了页面
于 2012-12-11T13:10:32.917 回答
1

HTMLUnit 需要更长的时间的原因是每个请求都是一个一个完成的。这就是检索页面需要这么长时间的主要原因。JS 和 css 不应该有很大的不同 IMO

于 2012-06-20T21:07:01.670 回答
0

WebClient 对象维护静态资源的缓存。如果关闭 WebClient 对象并创建另一个对象,则必须重建缓存。

为避免这种情况,您可以跨多个会话重用 WebClient 对象,甚至可以维护 WebClient 对象池。还要看看你是否可以维护一个Cache对象。您可能希望在将 WebClient 的 cookie 返回到池之前清除它。

正如@Lee 指出的那样, WebConnectionWrapper为您提供了拦截的机会。我使用它来避免重定向、禁用选定资源的 JS 执行或在我不关心该资源时返回模拟数据。

于 2015-05-07T16:24:21.800 回答