3

xpath(nokogiri)で選択したMechanizeでリンクをクリックしたい。

そんなことがあるものか?

    next_page = page.search "//div[@class='grid-dataset-pager']/span[@class='currentPage']/following-sibling::a[starts-with(@class, 'page')][1]"
    next_page.click

問題は、のこぎり要素にクリック機能がないことです。

リンクに onclick 関数が定義されている (href 属性がない) ため、href (URL) を読み取って get 要求を送信できません。

それが不可能な場合、代替手段は何ですか?

4

3 に答える 3

11
  1. 要素を 1 つだけ見つけようとしている場合page.atの代わりに使用します。page.search

  2. CSS セレクター構文を使用して、セレクターをよりシンプル (短く) にすることができます。

    next_page = page.at('div.grid-dataset-pager > span.currentPage + a[class^="page"]')
    
  3. Linkコンストラクターにフィードする Nokogiri 要素、ページ、および機械化オブジェクトがある場合は、独自のインスタンスを構築できます。

    next_link = Mechanize::Page::Link.new( next_page, mech, page )
    next_link.click
    
  4. Mechanize#clickただし、クリックするアンカー/ボタンのテキストを含む文字列を提供できるため、必要ない場合があります。

    # Assuming this link text is unique on the page, which I suspect it is
    mech.click next_page.text
    
  5. 質問を完全に読み直してから編集してください: ただし、 Mechanize は Web ブラウザーではないため、これは役に立ちません。JavaScript エンジンを持たないため、あなたに代わって実行することはできません (実行できません) onclick。このためには、Ruby を使用して実際の Web ブラウザを制御する必要があります。たとえば、WatirSeleniumCelerityなどを使用します。

于 2012-07-25T22:28:06.497 に答える
3

一般的に、あなたは次のことをします:

page.link_with(:node => next_link).click

しかし、Phrogzが言うように、これは本当にあなたが望むことをしません。

于 2012-07-26T01:48:58.437 に答える
0

代わりにhpricot要素を使用してみませんか?リンクに「src」または「href」属性がある限り、Mechanizeはhpricot要素をクリックできます。これらの線に沿って何かを試してください:

page = agent.get("http://www.example.com")
next_page = agent.click((page/"//your/xpath/a"))

編集Phrogzの回答を読んだ後、私はこれでは実際にはうまくいかないことにも気づきました。MechanizeはまだJavascriptをサポートしていません。これを念頭に置いて、3つのオプションがあります。

  1. 実際のWebブラウザを制御するライブラリを使用します。@Phrogzの回答を参照してください。
  2. 統合テストライブラリであるCapybaraを使用しますが、スタンドアロンのクローラーとしても使用できます。これは、Javaの統合テストライブラリでもあるHTMLUnitを使用して正常に実行されました。CapybaraはデフォルトでSeleniumをサポートしていますが、外部のgemを介してWebkitもサポートしています。CapybaraはJavascriptをそのまま解釈します。このブログ投稿が役立つかもしれません。
  3. クロールする予定のページを作成し、HTTPFoxなどを使用して、onclick Javascript関数の機能を監視し、これをMechanizeスクリプトに複製します。

幸運を。

于 2012-07-25T15:17:25.207 に答える