水豚找不到删除操作的用户



我正在使用RSpec(v. 3.1.0)和Capybara(v. 2.4.3)来测试我的Rails 4应用程序。 我的用户删除 spec.rb 包含以下代码:

it "is successful when clicking the destroy link" do
      visit "/users"          
      save_and_open_page
within "#user_#{user.id}" do                        
    click_link "Destroy"            
end
    expect(page).to have_content("User was successfully destroyed.")

水豚抛出以下错误:

 1) Deleting User is successful when clicking the destroy link
 Failure/Error: within "#user_#{user.id}" do
 Capybara::ElementNotFound:
   Unable to find css "#user_509"

Save_and_open_page显示FactoryGirl为测试创建了一个用户。 错误消息指示用户的 ID 为 509。我的程序代码(删除方法)按预期工作,因此问题似乎是我的测试代码。我该怎么做才能帮助水豚找到用户? 感谢您的任何帮助!

更新:这是HTML源代码:

<!DOCTYPE html>
<html>  
  <head>    
  <title>Users | App </title>
  <link data-turbolinks-track="true" href="/assets/appointments.css?body=1" media="all" rel="stylesheet" />
  <link data-turbolinks-track="true" href="/assets/cardio_exercises.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/custom.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/members.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/sessions.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/static_pages.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/strength_exercises.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/trainers.css?body=1" media="all" rel="stylesheet" />
 <link data-turbolinks-track="true" href="/assets/users.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/appointments.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/cardio_exercises.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/members.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/sessions.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/static_pages.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/strength_exercises.js?body=1"></script>


  • 帮助
  • 登录
  • <div class="container">
      <h1>Listing Users</h1>
    <table>
      <thead>
    <tr>
      <th>User Name</th>      
      <th>Email</th>
      <th>Member</th> 
      <th>Trainer</th>     
      <th colspan="3"></th>
    </tr>
    </thead>
    <tbody>
       <tr>
        <td>ColeCole</td>        
        <td>xx@xxx.com</td>
        <td>true</td>
        <td>false</td>      
        <td><a href="/users/14">Show</a></td>
        <td><a href="/users/14/edit">Edit</a></td>
        <td><a data-confirm="Are you sure?" data-method="delete" href="/users/14" rel="nofollow">Destroy</a></td>
      </tr>
    </tbody>
    </table>
    <br>
     <a href="/users/new">New User</a>
      <footer class="footer">
     <small>
     The <a href="https://xxxx.herokuapp.com/">xxxx</a>
      by <a href="https://xxxx.herokuapp.com/">xxxx</a>
     </small>
     <nav>
    <ul>
      <li><a href="/contact">Contact</a></li>
      <li><a href="/about">About</a></li>
      <li><a href="https://xxxx.herokuapp.com/#">xxxx</a></li>
    </ul>
    </nav>
    </footer>
      <pre class="debug_dump">--- !ruby/hash:ActionController::Parameters
    action: index
    controller: users
    </pre>
    </div>
    </body>  
    </html>
    

    如果页面上只有一个删除按钮,这应该有效:

    it "is successful when clicking the destroy link" do
      visit "/users"                                
      click_link "Destroy"           
    expect(page).to have_content("User was successfully destroyed.")
    

    编辑:我假设你对CSS选择器不是很熟悉。对于水豚,当你说:

    #user_#{user.id}
    

    您不是在抓取诸如"user_509"之类的文本,而是在抓取具有"user_509"标识的 DOM 元素。因此,要让 Capybara 在你的代码中找到该元素,你必须有这样的东西:

    <a id="user_509" data-confirm="Are you sure?" data-method="delete" href="/users/14" rel="nofollow">Destroy</a>
    

    仅仅有一个文本字段是不够的,因为文本不是DOM的一部分。

    最新更新