4

我在 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>
4

3 回答 3

4

看起来问题是你要么:

  1. 您的页面中有两个<html>标签,或者可能
  2. “错误”文本出现在标签之外。<html></html>

请参阅此讨论:不明确的匹配,找到 2 个匹配 xpath "/html" 的元素

于 2013-06-07T05:53:20.167 回答
4

检查结束</html>标记之外的元素。在我的情况下(HAML),我有一个不正确缩进的 javascript 标签

%html
  ...
:javascript

使固定

%html
  ...
  :javascript
    ...

缩进 :javascript 使其包含在 html 标记中解决了这个问题。

于 2016-01-18T21:16:05.833 回答
-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') },它就起作用了。

于 2013-06-07T06:18:22.357 回答