Подтвердить что ты не робот

Capybara click_link с: 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

Я бы предпочел не возиться с точкой зрения, чтобы заставить тесты работать.

4b9b3361

Ответ 1

вы можете использовать find find(:xpath, "//a[@href='/foo']").click

Ответ 2

В итоге я добавил вспомогательный модуль в spec/support/selectors.rb

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

Затем в тестах я использую

find(:linkhref, some_path).click

Ответ 3

Вы можете использовать интерфейс нижнего уровня Capybara для этого. Попробуйте:

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

Ответ 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')

Какая разница?

Ну, это найдет ссылку, содержащую "google". Следующее будет соответствовать:

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

Что еще будет искать только среди селекторов-потомков, например, within('header') { find(:href, 'google').click } будет работать правильно.

Ответ 5

Мне кажется, что оставить первый аргумент пустым...

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