Rails:如何使用Capybara测试链接的href值而不关心文本?

Dre*_*lee 19 capybara

Capybara提供了检查链接的有用方法:

have_link
Run Code Online (Sandbox Code Playgroud)

据我所知,可以使用如下:

have_link("link_text", :href => "actual link")
Run Code Online (Sandbox Code Playgroud)

但是,我并不关心link_text,而是我只想检查href(因为将测试链接到文本更加脆弱).如果我只想检查href这将是一个视图测试.

如何使用Capybara检查而href无需检查文本?也许我可以使用正则表达式?

[编辑]根据以下答案改变了措辞

Tho*_*ole 41

Capybara没有提供link_to方法,所以我不知道你从哪里得到它(rails提供了一个link_to来在视图中生成链接).要使用capybara找到基于其href的链接,你可以做到

link = page.find(:css, 'a[href="actual link"]')
Run Code Online (Sandbox Code Playgroud)

或者如果你想断言元素存在

page.assert_selector(:css, 'a[href="actual link"]')
Run Code Online (Sandbox Code Playgroud)

或者 - 如果使用RSpec

expect(page).to have_selector(:css, 'a[href="actual link"]')
Run Code Online (Sandbox Code Playgroud)

由于默认情况下链接搜索链接文本中的子字符串,您也可以这样做

expect(page).to have_link(nil, href: 'actual link')
Run Code Online (Sandbox Code Playgroud)

要么

page.assert_selector(:link, nil, href: 'actual link')
Run Code Online (Sandbox Code Playgroud)


Fab*_*bio 6

在寻找相同答案时,我发现可以将选项传递给第一个参数,have_link因为它的实现是:

# RSpec matcher for links
# See {Capybara::Node::Matchers#has_link?}
def have_link(locator=nil, options={}, &optional_filter_block)
  locator, options = nil, locator if locator.is_a? Hash
  HaveSelector.new(:link, locator, options, &optional_filter_block)
end
Run Code Online (Sandbox Code Playgroud)

因此,如果您不关心链接文本,则可以安全地省略第一个参数并执行此操作(RSpec语法):

expect(page).to have_link(href: 'some url')
# or even
expect(page).to have_link(href: /some url regexp/)
Run Code Online (Sandbox Code Playgroud)