2013-06-06 22 views
6

我使用Java的HtmlUnit庫以編程方式操作網站。我無法找到我的問題的工作解決方案:如何確定所有的AJAX調用完成並返回一個完全加載的網頁?這是我曾嘗試:htmlunit:返回一個完全加載的頁面

首先,我創建WebClient實例,並調用我的方法processWebPage(String url, WebClient webClient)

WebClient webClient = null; 
    try { 
     webClient = new WebClient(BrowserVersion.FIREFOX_3_6); 
     webClient.setThrowExceptionOnScriptError(false); 
     webClient.setThrowExceptionOnFailingStatusCode(false); 
     webClient.setJavaScriptEnabled(true); 
     webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
    } catch (Exception e) { 
     System.out.println("Error"); 
    } 
    HtmlPage currentPage = processWebPage("http://www.example.com", webClient); 

這裏是我的方法,應該返回一個完全加載的網頁:

private static HtmlPage processWebPage(String url, WebClient webClient) { 
    HtmlPage page = null; 
    try { 
     page = webClient.getPage(url); 
    } catch (Exception e) { 
     System.out.println("Get page error"); 
    } 
    int z = webClient.waitForBackgroundJavaScript(1000); 
    int counter = 1000; 
    while (z > 0) { 
     counter += 1000; 
     z = webClient.waitForBackgroundJavaScript(counter); 
     if (z == 0) { 
      break; 
     } 
     synchronized (page) { 
      System.out.println("wait"); 
      try { 
       page.wait(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    System.out.println(page.asXml()); 
    return page; 
} 

如果沒有JavaScript需要加載,z變量應該返回0

有什麼想法?提前致謝。

編輯:我發現我的問題部分工作的解決方案,但在這種情況下,我應該知道如何響應頁面看起來。例如,如果一個完全加載的頁面包含文本「完整的」,我的解決辦法是:

HtmlPage page = null; 
    int PAGE_RETRY = 10; 
    try { 
     page = webClient.getPage("http://www.example.com"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    for (int i = 0; !page.asXml().contains("complete") && i < PAGE_RETRY; i++) { 
     try { 
      Thread.sleep(1000 * (i + 1)); 
      page = webClient.getPage("http://www.example.com"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

但是這將是,如果我不知道一個完全加載的頁面看起來像解決?

回答

6

試試這個:

HtmlPage page = null; 
try { 
    page = webClient.getPage(url); 
} catch (Exception e) { 
    System.out.println("Get page error"); 
} 
JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager(); 
while (manager.getJobCount() > 0) { 
    Thread.sleep(1000); 
} 
System.out.println(page.asXml()); 
return page; 
+0

有時需要永遠載入所有的腳本,但它的工作原理,謝謝! – justasd

+0

很高興幫助!標記爲正確答案!謝謝! – brnfd

+2

即使發帖我老了,我發現問題,當你有計時器在你的頁面上運行。因此,即使使用waitforBackground方法,您仍然等待參數中給出的時間結束。 –

相關問題