137

その場合の最初のリンクをクリックする方法:

<div class="item">
  <a href="/agree/">Agree</a>
</div>
<div class="item">
  <a href="/agree/">Agree</a>
</div>
within ".item" do
  first(:link, "Agree").click
end

そして私はこのエラーを受け取ります:

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

そして、within私がいなければ、このエラーが発生します:

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass
4

7 に答える 7

187

あなたはただ使うことができます:

first('.item').click_link('Agree')

また

first('.item > a').click

(デフォルトのセレクターが:cssの場合)


質問のコードは次のようには機能しません:

within ".item" do
  first(:link, "Agree").click
end

と同等です:

find('.item').first(:link, "Agree").click

カピバラはいくつか.itemのを見つけたので、例外を発生させます。このカピバラ2の振る舞いはとても良いと思います。

于 2013-01-25T07:12:51.497 に答える
132

次のことを試してください。

within ".item" do
  click_link("Agree", :match => :first)
end

出典:

于 2013-06-25T21:43:48.673 に答える
25

この言い回しも機能します。

within first(".item") do
  click_link "Agree"
end
于 2014-08-12T18:41:37.167 に答える
5

これらのソリューションのほとんどは、Capybaraの優れた待機機能を使用しません

このリンクが示唆するように、より良い方法を実行してください:
https ://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

悪い:

first(".active").click
ページに.active要素がまだない場合、最初にnilが返され、クリックは失敗します。

良い:

正確に1つあることを確認したい場合
find(".active").click

最初の要素が必要な場合、
find(".active", match: :first).click
Capybaraは要素が表示されるのを待ってからクリックを試みます。

match: :first一致する新しい要素を導入すると、別の要素がサイレントにクリックされるため、より脆弱であることに注意してください。

于 2019-06-18T09:30:49.580 に答える
4

Xpathは要素をアドレス指定できます。まだあまり上手ではありませんが、//div[@class='active'][1]/a

これは機能する場合と機能しない場合がありますが、重要なのは、xpathが一致の配列をアドレス指定し、特定の一致を引き出すことができるということです。これに合わせることができるはずです。

私のプロジェクトの1つからの実用的な例の例:

page.find( "div.panel"、text:/ Proposals /)内
  page.find('tr'、text:/ Foo /)内で行う
    page.should have_xpath('td [3]'、text:@today)
  終わり
終わり
于 2013-01-25T02:33:03.410 に答える
2

first()は常に待機するとは限らないため、おそらくこれは便利です。

expect(page).to have_css("selector")                               
first("selector").click
于 2016-09-03T23:50:30.590 に答える
-4

簡単に使用できます:

$('.item').find('a').first().click();
于 2016-06-20T11:57:24.283 に答える