2013-06-06 5 views
6

Sto utilizzando la libreria HtmlUnit per Java per manipolare i siti Web a livello di codice. Non riesco a trovare la soluzione funzionante al mio problema: come determinare che tutte le chiamate AJAX sono finite e restituire una pagina web completamente carica? Ecco quello che ho provato:htmlunit: restituisce una pagina completamente caricata

In primo luogo creo WebClient istanza e fare la chiamata al mio metodo 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); 

E qui è il mio metodo, che dovrebbe restituire una pagina web caricata completamente:

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

La variabile z dovrebbe restituire 0 se non ci sono JavaScript da caricare.

Qualche idea? Grazie in anticipo.

EDIT: Ho trovato una soluzione parzialmente funzionante al mio problema, ma in questo caso dovrei sapere come appare la pagina di risposta. Ad esempio, se una pagina completamente caricato contiene il testo "completo", la mia soluzione sarebbe:

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

    } 

Ma quale sarebbe la soluzione se non so come una pagina completamente caricata assomiglia?

risposta

6

Prova questo:

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

A volte ci vuole sempre al carico tutti gli script ma funziona, grazie! – justasd

+0

Felice di aiutare! Segna come risposta corretta! Grazie! – brnfd

+2

Solo un'osservazione anche se il post è vecchio, scopro dei problemi quando hai timer in esecuzione sulla tua pagina. Quindi anche con il metodo waitforBackground stai aspettando fino alla fine del tempo indicato nel parametro. –