Rails: как использовать Capybara для проверки href-значения ссылки, не заботясь о тексте?

Capybara предоставляет полезный метод для проверки ссылки:

have_link

который, насколько я могу судить, может использоваться как:

have_link("link_text", :href => "actual link")

однако меня не волнует link_text, а я просто хочу проверить href (поскольку связывание теста с текстом более хрупкое). Если я только хочу проверить href это будет проверка.

как использовать Capybara для проверки href без необходимости проверять текст? Может быть, я могу использовать регулярное выражение?

[edit] изменена формулировка на основе ответа ниже

2 ответов


Capybara не предоставляет метод link_to, поэтому я не уверен, откуда вы это получаете (rails предоставляет link_to для создания ссылок в представлении). Чтобы найти ссылку, основанную только на ее href, используя capybara, вы можете сделать

link = page.find(:css, 'a[href="actual link"]')

или если вы хотите, чтобы утверждать, что элемент существует

page.assert_selector(:css, 'a[href="actual link"]')

или - при использовании RSpec

expect(page).to have_selector(:css, 'a[href="actual link"]')

так как ссылка по умолчанию ищет подстроки в тексте ссылки, вы также можете сделать

expect(page).to have_link(nil, href: 'actual link')

или

page.assert_selector(:link, nil, href: 'actual link')

глядя на тот же ответ, я узнал, что можно передать параметры первому аргументу 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

поэтому, если вы не заботитесь о тексте ссылки, вы можете безопасно опустить первый параметр и сделать это (синтаксис RSpec):

expect(page).to have_link(href: 'some url')
# or even
expect(page).to have_link(href: /some url regexp/)