2013-06-06 13 views
6

मैं प्रोग्राम के लिए वेबसाइटों में हेरफेर करने के लिए जावा के लिए HtmlUnit लाइब्रेरी का उपयोग कर रहा हूं। मुझे अपनी समस्या का समाधान समाधान नहीं मिल रहा है: यह निर्धारित करने के लिए कि सभी AJAX कॉल समाप्त हो गए हैं और पूरी तरह से लोड किए गए वेबपृष्ठ को वापस कर सकते हैं? यहाँ मैं क्या कोशिश की है है:htmlunit: एक पूरी तरह से लोड किया गया पृष्ठ

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

:

सबसे पहले मैं WebClient उदाहरण बना सकते हैं और मेरी विधि करने के लिए कॉल करने के 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); 

और यहाँ मेरा तरीका है जिसके एक पूरी तरह से लोड वेब पेज लौट जाना है z वैरिएबल को 0 वापस करना चाहिए यदि लोड करने के लिए कोई जावास्क्रिप्ट शेष नहीं है।

किसी भी विचार? अग्रिम में धन्यवाद।

संपादित करें: मुझे मेरी समस्या का आंशिक रूप से काम करने वाला समाधान मिला, लेकिन इस मामले में मुझे पता होना चाहिए कि प्रतिक्रिया पृष्ठ कैसा दिखता है। उदाहरण के लिए, अगर एक पूरी तरह से लोड पेज पाठ "पूर्ण" होता है, मेरी समाधान होगा:

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

    } 

लेकिन क्या समाधान है, तो मैं कैसे एक पूरी तरह से लोड पेज की तरह दिखता है पता नहीं है हो सकता है?

उत्तर

6

इस प्रयास करें:

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

कभी कभी यह सब स्क्रिप्ट लोड करने का हमेशा के लिए ले जाता है, लेकिन यह काम करता है, धन्यवाद! – justasd

+0

मदद करने में खुशी हुई! सही उत्तर के रूप में चिह्नित करें! धन्यवाद! – brnfd

+2

अगर मैं पुरानी पोस्ट करता हूं, तो बस एक टिप्पणी, जब आपके पास आपके पृष्ठ पर टाइमर चलते हैं तो मुझे समस्याएं मिलती हैं। तो waitforBackground विधि के साथ भी आप पैरामीटर में दिए गए समय के अंत तक प्रतीक्षा कर रहे हैं। –

संबंधित मुद्दे