2

サイトを自動的に閲覧するために HtmlUnit を使用しようとしています。その過程でいくつかのボタンを押す必要があります。最初に、この xml を使用してボタンの HtmlAnchor オブジェクトを作成します。

<a href="dog.php">
  <img src="http://images.hand.co.uk/Pic/site_images/hand/Myper/MyOrder/images/DogRed.gif" width="75" height="31" border="0" alt="1 adds"/>
</a>

click() メソッドを使用してクリックすると正常に動作します。次に、目的のコンテンツを表示するためにクリックする必要があるリンクがある別のページに移動します。クリックしても別のページには移動せず、Java スクリプト関数が起動しているだけです。

これは 2 番目のリンクのアンカーです。

<a style="color: black; font-weight: bold;" href="javascript:show_me('DogDetails.php?DogID=2445485', 2445485, 800);">
  details
</a>

これらの要素の両方について、HtmlAnchor オブジェクトと click() メソッドを使用しています。しかし、そのメソッドは 2 番目の要素に対して何もしていません。

HtmlUnit に組み込まれている JavaScript エンジンも使用してみましたが、成功しませんでした。HtmlUnit プラットフォームでこの固定リンクをクリックするにはどうすればよいですか?

4

2 に答える 2

4

最も可能性の高い問題は、JavaScript の実行が完了するのを HtmlUnit が待機していないことです。HtmlUnit FAQ は、3 つの回避策を提案しています: http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork

これらのうち、試す最も適切な解決策はWebClient、AJAX リクエストが完了するまで待機させることです。

webClient.setAjaxController(new NicelyResynchronizingAjaxController());

一部のサイトでは、バックグラウンド スレッドで AJAX を実行する巧妙なトリックが行われていることがわかりました。これはNicelyResynchronizingAjaxController、メイン UI スレッドのみを監視するため、終了を待たないことを意味します。メインのスレッドだけでなく、すべてのスレッドを待機する方法を説明する良い答えがあります。

于 2012-09-07T14:05:13.300 に答える
1

バックグラウンドでJavaScriptが実行されるのを待ついくつかの方法を試しましたが、成功しませんでした。

私はSeleniumに切り替えることを半分考えていましたが、WebClientでCSSを無効にした後、「解決しました」:

WebClient.getOptions().setCssEnabled(false);

CSS を再度有効にすると、.click() が機能しなくなります。

私のアンカーは:

<div class="my-anchor's-parent-class"/>
  <a href="javascript:void(0) class="text" id="buttonSearch" style="display: block;">Search</a>
</div>

アンカーの親の「クラス」プロパティに基づいて動作する .click() ハンドラーをアタッチする JQuery がいくつかありました。

    $('.my-anchor's-parent-class').each(function () {
        $(this).children('a').click(function () {
          // if parent has another given class appended, call .myFunction(this)
          // else, call other function
        });
    });
于 2017-04-11T12:59:50.860 に答える