Capybara :: ElementNotFound:无法找到字段“电子邮件” Railstutorial(第9章) [英] Capybara::ElementNotFound: Unable to find field "Email" Railstutorial(chapter 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屋!