2

このWebページからデータを取得しようとしています:http ://www.atm-mi.it/en/Giromilano/Pages/default.aspx 。基本的に、私はJavaでHtmlUnitを使用して、左の列の中央にある「ルートと時刻表のファインダー」と対話し、選択の各オプションをループして、「検索」をクリックし、結果のページから必要なデータを収集しています。

都市ルートのデータを抽出するのに問題はありませんが、上のラジオボタンを処理できないようです。たとえば、ブラウザで[地下]をクリックすると、下の選択でさまざまなオプションを含む新しいページが表示されます。

しかし、私は以前と同じSelectを取得し続けます。もっと正確に言うと、私は同じページを取得し続けます(page2はpageと同じHTMLコードを持っています)。

明らかに、.click()関数で問題が発生しているはずですが、どうでしょうか。

これは私のコードの単純なバージョンです:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setThrowExceptionOnScriptError(false);

HtmlPage page = webClient.getPage("http://www.atm-mi.it/en/Giromilano/Pages/default.aspx");

HtmlRadioButtonInput radioButton2 = (HtmlRadioButtonInput) page.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0");
HtmlPage page2 = radioButton2.click();

HtmlSelect lineSelect = (HtmlSelect) page2.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_txt_dp_lines");
int size = lineSelect.getOptionSize();
System.out.println(size);

これはラジオボタン入力HTMLです:

<input id="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0" type="radio" name="ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl" value="0" onclick="javascript:setTimeout('__doPostBack(\'ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl$0\',\'\')', 0)" />
<label for="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0">Underground</label>

選択:

<select name="ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$txt_dp_lines" id="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_txt_dp_lines" class="dplinee">

編集:わかりました。別のアプローチを試しました。JavaScriptエンジンの問題のように見えたので、自分でonclickアクションを実行してJavaScriptを無効にできると思いました。これは元のJavaScript関数です。

var theForm = document.forms['aspnetForm'];
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

そして、これは私がしたことです:

HtmlForm aspnetForm = (HtmlForm) page.getElementById("aspnetForm");
HtmlHiddenInput eventTarget = (HtmlHiddenInput) page.getElementById("__EVENTTARGET");
HtmlHiddenInput eventArgument = (HtmlHiddenInput) page.getElementById("__EVENTARGUMENT");

eventTarget.setValueAttribute("ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl$0");
eventArgument.setValueAttribute("");
HtmlElement submitButton = (HtmlElement) page.createElement("button");
submitButton.setAttribute("type", "submit");
aspnetForm.appendChild(submitButton);
HtmlPage page2 = submitButton.click();

同じ古いSelectで同じページを取得し続けることを除いて、すべて良好です。これはかなり長くて退屈な質問だと思いますが、とにかく更新できると思いました。誰かが最終的にこれを試す忍耐力を持ってくれることを願っています(そして少なくとも私が明らかな間違いをしていないことを確認してください)。

4

1 に答える 1

4

私はついにこれを機能させる方法を見つけました。2 番目のアプローチはほぼ正しかった。フォームは正しく送信していましたが、通常の閲覧とは異なり、ラジオ ボタンを実際にチェックしていませんでした。どうやら、宛先ページもその情報を使用していたようです。これを追加することで

HtmlRadioButtonInput radioButton = (HtmlRadioButtonInput) page.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0");
radioButton.setChecked(true);

私の以前の試みでは、送信アクションは完全に機能しました。メソッドが期待どおりに機能しなかった理由はまだわかりません.click()が、これで十分です。

于 2013-01-03T14:57:45.440 に答える