Capybara :: ElementNotFound:无法找到字段“电子邮件” Railstutorial(第9章) [英] Capybara::ElementNotFound: Unable to find field "Email" Railstutorial(chapter 9)

查看:72
本文介绍了Capybara :: ElementNotFound:无法找到字段“电子邮件” Railstutorial(第9章)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注Railstutorial(第9章)
首次通过了删除链接的测试,但是从下一次开始,它会发出类似以下的错误:

I am following Railstutorial (chapter 9) The test for" delete links " is passed for first time but from the next time it starts giving some kind of errors like:

Failures:

  1) User pages index delete links as an admin user 
     Failure/Error: sign_in admin
     Capybara::ElementNotFound:
       Unable to find field "Email"
     # ./spec/support/utilities.rb:20:in `sign_in'
     # ./spec/requests/user_pages_spec.rb:38:in `block (5 levels) in <top (required)>'

  2) User pages index delete links as an admin user 
     Failure/Error: sign_in admin
     Capybara::ElementNotFound:
       Unable to find field "Email"
     # ./spec/support/utilities.rb:20:in `sign_in'
     # ./spec/requests/user_pages_spec.rb:38:in `block (5 levels) in <top (required)>'

  3) User pages index delete links as an admin user should be able to delete another user
     Failure/Error: sign_in admin
     Capybara::ElementNotFound:
       Unable to find field "Email"
     # ./spec/support/utilities.rb:20:in `sign_in'
     # ./spec/requests/user_pages_spec.rb:38:in `block (5 levels) in <top (required)>'

Finished in 0.81336 seconds
4 examples, 3 failures

Failed examples:

rspec ./spec/requests/user_pages_spec.rb:48 # User pages index delete links as an admin user 
rspec ./spec/requests/user_pages_spec.rb:42 # User pages index delete links as an admin user 
rspec ./spec/requests/user_pages_spec.rb:43 # User pages index delete links as an admin user should be able to delete another user

Randomized with seed 11884

以下是 utilities.rb 文件

Here is the content of utilities.rb file

include ApplicationHelper

def full_title(page_title)
  base_title = "Welcome to Family & Friends"
  if page_title.empty?
    base_title
  else
    " #{base_title} | #{page_title} "
  end
end

def sign_in(user, options={})
  if options[:no_capybara]
    # Sign in when not using Capybara.
    remember_token = User.new_remember_token
    cookies[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
  else
    visit signin_path
    fill_in "Email",    with: user.email
    fill_in "Password", with: user.password
    click_button "Sign in"
  end
end

user_pages_spec.rb文件的一部分,该位置指示错误

describe "delete links" do

      it { should_not have_link('delete') }

      describe "as an admin user" do
        let(:admin) { FactoryGirl.create(:admin) }
        before do
          sign_in admin
          visit users_path
        end

        it { should have_link('delete', href: user_path(User.first)) }
        it "should be able to delete another user" do
          expect do
            click_link('delete', match: :first)
          end.to change(User, :count).by(-1)
        end
        it { should_not have_link('delete', href: user_path(admin)) }
      end
    end
  end

sessions_helper.rb文件,其中存在sign_in的定义

module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

   def current_user?(user)
    user == current_user
  end

   def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end

  def store_location
    session[:return_to] = request.url if request.get?
  end
end

我什至尝试用fill_in email_id ,如类似文章中所建议,但在这种情况下不起作用

谢谢!

这是html呈现用于登录的new.html.erb的内容

<% provide(:title, "Sign in") %>
<h2>Sign in</h2>

<div class="row">
  <div class="span6 offset3">
    <%= form_for(:session, url: sessions_path) do |f| %>

      <%= f.label :email %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>


推荐答案

旧问题,但当我遇到此问题时完成本教程。搞砸测试的是,前面示例中的状态正在泄漏到作为管理员用户示例中。

Old question but I ran into this problem as well when working through the tutorial. What's messing up the tests is the state from the previous examples is leaking into the "as an admin user" example.

describe "User Pages" do

  subject { page }

    describe "index" do
      let(:user) { FactoryGirl.create(:user) }

        # This is messing up the lower examples
        before(:each) do
          sign_in user
          visit users_path
        end

要查看此操作,您可以添加访问signin_path ,然后添加 save_and_open_page 在调用sign_in帮手之前。

To see this in action you can add visit signin_path then save_and_open_page in the before block prior to calling the sign_in helper.

describe "as an admin user" do
  let(:admin) { FactoryGirl.create(:admin) }
    before do
      visit signin_path
      save_and_open_page
      sign_in admin
      visit users_path
    end

当我的浏览器呈现该页面时,我发现了先前签名的i n用户从未退出过,因此访问登录页面只会将您重定向到该用户的个人资料页面,并且用户个人资料页面上没有电子邮件字段。这就是为什么Capybara报告无法找到字段电子邮件 的原因。

When my browser rendered the page I discovered the previously signed in user never got signed out, so visiting the sign in page just redirects you to the profile page of that user and there is no email field on the user profile page. That's why Capybara reports Unable to find field "Email".

要解决此问题,我在我的计算机上添加了sign_out帮助器

To fix it I added a sign_out helper to my utilities.rb file.

def sign_out
  first(:link, "Sign Out").click
end

我在 sign_in admin 在示例中

describe "as an admin user" do
  let(:admin) { FactoryGirl.create(:admin) }
    before do
      sign_out
      sign_in admin
      visit users_path
    end

此后我所有的测试都通过了。

All my tests passed after this.

这篇关于Capybara :: ElementNotFound:无法找到字段“电子邮件” Railstutorial(第9章)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆