2012-05-04 224 views
9

我一直在使用HTMLUnit。它很適合我的要求。但它似乎非常緩慢。 例如:我已經使用自動化的HtmlUnitHTMLUnit:執行速度超慢?

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

代碼:

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

它可以100%好。但它需要3分41秒

我想慢執行的原因是驗證頁面上的每個元素。

我的問題是如何減少HTMLUnit的執行時間?有什麼辦法可以禁用網頁上的驗證。

在此先感謝!

+0

可以粘貼代碼嗎? – UVM

+0

請找到更新的代碼。 –

+0

禁用JS支持將使它更快waaaaayy – 2012-05-04 05:04:48

回答

6
  • 一定要使用最新的htmlunit版本(2.9)。我從之前的版本中獲得了性能提升。

我會在20s或40s內完成您的示例,具體取決於我設置的選項。由於我看不到webClient初始化,我想也許它可能是問題。

這是我的一個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

我建議還設置一個時間限制的javascript:

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

對於當前的HtmlUnit 2.13,設置選項是稍有不同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"); 
... 

在我自己的測試中,這是8次fas (請注意,這可能與網頁有關)

+3

禁用JS將始終導致更快的執行。但是,OP提到'禁用JavaScript不是一種選擇!:) –

+0

OP代表什麼?你的意思是說JS不應該被禁用? – fstang

+0

我的意思是,提問者在評論中添加了禁用JS不是一個選項 –