Capybara 2.0にアップグレードした後、アイテムリストの最初のリンクをクリックする方法


125

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

<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

回答:


176

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

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のこの動作は非常に良いと思います。


4
#firstを使用しないことをお勧めします。Rubydoc.info / github / jnicklas / capybara / …のような要素が存在するまで待機しません。コンテンツが実行時にJSで作成された場合、リンクが作成される前に期待どおりに実行されると、最初にnilが返されます。
16



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)
  終わり
終わり

2

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

expect(page).to have_css("selector")                               
first("selector").click

2

これらのソリューションのほとんどは、カピバラの素晴らしい待機機能を使用しません

このリンクが示唆するようにしてください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
カピバラはクリックする前に要素が表示されるのを待ちます。

match: :firstあなたは試合に新しい要素を導入した場合、それは静かに別の要素をクリックしますので、より脆いです。


これが最も正確な答えだと思います。
カテリカータ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.