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

Ale*_*lev 35 ruby-on-rails capybara ruby-on-rails-3

在视图文件中,我有:

= link_to 'View', post
= link_to 'View', comment
Run Code Online (Sandbox Code Playgroud)

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

click_on 'View'
Run Code Online (Sandbox Code Playgroud)

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

小智 57

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

page.all('a')[1].click
Run Code Online (Sandbox Code Playgroud)

有助于有一个类或使用内部来搜索范围;)


kar*_*kie 38

可能有几种方法,但我通常会这样做.

within(".comment") do
  click_on("View")
end
Run Code Online (Sandbox Code Playgroud)

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

When I follow "View" within the comment element
Run Code Online (Sandbox Code Playgroud)

我有一个步骤,转换within the comment element为步骤本身的范围调用(我认为内置到最新的capybara web_steps)

  • 我要提交的是,您应该在要选择的链接上引入一个类,或者将包装元素引入作为测试的钩子.您可能可以使用nth-child伪选择器(http://www.w3.org/TR/css3-selectors/#nth-child-pseudo),但我建议不要使用它,因为它引入了脆弱和依赖于顺序的链接进入你的测试. (4认同)

ins*_*ero 16

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

within(".comment") do
  click_on("View")
end
Run Code Online (Sandbox Code Playgroud)

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

 find(:xpath, "(//a[text()='View'])[2]").click
Run Code Online (Sandbox Code Playgroud)

在更高版本的capybara(2.0.2例如)中,click_on"查看"click_link"查看"都会引发模糊匹配错误:

 Failure/Error: click_on 'View'
 Capybara::Ambiguous:
   Ambiguous match, found 2 elements matching link or button "View"
Run Code Online (Sandbox Code Playgroud)

因此,即使您想要单击第一个链接(或者如果任何链接都可以,这是我的情况),这也不会这样做.

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

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


Roh*_*wal 15

有很多方法可以解决这类问题.
像这样做

if(page.find("a")[:href] == "comment")
    click_on("View")
Run Code Online (Sandbox Code Playgroud)

要么

page.find("a:eq(2)").click
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,这不是"capybara索引",它只是CSS选择器的工作方式 (7认同)

小智 7

对于capybara 2解决方案:

within(".comment") do
  click_on("View")
end
Run Code Online (Sandbox Code Playgroud)

如果你有一些,那会无济于事.comment.这么简单的用法:page.first(:link, "View").click