1

HTMLUnit を使用して Web 上のページを取得しています。この Web ページには、フォームがあります。Chrome から読み込んでソースを表示すると、次のようになります。

<form name="form" method="post" onsubmit="return checkDate();">
     <input name="check_in_date" id="check_in_date" readonly="readonly" type="text" class="hasDatepicker"/>
     <input name="check_out_date" id="check_out_date" readonly="readonly" type="text" class="hasDatepicker"/>
     <input name="check_availability" value="test condition" type="submit"/>
</form>

しかし、このコードで HTMLUnit を使用してロードしている場合:

String url = "sample link";
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = webClient.getPage(url);
System.out.println(page.asXML());

別の HTML コードを取得します。もっと詳しく :

<form name="form" method="post" onsubmit="return checkDate();">
         <input name="check_in_date" id="check_in_date" readonly="readonly" type="text" class="hasDatepicker"/>
         <input name="check_out_date" id="check_out_date" readonly="readonly" type="text" class="hasDatepicker"/>
         <input name="check_availability" value="test condition" type="text"/>
 </form>

ここでの違いは次のとおりです。最後の行: <input name="check_availability" value="test condition" type="text"/>送信ではなくテキストを入力するため、この種のコードはできません:

HtmlForm form = page.getFormByName("form");
HtmlSubmitInput submit = form.getInputByName("check_availability"); // error at this line
page = submit.click();

現在、このフィールドはbuttonもはやテキストではなく、単なるテキストであるため、エラーが発生しました。なぜこの違いがあるのか​​ わかりません。これを修正する方法を教えてください。

ありがとう :)

4

2 に答える 2

1

あなたの質問に答える前にいくつかのコメント:

Chrome インスペクタに表示されるコンテンツが HtmlUnit によって返されるコードと異なることは理にかなっています。さらに、Chrome インスペクターに表示されるコードは、ページ自体のソース コード (CTRL+U) を表示するときに表示されるコードとは異なります。前者は既に Javascript が実行されているためです。

HtmlUnit の JavaScript エンジンは Chrome のものとは異なるため、HtmlUnit で JavaScript を有効にしても、異なる結果が得られる場合があります。でさえ、asXml()コードのフォーマット変更を実行します。

私は2つのオプションを考えることができると言った:

  1. JavaScript が処理されたページと処理されていないページを比較しています。
  2. バグを発見しました

私はそれが最初のものだと確信しています。JavaScript を有効/無効にasXml()したり、HtmlUnit がダウンロードしているページの実際のコンテンツの結果と結果を比較したり (つまり、処理なしで) プレイをデバッグするのに役立ちます。その方法について詳しくは、次の質問をご覧ください。

JavaScript と CSS を無視して、HTMLUnit でページの純粋な生の HTML を取得する方法は?

HtmlUnit の障害であり、Web ページの処理が失敗していることが事実上判明した場合は、SourceForgeプロジェクトに新しいバグを報告してください。また、これを再現するためのテスト ケースを提供していただきたいと思います。

于 2013-09-18T20:25:15.933 に答える