capybara click_link with:href match

jac*_*ipe 33 ruby-on-rails capybara

我在请求规范中有以下测试:

page.should have_link('Edit user', :href => edit_users_path(@user))
Run Code Online (Sandbox Code Playgroud)

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

click_link('Edit user', :href => edit_users_path(@user))
Run Code Online (Sandbox Code Playgroud)

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

有没有一个好方法,这似乎是一个相当明显的用例?

我应该在表中包含#id <tr>还是<td>执行以下操作:

within(#user_id)
  click_link 'Edit user'
end
Run Code Online (Sandbox Code Playgroud)

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

jvn*_*ill 43

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


dia*_*ist 16

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

find("a[href='#{edit_users_path}']").click
Run Code Online (Sandbox Code Playgroud)


wot*_*oto 13

2021年,它会按预期运行

click_link('...', href: '...')
click_link('...')
click_link(href: '...')
Run Code Online (Sandbox Code Playgroud)

  • 到 2022 年,这确实应该成为公认的答案。 (2认同)

jac*_*ipe 11

我最后添加了一个辅助模块 spec/support/selectors.rb

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

然后在我使用的测试中

find(:linkhref, some_path).click
Run Code Online (Sandbox Code Playgroud)


jma*_*eli 5

基于@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
Run Code Online (Sandbox Code Playgroud)

用法示例:

find(:href, 'google')
Run Code Online (Sandbox Code Playgroud)

有什么不同?

好吧,这将找到任何包含“ google”的链接。以下将匹配:

www.google.com
http://google.com
fonts.google.com
something.google.inside.com
Run Code Online (Sandbox Code Playgroud)

此外,它将仅在子代选择器中搜索,因此例如within('header') { find(:href, 'google').click }可以正常工作。