【问题标题】:How to limit HtmlUnit's history size?如何限制 HtmlUnit 的历史大小?
【发布时间】:2010-05-17 13:33:57
【问题描述】:

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

【问题讨论】:

  • 你确定 Webclient 持有“历史”吗?我不知道如何访问它,如果它在那里。也许您持有对 WebPage 先前实例的引用?

标签: java history htmlunit


【解决方案1】:

以下代码会将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();
}

【讨论】:

    【解决方案2】:

    据我所知,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
    

    这允许窗口从中断处继续。 它很丑,但如果你很绝望,它可能会起作用。

    【讨论】:

    • 如果页面被javascript动态改变了怎么办。通过 URL 重新加载内容时,所有此类内容更改都将丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多