4

解析ジョブに HtmlUnit を使用していますが、各 WebWindow の履歴を保持する WebClient でメモリが浪費されることがわかりました。履歴をまったく使用しないので、その管理を無効にするか、少なくともサイズを 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() はありません。私が行ったことは、確かに理想的ではありませんが、Web ページを解放して再インスタンス化することです。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 に答える