2012-05-04 18 views
9

Używam HTMLUnit. Odpowiednio odpowiada moim wymaganiom. Ale wydaje się być bardzo powolny. na przykład: Mam zautomatyzowane następujący scenariusz używając HtmlUnitHTMLUnit: bardzo powolne wykonywanie?

Goto Google page 
Enter some text 
Click on the search button 
Get the title of the results page 
Click on the first result. 

Kod:

long t1=System.currentTimeMillis(); 
Logger logger=Logger.getLogger(""); 
logger.setLevel(Level.OFF); 
WebClient webClient=createWebClient(); 
WebRequest webReq=new WebRequest(new URL("http://google.lk")); 

HtmlPage googleMainPage=webClient.getPage(webReq); 
HtmlTextInput searchTextField=(HtmlTextInput) googleMainPage.getByXPath("//input[@name='q']").get(0); 
HtmlButton searchButton=(HtmlButton) googleMainPage.getByXPath("//button[@name='btnK']").get(0); 

searchTextField.type("Sri Lanka"); 
System.out.println("Text typed!"); 
HtmlPage googleResultsPage= searchButton.click(); 
System.out.println("Search button clicked!"); 

System.out.println("Title : " + googleResultsPage.getTitleText()); 

HtmlAnchor firstResultLink=(HtmlAnchor) googleResultsPage.getByXPath("//a[@class='l']").get(0); 
HtmlPage firstResultPage=firstResultLink.click(); 
System.out.println("First result clicked!"); 

System.out.println("Title : " + firstResultPage.getTitleText()); 
//System.out.println(firstResultPage.asText()); 
long t2=System.currentTimeMillis(); 
long diff=t2-t1; 
System.out.println("Time elapsed : " + milliSecondsToHrsMinutesAndSeconds(diff)); 

webClient.closeAllWindows(); 

Działa w 100% dobrze. Ale zajmuje to 3 minuty, 41 sekund

Sądzę, że przyczyną powolnego wykonywania jest walidacja każdego elementu na stronie.

Moje pytanie brzmi: jak zredukować czas wykonywania HTMLUnit? czy istnieje sposób wyłączenia sprawdzania poprawności na stronach internetowych.

Z góry dziękuję!

+0

czy możesz wkleić kod? – UVM

+0

Proszę znaleźć zaktualizowany kod. –

+0

Wyłączenie obsługi JS sprawi, że będzie ona szybsza –

Odpowiedz

6
  • Należy używać najnowszej wersji htmlunit (2.9). Miałem wzrost wydajności z poprzedniej wersji.

Otrzymuję twój przykład zrobiony w ciągu 20s, lub 40s zależnych opcji, które ustawiłem. Ponieważ nie widzę inicjalizacji webClient, chyba może to być problem.

Oto mój inicjalizacji dla leczenia 20s:

WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6); 
    client.setTimeout(60000); 
    client.setRedirectEnabled(true); 
    client.setJavaScriptEnabled(true); 
    client.setThrowExceptionOnFailingStatusCode(false); 
    client.setThrowExceptionOnScriptError(false); 
    client.setCssEnabled(false); 
    client.setUseInsecureSSL(true); 
1

Polecam również wyznaczyć termin do javascript:

client.setJavaScriptTimeout(30000); //e.g. 30s 
10

dla bieżącego HtmlUnit 2.13, opcje ustawień różni się nieco od co maxmax dostarczył:

final WebClient webClient = new WebClient(BrowserVersion.CHROME); 
webClient.getOptions().setCssEnabled(false);//if you don't need css 
webClient.getOptions().setJavaScriptEnabled(false);//if you don't need js 
HtmlPage page = webClient.getPage("http://XXX.xxx.xx"); 
... 

W moim własnym teście, to jest 8 razy fas ter niż domyślne opcje. (Należy pamiętać, że może to być zależne od strony www)

+3

Wyłączenie JS zawsze spowoduje szybsze wykonanie. Jednak PO wspomniał, że "Wyłączenie JavaScriptu nie jest opcją!" :) –

+0

Co oznacza OP? Czy masz na myśli, że JS nie powinien być wyłączony? – fstang

+0

Mam na myśli, pytający dodał w komentarzu do pytania, że ​​wyłączenie JS nie jest opcją –

Powiązane problemy