2013-10-23 17 views
6

Tôi có một chương trình được viết để cạo mã nguồn từ một trang web sau khi một nút được nhấp. Tôi không thể loại bỏ đúng trang vì tôi tin rằng yêu cầu AJAX đang được gửi và tôi không chờ phản hồi này diễn ra. Mã của tôi hiện nay là:Xử lý yêu cầu AJAX trong Htmlunit

public class Htmlunitscraper { 

    private static String s = "http://cpdocket.cp.cuyahogacounty.us/SheriffSearch/results.aspx?q=searchType%3dSaleDate%26searchString%3d10%2f21%2f2013%26foreclosureType%3d%27NONT%27%2c+%27PAR%27%2c+%27COMM%27%2c+%27TXLN%27"; 

    public static String scrapeWebsite() throws IOException { 

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 

    final WebClient webClient = new WebClient(); 
    final HtmlPage page = webClient.getPage(s); 
    final HtmlForm form = page.getForms().get(2); 
    final HtmlSubmitInput button = form.getInputByValue(">"); 
    final HtmlPage page2 = button.click(); 
    String originalHtml = page2.refresh().getWebResponse().getContentAsString(); 
    return originalHtml; 
    } 
} 

Sau khi đề cập đến link này, tôi tin rằng để sửa lỗi này tôi có thể thực hiện phương pháp "webClient.waitForBackgroundJavaScript (10000)". Vấn đề duy nhất là tôi không hiểu làm thế nào để làm điều này bởi vì mỗi lần tôi nhấp vào nút Tôi tạo ra một đối tượng HtmlPage, không phải là một đối tượng WebClient. Làm cách nào tôi có thể kết hợp phương pháp này để khắc phục sự cố?

Trả lời

2

tôi sẽ cố gắng giải pháp thiết

webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 

này sẽ gây ra tất cả ajax gọi là đồng bộ.

Ngoài ra, bạn đã thử giải pháp của mình để gọi tới "webClient.waitForBackgroundJavaScript (10000)" sau khi đã nhận được trang chưa?

Something như thế này:

final HtmlPage page2 = button.click(); 
webClient.waitForBackgroundJavaScript(10000) 
String originalHtml = page2.asXml(); 
return originalHtml; 

Vui lòng sử dụng cũng HtmlUnit 2.13

5

Đối với tôi nó giúp sử dụng HtmlUnit 2.15 với NicelyResynchronizingAjaxController, và cũng

webClient.getOptions().setThrowExceptionOnScriptError(false); 

cài đặt đầy đủ của tôi là

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24); 
    webClient.getOptions().setJavaScriptEnabled(true); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setCssEnabled(false); 
    webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
Các vấn đề liên quan