Capybara :: Ambiguous match,找到2个匹配xpath的元素 - 查找第1个链接

时间:2017-07-20 08:21:16

标签: ruby xpath capybara

我正在进行index操作,其中列出了所有博客帖子

<% @posts.each do |post| %>
<div class="blog-post">
  <h2 class="blog-post-title"><%= link_to post.title, post_path(post) %></h2>
  <p><%= post.sort_description %></p>
  <p class="blog-post-meta">
     <%= link_to 'Read more', post_path(post) %>
  </p>
</div>
<% end %>

在我的测试脚本中,为了访问show操作并查看单个帖子,我有这个

find(:xpath, "//a[@href='/posts/1']").click
# or click_link(href: post_path(post)) 

但是当我尝试运行测试时,我得到了这个错误

Failure/Error: find(:xpath, "//a[@href='/posts/1']").click

     Capybara::Ambiguous:
       Ambiguous match, found 2 elements matching xpath "//a[@href='/posts/1']"

因为水豚发现两个不同的链接进入同一页面(一个在标题和#34;阅读更多&#34;链接)。有没有办法告诉capybara使用找到的第一个链接?

2 个答案:

答案 0 :(得分:1)

由于其中一个链接位于标题h2中,您可以使用它来查找查找范围并消除歧义

find(".blog-post-title > a[href=`#{post_path(post)}`]").click # always better to use post_path than hardcode the id

您也可以执行first(:link, href: post_path(post)).click,但first(如all)的缺点是没有等待/重试行为,所以除非您确定页面在被调用时已完全加载最好避免它(或通过指定其中一个计数选项first(:link, href: post_path(post), minimum: 1).click来启用等待/重试)。

如果您需要大量点击博客标题链接,您还可以创建一个类似

的自定义选择器
Capybara.add_selector(:title_link) do
  css do |post|
    ".blog-post-title > a[href=`#{post_path(post)}`]"
  end
end

然后允许你做

find(:title_link, post).click

答案 1 :(得分:0)

您不必使用xpath。

在您的示例中,您应该可以使用:

first('.blog-post-title > a').click