如何使用Rails 3中的Capybara单击具有相同文本的第二个链接?

时间:2011-07-18 13:14:10

标签: ruby-on-rails ruby-on-rails-3 capybara

在视图文件中我有:

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

在spec文件中(我正在使用Capybara):

click_on 'View'

点击第一个链接,但我希望它点击第二个链接。我该怎么办?

7 个答案:

答案 0 :(得分:54)

您可以尝试查找所有条目并处理数组:

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

有助于创建课程或使用 来搜索范围;)

答案 1 :(得分:37)

可能有一些方法,但我通常会这样做。

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

也有可能/可能的替代方案。我通常用黄瓜进行验收测试,所以我的步骤通常看起来像

When I follow "View" within the comment element

我有一个步骤将within the comment element转换为对步骤本身的范围调用(我认为这是内置于最新的capybara web_steps中)

答案 2 :(得分:15)

关于“第二个”链接最糟糕的事情是它有一天会成为第三个或第一个甚至是第二个。因此,使用within块确定范围是最好的方法。例如:

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

但是如果很难指定具有within范围的链接(有时它实际上是这样),我想点击带有某个文本的第二个链接的方法是:

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

在更高版本的水豚(例如2.0.2)中, click_on“查看” click_link“查看”会引发模糊匹配错误:< / p>

 Failure/Error: click_on 'View'
 Capybara::Ambiguous:
   Ambiguous match, found 2 elements matching link or button "View"

即使你想点击第一个链接(或者如果任何链接没问题,这是我的情况),这也不行。

据我所知,这是为了迫使人们在点击特定链接时编写更具体的测试。

如果您不小心将两个或多个链接放在相同的文本中并尝试查看正在发生的事情,那么调试代码肯定会很棘手。依靠不太可能改变的东西并指定带有within块的链接是一种很好的方法。

答案 3 :(得分:15)

解决此类问题的方法有很多种。
这样做

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

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

请记住,javascript索引从0开始,而在Capybara中,索引从1开始。所以在这里使用a:eq(2)进行第二次href。

答案 4 :(得分:7)

对于capybara 2解决方案:

within(".comment") do
  click_on("View")
end
如果您有一些.comment

将无济于事。如此简单的使用:page.first(:link, "View").click

答案 5 :(得分:2)

如果您有多行相同的类并且想要找到第二行,这对我有用。像之前提到的作者一样,水豚索引从1开始。

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

答案 6 :(得分:1)

如果使用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