2010-05-17 57 views
4

我使用HtmlUnit进行分析工作,并且发现内存被WebClient拿着每个WebWindow的历史记录浪费了。我根本不使用历史记录,我想禁用它的管理,或者至少用1或2来限制它的大小。这可能吗?如何限制HtmlUnit的历史记录大小?

+0

确定Web客户端是抱着 “历史”?我不知道如何访问它,如果它在那里。也许你正在持有对WebPage的前一个实例的引用? – 2011-06-14 21:52:38

回答

-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 

这使得窗口可以从中断的地方取出。 它的丑陋,但如果你绝望,它可能会奏效。

+0

如果页面被javascript动态更改,该怎么办?在通过URL重新加载内容时,所有这些内容更改都将丢失。 – MrSmith42 2013-02-19 16:24:02

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