我正在进行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使用找到的第一个链接?
答案 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