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

Как нажать вторую ссылку с тем же текстом, используя Capybara в Rails 3?

В файле вида у меня есть:

= link_to 'View', post
= link_to 'View', comment

В файле spec (я использую Capybara):

click_on 'View'

Он нажимает на первую ссылку, но я хочу, чтобы она нажала на вторую. Как я могу это сделать?

4b9b3361

Ответ 1

Вероятно, есть несколько способов, но я обычно использую что-то вроде этого.

within(".comment") do
  click_on("View")
end

Вполне возможно, возможно, и альтернативы. Обычно я принимаю тестирование от огурца, поэтому мои шаги обычно выглядят как

When I follow "View" within the comment element

Где у меня есть шаг, который переводит within the comment element на вызов с привязкой к самому шагу (который, я думаю, встроен в последние веб-страницы capybara)

Ответ 2

Вы можете попытаться найти все записи и обработать массив:

page.all('a')[1].click

Помогло бы иметь класс или использовать его для охвата вашего поиска;)

Ответ 3

Самое худшее в "второй" ссылке - то, что она может стать третьим, первым или даже двадцать пятым когда-нибудь. Таким образом, выбор области с 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 - это хороший способ сделать это.

Ответ 4

Существует множество способов решения таких проблем.
Сделайте это так

if(page.find("a")[:href] == "comment")
    click_on("View")

или

page.find("a:eq(2)").click

Помните, что индексирование javascript начинается с 0, а в Capybara индексирование начинается с 1. Поэтому используйте a: eq (2) здесь для второго href.

Ответ 5

Для решения capybara 2:

within(".comment") do
  click_on("View")
end

не поможет, если у вас есть несколько .comment. Простое использование: page.first(:link, "View").click

Ответ 6

Это работает для меня, если у вас несколько строк одинаковых классов, и вы хотите найти вторую строку. Как и предыдущий автор, индексирование capybara начинается с 1.

within all(".trip-row")[2] do
   assert page.has_content?("content")
end

Ответ 7

Если вы используете 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