2012-05-04 28 views
9

He estado usando HTMLUnit. Se adapta bien a mis necesidades. Pero parece ser extremadamente lento. por ejemplo: Me han automatizado el siguiente escenario usando HtmlUnitHTMLUnit: ejecución súper lenta?

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

Código:

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

Funciona bien el 100%. Pero lleva 3 minutos, 41 segundos

Supongo que el motivo de la ejecución lenta es la validación de todos y cada uno de los elementos de la página.

Mi pregunta es cómo reducir el tiempo de ejecución de HTMLUnit? ¿Hay alguna forma de desactivar las validaciones en las páginas web?

¡Gracias de antemano!

+0

¿Puede pegar el código? – UVM

+0

Encuentre el código actualizado. –

+0

La desactivación de la compatibilidad con JS hará que sea más rápido –

Respuesta

6
  • Asegúrese de utilizar la última versión de htmlunit (2.9). Tuve un aumento de rendimiento de la versión anterior.

Tengo su ejemplo hecho dentro de 20s, o 40s dependiendo de las opciones que configuro. Como no puedo ver la inicialización de WebClient, supongo que tal vez sea el problema.

Aquí es mi inicialización para un tratamiento de 20:

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

recomiendo también para establecer un límite de tiempo para la javascript:

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

Para el HtmlUnit actual 2.13, configuración de las opciones es ligeramente diferente de lo que ha proporcionado maxmax:

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"); 
... 

En mi propia prueba, esto es 8 veces fas ter que las opciones predeterminadas. (Tenga en cuenta que esto podría depender de la página web)

+3

La desactivación de JS siempre dará como resultado una ejecución más rápida. Sin embargo, el OP mencionó '¡Desactivar JavaScript no es una opción!' :) –

+0

¿Qué significa OP? ¿Quieres decir que JS no debería estar deshabilitado? – fstang

+0

Quiero decir, el asker agregó en un comentario a la pregunta que desactivar JS no es una opción –