2013-06-06 6 views
6

Ich verwende HtmlUnit-Bibliothek für Java, um Websites programmgesteuert zu bearbeiten. Ich kann die funktionierende Lösung für mein Problem nicht finden: Wie stelle ich fest, dass alle AJAX-Aufrufe beendet sind und eine vollständig geladene Webseite zurückgeben? Hier ist, was ich versucht habe:htmlunit: eine vollständig geladene Seite zurückgeben

Zunächst erstelle ich WebClient Instanz und machen Aufruf an meine Methode 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); 

Und hier ist meine Methode, die eine vollständig geladenen Webseite zurückkehren sollte:

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

Diese z Variable sollte 0 zurückgeben, wenn kein JavaScript mehr zum Laden vorhanden ist.

Irgendwelche Gedanken? Danke im Voraus.

EDIT: Ich habe eine teilweise funktionierende Lösung zu meinem Problem gefunden, aber in diesem Fall sollte ich wissen, wie die Antwortseite aussieht. Wenn beispielsweise eine vollständig geladene Seite enthält Text „complete“, wäre meine Lösung sein:

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

    } 

Aber was wäre die Lösung, wenn ich weiß nicht, wie eine vollständig geladene Seite aussieht?

Antwort

6

Try this:

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

Manchmal dauert es immer alle Skripte zu laden, aber es funktioniert, danke! – justasd

+0

Gut zu helfen! Als richtige Antwort markieren! Vielen Dank! – brnfd

+2

Nur eine Bemerkung, auch wenn der Beitrag alt ist, ich entdecke Probleme, wenn Sie Timer auf Ihrer Seite laufen haben. Also warten Sie mit der Methode waitforBackground bis zum Ende der im Parameter angegebenen Zeit. –

Verwandte Themen