2013-06-06 41 views
6

Tôi đang sử dụng thư viện HtmlUnit để Java thao tác các trang web theo lập trình. Tôi không thể tìm thấy giải pháp làm việc cho vấn đề của tôi: Làm thế nào để xác định rằng tất cả các cuộc gọi AJAX được hoàn thành và trả về một trang web hoàn toàn tải? Dưới đây là những gì tôi đã cố gắng:htmlunit: trả về một trang hoàn toàn được tải

Thứ nhất tôi có thể tạo WebClient dụ và thực hiện cuộc gọi đến phương pháp của tôi 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); 

Và đây là phương pháp của tôi mà phải trả lại một trang web hoàn toàn tải:

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; 
} 

Biến số z này sẽ trả lại 0 nếu không còn JavaScript để tải.

Mọi suy nghĩ? Cảm ơn trước.

EDIT: Tôi tìm thấy giải pháp làm việc một phần cho vấn đề của mình, nhưng trong trường hợp này, tôi nên biết trang giao diện trông như thế nào. Ví dụ, nếu một trang hoàn toàn tải chứa văn bản "hoàn thành", giải pháp của tôi sẽ là:

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

    } 

Nhưng điều gì sẽ là giải pháp nếu tôi không biết làm thế nào một trang hoàn toàn tải trông như thế nào?

Trả lời

6

Hãy thử điều này:

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

Đôi khi nó sẽ mãi mãi để tải tất cả các kịch bản nhưng nó hoạt động, cảm ơn bạn! – justasd

+0

Rất vui được giúp đỡ! Đánh dấu là câu trả lời chính xác! Cảm ơn! – brnfd

+2

Chỉ là một nhận xét ngay cả khi bài đăng cũ, tôi phát hiện ra sự cố khi bạn có bộ hẹn giờ chạy trên trang của mình. Vì vậy, ngay cả với waitforBackground phương pháp bạn đang waitin đến cuối thời gian nhất định trong tham số. –

Các vấn đề liên quan