В файле вида у меня есть:
= link_to 'View', post
= link_to 'View', comment
В файле spec (я использую Capybara):
click_on 'View'
Он нажимает на первую ссылку, но я хочу, чтобы она нажала на вторую. Как я могу это сделать?
В файле вида у меня есть:
= link_to 'View', post
= link_to 'View', comment
В файле spec (я использую Capybara):
click_on 'View'
Он нажимает на первую ссылку, но я хочу, чтобы она нажала на вторую. Как я могу это сделать?
Вероятно, есть несколько способов, но я обычно использую что-то вроде этого.
within(".comment") do
click_on("View")
end
Вполне возможно, возможно, и альтернативы. Обычно я принимаю тестирование от огурца, поэтому мои шаги обычно выглядят как
When I follow "View" within the comment element
Где у меня есть шаг, который переводит within the comment element
на вызов с привязкой к самому шагу (который, я думаю, встроен в последние веб-страницы capybara)
Вы можете попытаться найти все записи и обработать массив:
page.all('a')[1].click
Помогло бы иметь класс или использовать его для охвата вашего поиска;)
Самое худшее в "второй" ссылке - то, что она может стать третьим, первым или даже двадцать пятым когда-нибудь. Таким образом, выбор области с within
- лучший способ. Пример:
within(".comment") do
click_on("View")
end
Но если трудно указать ссылку с областью within
(которая иногда это действительно так), я думаю, что способ щелкнуть вторую ссылку с определенным текстом:
find(:xpath, "(//a[text()='View'])[2]").click
В более поздних версиях capybara (например, 2.0.2
) оба click_on 'View' и click_link 'View' вызовут двусмысленную ошибку совпадения:
Failure/Error: click_on 'View'
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching link or button "View"
Так что это не будет сделано, даже если вы хотите щелкнуть по первой ссылке (или если какая-либо ссылка будет в порядке, это мой случай).
Насколько я понимаю, это делается для того, чтобы заставить людей писать более конкретные тесты, на которые нажимаются ссылки.
Определенно может быть сложно отладить код, если вы случайно разместили две или несколько ссылок с одинаковым текстом и попытаетесь увидеть, что происходит. Хорошо полагаться на то, что вряд ли изменится, и указать ссылку с блоком within
- это хороший способ сделать это.
Существует множество способов решения таких проблем.
Сделайте это так
if(page.find("a")[:href] == "comment")
click_on("View")
или
page.find("a:eq(2)").click
Помните, что индексирование javascript начинается с 0, а в Capybara индексирование начинается с 1. Поэтому используйте a: eq (2) здесь для второго href.
Для решения capybara 2
:
within(".comment") do
click_on("View")
end
не поможет, если у вас есть несколько .comment
. Простое использование: page.first(:link, "View").click
Это работает для меня, если у вас несколько строк одинаковых классов, и вы хотите найти вторую строку. Как и предыдущий автор, индексирование capybara начинается с 1.
within all(".trip-row")[2] do
assert page.has_content?("content")
end
Если вы используете capybara-ui, вы можете определить виджет или ссылку для повторного использования DOM для каждого виджета.
# define your widget. in this case,
# we're defining it in a role
widget :view_post, ['.post', text: 'View']
widget :view_comment, ['.comment', text: 'View']
# then click that widget in the test
role.click :view_post
role.click :view_comment