capybara click_link with:href match

时间:2013-02-19 12:51:42

标签: ruby-on-rails capybara

我在请求规范中进行了以下测试:

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

这将检查索引视图中的特定用户是否具有编辑链接。 我想点击相同的链接,例如:

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

不幸的是,click_link不接受选项。

有没有一种好方法可以做到这一点,这似乎是一个相当明显的用例?

我是否应该在表<tr><td>中加入#id并执行以下操作:

within(#user_id)
  click_link 'Edit user'
end

我不想修改视图只是为了让测试工作。

6 个答案:

答案 0 :(得分:40)

您可以使用find find(:xpath, "//a[@href='/foo']").click

答案 1 :(得分:16)

您可以使用Capybara的低级界面来执行此操作。尝试:

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

答案 2 :(得分:11)

我最终在spec/support/selectors.rb

中添加了一个辅助模块
module Selectors
  Capybara.add_selector(:linkhref) do
    xpath {|href| ".//a[@href='#{href}']"}
  end
end

然后在测试中我使用

find(:linkhref, some_path).click

答案 3 :(得分:4)

根据@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')

有什么区别?

这将找到包含&#39; google&#39;的任何链接。以下内容将匹配:

www.google.com
http://google.com
fonts.google.com
something.google.inside.com

它只会在后代选择器中进行搜索,例如within('header') { find(:href, 'google').click }工作正常。

答案 4 :(得分:1)

将第一个参数留空似乎对我有用......

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

答案 5 :(得分:1)

在 2021 年它会按预期工作 ?

click_link('...', href: '...')
click_link('...')
click_link(href: '...')