6

Java 用の HtmlUnit ライブラリを使用して、プログラムで Web サイトを操作しています。問題の有効な解決策が見つかりません: すべての AJAX 呼び出しが終了したことを確認し、完全に読み込まれた Web ページを返すにはどうすればよいですか? これが私が試したことです:

まず、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);

そして、完全にロードされたWebページを返すメソッドは次のとおりです。

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

ロードする JavaScript が残っていない場合、その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();
        }

    }

しかし、完全にロードされたページがどのように見えるかわからない場合の解決策は何でしょうか?

4

1 に答える 1