4

我正在使用 HtmlUnit 进行解析工作,我发现内存被 WebClient 浪费了,它保存了每个 WebWindow 的历史记录。我根本不使用历史记录,我想禁用它的管理或至少将其大小限制为 1 或 2。这可能吗?

4

2 回答 2

2

以下代码将设置ignoreNewPages_为 true:

try {
    final WebClient webClient = getWebClient();
    final List<WebWindow> webWindows = webClient.getWebWindows();
    History window = webWindows.get(0).getHistory();
    Field f = window.getClass().getDeclaredField("ignoreNewPages_"); //NoSuchFieldException
    f.setAccessible(true);
    ((ThreadLocal<Boolean>) f.get(window)).set(true);
} catch (Exception e) {
    e.printStackTrace();
    throw new AssertionError("Can't disable history");
}

访问者:

private static WebTester getTester() {
    return JWebUnit.getTester();
}

private HtmlUnitTestingEngineImpl getHtmlUnitEngine() {
    return (HtmlUnitTestingEngineImpl) getTester().getTestingEngine();
}

private WebClient getWebClient() {
    return getHtmlUnitEngine().getWebClient();
}
于 2011-06-30T09:58:58.243 回答
-1

HtmlUnit 中没有选项可以禁用我知道的历史记录。History 类有一个 getHistory() 方法,但没有 setHistory() 或 disableHistory()。我所做的,当然不是理想的,是释放网页并重新实例化它。只要你不释放你的 CookieManager,你在 cookie 方面应该没问题。基本上,一旦我一直通过并登录,我会在将当前页面存储到临时字符串后取消我的窗口,然后我将它重新实例化到我离开的地方。我在给定的点这样做是为了清除历史。

String tempPage = currentHtmlPage.getUrl().toString(); //HtmlPage class

window = null;

window = new WebWindow();

currentHtmlPage = new WebWindow.getWebClient().getPage(tempPage); //HtmlPage class

这允许窗口从停止的地方开始。它丑陋,但如果你绝望,它可能会奏效。

于 2011-06-29T18:15:18.257 回答