我在Rails应用程序中使用Capybara和Rspec,并且我仍然使用此消息对我的一些测试失败:
Failure/Error: it { should have_content('error') }
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching xpath "/html"
这是合乎逻辑的,因为在我的测试中,我的应用应该使用“错误”内容呈现两条消息。
<% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
<%= t('the_form_contains') %>
<%= pluralize(object.errors.count, t('error')) %>.
</div>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li>* <%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
这是我的应用程序布局:
<!DOCTYPE html>
<html>
<head>
<title><%= full_title(yield(:title)) %></title>
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= csrf_meta_tags %>
<%= render 'layouts/shim' %>
</head>
<body>
<%= render 'layouts/header' %>
<div class="container">
<div class="row-fluid">
<div class="offset2 span8 offset2">
<% flash.each do |key,value| %>
<div class="alert alert-<%= key %>"><%= value %></div>
<% end %>
</div>
</div>
<%= yield %>
<%= render 'layouts/footer' %>
<%= debug(params) if Rails.env.development? %>
</div>
</body>
</html>
你知道一种方式(如选项),让它通过吗?
修改
我使用save_and_open_page
并且我没有找到任何其他html
标记,也没有找到页面外的错误消息。但是,当我删除<!DOCTYPE html>
时,它就可以了。我必须真的有<!DOCTYPE html>
和开场<html>
标签吗?我可以删除<!DOCTYPE html>
而没有后果吗?
<!DOCTYPE html>
<html>
<head>
<title>Le Troquet</title>
<link data-turbolinks-track="true" href="/assets/application.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application.js"></script>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
.
.
.
.
.
<!-- There is no html tag here -->
.
.
.
.
</body>
</html>
答案 0 :(得分:4)
看起来问题是你要么:
<html>
个标记,或者可能是<html></html>
标记。请参阅此讨论:Ambiguous match, found 2 elements matching xpath "/html"。
答案 1 :(得分:4)
检查结束%html
...
:javascript
标记之外的元素。在我的情况下(HAML),我有一个不正确缩进的javascript标记
%html
...
:javascript
...
FIX
private Cursor chooseCursor(int x, int y, int top, int left, int bottom, int right);
缩进:javascript,因此它包含在html标记中解决了问题。
答案 2 :(得分:-2)
好的,我明白了这个问题。当我使用should have_content
时,Capybara会在整个布局中搜索内容。但是它找到了两个html
标签,这使得它失败了,因为它不知道哪个是正确的。为什么有两个html
标签?因为Capybara不会忽略<!DOCTYPE html>
。
我解决了我的问题,但它更像是一个旁路。我没有搜索内容,而是让Capybara搜索包含“错误”消息的“错误”div。因此,它不必搜索整个应用程序布局,也不会被两个html
标签所困扰。
所以我只需要将it { should have_content('error') }
替换为it { should have_selector('div', text: 'error') }
,然后就可以了。