2010-05-17 38 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(); 
}