2013-06-06 11 views
6

Używam biblioteki HtmlUnit do Java, aby programowo manipulować witrynami. Nie mogę znaleźć działającego rozwiązania mojego problemu: Jak ustalić, że wszystkie wywołania AJAX zostały zakończone i zwrócić całkowicie załadowaną stronę internetową? Oto co próbowałem:htmlunit: zwraca całkowicie załadowaną stronę

pierwsze tworzę WebClient instancji i dokonać połączenia do mojego sposobu 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); 

I tu jest moja metoda, która powinna wrócić całkowicie załadowany na stronę internetową:

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

Ta zmienna z powinna zwrócić 0, jeśli nie ma już JavaScript do załadowania.

Jakieś myśli? Z góry dziękuję.

EDYCJA: Znalazłem częściowo działające rozwiązanie mojego problemu, ale w tym przypadku powinienem wiedzieć, jak wygląda strona odpowiedzi. Na przykład, jeśli całkowicie załadowana strona zawiera tekst „kompletny”, moje rozwiązanie byłoby:

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

    } 

Ale co byłoby rozwiązaniem, jeśli nie wiem, w jaki sposób całkowicie załadowana strona wygląda?

Odpowiedz

6

Spróbuj tego:

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

Czasami trwa wiecznie załadować wszystkie skrypty, ale to działa, dziękuję! – justasd

+0

Cieszę się, że mogę Ci pomóc! Oznacz jako poprawną odpowiedź! Dzięki! – brnfd

+2

Tylko uwaga, nawet jeśli post i stary, odkrywam problemy, gdy masz liczniki uruchomione na twojej stronie. Więc nawet z metodą waitforBackground czeka się do końca czasu podanego w parametrze. –

Powiązane problemy