Ответ 1
вы можете использовать find find(:xpath, "//a[@href='/foo']").click
У меня есть следующий тест в спецификации запроса:
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
Я бы предпочел не возиться с точкой зрения, чтобы заставить тесты работать.
вы можете использовать find find(:xpath, "//a[@href='/foo']").click
В итоге я добавил вспомогательный модуль в spec/support/selectors.rb
module Selectors
Capybara.add_selector(:linkhref) do
xpath {|href| ".//a[@href='#{href}']"}
end
end
Затем в тестах я использую
find(:linkhref, some_path).click
Вы можете использовать интерфейс нижнего уровня Capybara для этого. Попробуйте:
find("a[href='#{edit_users_path}']").click
На основе ответа @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 }
будет работать правильно.
Мне кажется, что оставить первый аргумент пустым...
page.should have_link("", :href=>edit_comment_path(@comment))