2010-05-17 3 views
4

구문 분석 작업에 HtmlUnit을 사용하고 있으며 각 WebWindow의 기록을 보유하고있는 WebClient를 사용하여 메모리가 낭비되는 것을 발견했습니다. 나는 역사를 전혀 사용하지 않고 관리를 사용하지 않거나 적어도 크기를 1 또는 2로 제한하고 싶습니다. 가능합니까?HtmlUnit의 기록 크기를 제한하는 방법은 무엇입니까?

+0

당신이 확실 Webclient에가 "역사"를 들고있다? 그것이 있다면, 어떻게 접근해야할지 모르겠다. 웹 페이지의 이전 인스턴스에 대한 참조를 보유하고 있습니까? –

답변

-1

내가 알고있는 기록을 사용하지 않도록 설정할 수있는 옵션이 HtmlUnit에 없습니다. History 클래스에는 getHistory() 메서드가 있지만 setHistory() 또는 disableHistory()는 없습니다. 내가 한 것은 분명하고 이상적이지는 않지만 웹 페이지를 공개하고 다시 인스턴스화하는 것입니다. CookieManager를 해제하지 않으면 쿠키 앞면에서 확인해야합니다. 기본적으로 일단 모든 방법을 통해 로그인하면 현재 페이지를 임시 문자열에 저장 한 후 내 창을 무효화 한 다음 중단 한 위치로 다시 인스턴스화합니다. 나는 주어진 시점에 역사를 없애기 위해 이것을한다.

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

window = null; 

window = new WebWindow(); 

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

이렇게하면 창을 중단 한 부분부터 다시 시작할 수 있습니다. 추한하지만 절망적 인 경우 작동 할 수 있습니다.

+0

자바 스크립트로 페이지를 동적으로 변경하면 어떻게 될까요? 모든 콘텐츠 변경은 URL로 다시로드하는 동안 손실됩니다. – MrSmith42

2

다음 코드는 true로 ignoreNewPages_을 설정합니다 :

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(); 
} 
관련 문제