2013-06-06 13 views
6

Web sitelerini programatik olarak yönetmek için Java için HtmlUnit kitaplığı kullanıyorum. Sorunuma çalışma çözümünü bulamıyorum: Tüm AJAX çağrılarının tamamlandığını ve tamamen yüklenmiş bir web sayfasının nasıl döndürüleceğini nasıl belirleyebilirim? İşte ben denedim ne:htmlunit: tamamen yüklenmiş bir sayfayı geri yükle

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

:

Öncelikle WebClient örneği oluşturun ve benim yöntemine arama yapmak 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); 

Ve burada tamamen yüklü web sayfası dönmelidir benim yöntemidir Yüklenecek JavaScript kalmadıysa, değişken 0 döndürmelidir.

Herhangi bir düşünce? Şimdiden teşekkürler.

DÜZENLEME: Sorunum için kısmen çalışan bir çözüm buldum, ancak bu durumda yanıt sayfasının nasıl göründüğünü bilmeliyim.

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

    } 

Ama benim tamamen dolu sayfa nasıl göründüğünü bilmiyorsanız çözüm olacaktır: Tamamen dolu sayfa "tam" metnini içeriyorsa, örneğin, benim çözüm olurdu?

cevap

6

bu deneyin: Bazen tüm komut dosyalarını yüklemek için sonsuza kadar sürer

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

ama işe yarar, teşekkür ederim! – justasd

+0

Yardım etmekten memnunum! Doğru cevap olarak işaretle Teşekkürler! – brnfd

+2

Sadece bir açıklama bile, yazımın eski olmasına rağmen, sayfanızda çalışan zamanlayıcılarınız olduğunda problemler buluyorum. Yani, waitforBackground yöntemiyle bile, parametrede verilen sürenin sonuna kadar beklersiniz. –