web-dev-qa-db-ja.com

capybara click_link with:href match

リクエスト仕様に次のテストがあります:

page.should have_link('Edit user', :href => edit_users_path(@user))

これにより、インデックスビュー内の特定のユーザーに編集リンクがあることを確認します。次のようなもので、同じリンクをクリックしたいと思います。

click_link('Edit user', :href => edit_users_path(@user))

残念ながら、click_linkはオプションを受け入れません。

これを行う良い方法はありますか、それはかなり明白なユースケースのように思えますか?

テーブルに#idを含める必要があります<tr>または<td>および次のようなことを行います。

within(#user_id)
  click_link 'Edit user'
end

テストを機能させるためだけに、ビューをいじくり回したくないのです。

32
jackpipe

find find(:xpath, "//a[@href='/foo']").clickを使用できます

42
jvnill

これを行うには、Capybaraの低レベルインターフェイスを使用できます。試してください:

find("a[href='#{edit_users_path}']").click
16
diabolist

spec/support/selectors.rbにヘルパーモジュールを追加しました

module Selectors
  Capybara.add_selector(:linkhref) do
    xpath {|href| ".//a[@href='#{href}']"}
  end
end

その後、私が使用するテストで

find(:linkhref, some_path).click
11
jackpipe

@jackpipeの回答(および以前の経験)に基づいて、独自のCapybaraセレクターを作成します。ヘルパーモジュールのコードは次のとおりです(_spec/support/selectors.rb_):

_module Selectors
  # find(:href, 'google.com')
  Capybara.add_selector(:href) do
    xpath {|href| XPath.descendant[XPath.attr(:href).contains(href)] }
  end
end
_

使用例:

_find(:href, 'google')
_

違いは何ですか?

さて、これは「google」を含むリンクを見つけます。以下が一致します。

_www.google.com
http://google.com
fonts.google.com
something.google.inside.com
_

さらに、子孫セレクター間でのみ検索します。 within('header') { find(:href, 'google').click }は正しく動作します。

5
jmarceli

最初の引数を空白のままにしておくとうまくいくようです...

page.should have_link("", :href=>edit_comment_path(@comment))
1
vanboom