Как нажать на вторую ссылку с тем же текстом, используя Capybara в Rails 3? - PullRequest
34 голосов
/ 18 июля 2011

В файле просмотра у меня есть:

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

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

click_on 'View'

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

Ответы [ 7 ]

56 голосов
/ 13 апреля 2012

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

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

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

37 голосов
/ 18 июля 2011

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

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

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

When I follow "View" within the comment element

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

15 голосов
/ 08 апреля 2013

Есть много способов решения этого типа проблем.
Сделай так

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

или

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

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

15 голосов
/ 11 марта 2013

Самое плохое во «второй» ссылке - когда-нибудь она может стать третьей, первой или даже двадцать пятой. Таким образом, обзор с блоком within - лучший способ. Пример:

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

Но если трудно указать ссылку с областью действия within (что иногда так и есть), я думаю, что способ щелкнуть по второй ссылке с определенным текстом:

 find(:xpath, "(//a[text()='View'])[2]").click

В более поздних версиях капибары (например, 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 является хорошим способом сделать это.

7 голосов
/ 23 января 2013

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

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

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

2 голосов
/ 19 марта 2015

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

within all(".trip-row")[2] do
   assert page.has_content?("content")
end
1 голос
/ 23 января 2016

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