8

HtmlUnitは、プログラムでWebフォームに入力して送信できる素晴らしいJavaライブラリです。私は現在、ASPで記述されたかなり古いシステムを維持しており、必要に応じてこの1つのWebフォームに毎月手動で入力するのではなく、タスク全体を自動化する方法を模索しています。それを忘れて。1か月以内に収集されたデータを取得するためのフォームです。これまでにコーディングしたものは次のとおりです。

WebClient client = new WebClient();
HtmlPage page = client.getPage("http://urlOfTheWebsite.com/search.aspx");

HtmlForm form = page.getFormByName("aspnetForm");       
HtmlSelect frMonth = form.getSelectByName("ctl00$cphContent$ddlStartMonth");
HtmlSelect frDay = form.getSelectByName("ctl00$cphContent$ddlStartDay");
HtmlSelect frYear = form.getSelectByName("ctl00$cphContent$ddlStartYear");
HtmlSelect toMonth = form.getSelectByName("ctl00$cphContent$ddlEndMonth");
HtmlSelect toDay = form.getSelectByName("ctl00$cphContent$ddlEndDay");
HtmlSelect toYear = form.getSelectByName("ctl00$cphContent$ddlEndYear");
HtmlCheckBoxInput games = form.getInputByName("ctl00$cphContent$chkListLottoGame$0");
HtmlSubmitInput submit = form.getInputByName("ctl00$cphContent$btnSearch");

frMonth.setSelectedAttribute("1", true);
frDay.setSelectedAttribute("1", true);
frYear.setSelectedAttribute("2012", true);
toMonth.setSelectedAttribute("1", true);
toDay.setSelectedAttribute("31", true);
toYear.setSelectedAttribute("2012", true);
games.setChecked(true);
submit.click();

の後click()で、検索結果を表示するテーブルがどこかにあるため、まったく同じWebページの再読み込みが完了するのを待つことになっています。次に、ページの読み込みが完了したら、データをスクレイプして合計を計算するため、HTMLファイルとしてダウンロードする必要があります(お気に入りのブラウザの[名前を付けてページを保存...]とよく似ています)。Jsoupライブラリを使用してすでにそれを行っています。

私の質問は次のとおりです。1。WebページのHtmlUnitへのロードが完了するのをプログラムで待つにはどうすればよいですか。2.結果のWebページをHTMLファイルとしてプログラムでダウンロードするにはどうすればよいですか?

すでにHtmlUnitのドキュメントを調べましたが、必要なことを実行するクラスが見つかりませんでした。

4

3 に答える 3

7

次の設定で試してください。

webClient.waitForBackgroundJavaScript() or

webClient.waitForBackgroundJavaScriptStartingBefore()

ブラウザについても言及する必要があると思います。デフォルトではIEを使用しています。ここから詳細情報を入手できます。 HTMLUnitはJavascriptを待ちません

于 2012-07-05T06:55:14.447 に答える
1

この例はあなたを助けるかもしれません。クリックした後、ページがロードされるのを待つ必要があります。ほとんどの場合、Javaスクリプトなどを使用する動的ページです。オーバーライドされるすべてのメソッドは、多くのコンソールメッセージであなたを圧倒することはありません。必要なものを実装できます。

public static void main(String[] args) throws IOException {
        WebClient webClient = gethtmlUnitClient();
        final HtmlPage page = webClient.getPage("YOUR PAGE");
        webClient.waitForBackgroundJavaScript(60000);
        System.out.println(page);

    }

static public WebClient gethtmlUnitClient() {
        WebClient webClient;
        LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
                "org.apache.commons.logging.impl.NoOpLog");
        java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
        java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);
        webClient = new WebClient(BrowserVersion.CHROME);
        webClient.setIncorrectnessListener(new IncorrectnessListener() {
            @Override
            public void notify(String arg0, Object arg1) {
            }
        });
        webClient.setCssErrorHandler(new ErrorHandler() {

            @Override
            public void warning(CSSParseException arg0) throws CSSException {
                // TODO Auto-generated method stub

            }

            @Override
            public void fatalError(CSSParseException arg0) throws CSSException {
                // TODO Auto-generated method stub

            }

            @Override
            public void error(CSSParseException arg0) throws CSSException {
                // TODO Auto-generated method stub

            }
        });
        webClient.setJavaScriptErrorListener(new JavaScriptErrorListener() {

            @Override
            public void timeoutError(HtmlPage arg0, long arg1, long arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void scriptException(HtmlPage arg0, ScriptException arg1) {
                // TODO Auto-generated method stub

            }

            @Override
            public void malformedScriptURL(HtmlPage arg0, String arg1, MalformedURLException arg2) {
                // TODO Auto-generated method stub

            }

            @Override
            public void loadScriptError(HtmlPage arg0, URL arg1, Exception arg2) {
                // TODO Auto-generated method stub

            }
        });
        webClient.setHTMLParserListener(new HTMLParserListener() {

            @Override
            public void warning(String arg0, URL arg1, String arg2, int arg3, int arg4, String arg5) {
                // TODO Auto-generated method stub

            }

            @Override
            public void error(String arg0, URL arg1, String arg2, int arg3, int arg4, String arg5) {
                // TODO Auto-generated method stub

            }
        });
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        return webClient;

    }
于 2015-08-26T16:02:14.167 に答える
0

結果のWebページをHTMLファイルとしてプログラムでダウンロードするにはどうすればよいですか。

試してみてくださいasXml()。何かのようなもの:

page = submit.click();
String htmlContent = page.asXml();
File htmlFile = new File("C:/index.html");
PrintWriter pw = new PrintWriter(htmlFile, true);
pw.print(htmlContent);
pw.close();
于 2012-07-05T06:45:35.120 に答える