Capybara::ElementNotFound, but it is there

烈酒焚心 提交于 2019-12-07 12:10:30

问题


I'm getting the following error:

Capybara::ElementNotFound: Unable to find field "username"
./spec/controllers/sessions_controller_spec.rb:10:in `block (3 levels) in <top (required)>'

spec:

require 'spec_helper'

describe SessionsController do
  before :each do
    @user = FactoryGirl.create(:user)
  end
  context 'creating a new session' do
    it 'can set the current_user variable to the logged user' do
      visit '/login'
      fill_in 'username', with: 'gabrielhilal' #I have tried `Username` as well
      fill_in 'password', with: 'secret'
      click_button 'Login'
      current_user.should == @user
      current_user.username.should == 'gabrielhilal'
    end
  end
  context 'destroying existing session' do
    xit 'can destroy the current_user' do
    end
  end
end

But I have the field username in my form:

<form accept-charset="UTF-8" action="/sessions" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" / <input name="authenticity_token" type="hidden" value="x7ORLDIvq1BXr8SOkd/Zla9Pl5R5tBXAtyflCpTGCtY=" /></div>
  <div class="field">
    <label for="username">Username</label>
    <input id="username" name="username" type="text" />
  </div>
  <div class="field">
    <label for="password">Password</label>
    <input id="password" name="password" type="password" />
  </div>
  <div class="actions">
    <input name="commit" type="submit" value="Login" />
  </div>
</form>

I did a similar test with cucumber and it is passing, which confirms that the field username is there: When to switch from cucumber to rspec in the BDD cycle for a login procedure

Any idea?

EDIT - I have added the save_and_open_page, which gives me a blank page. The puts "#{page.html.inspect}" also returns empity.

""

Capybara::ElementNotFound: Unable to find field "username"
./spec/controllers/sessions_controller_spec.rb:12:in `block (3 levels) in <top (required)>'

回答1:


I know you've already answered your own question (kind of), but I feel it's still warranted to let you know that the example you've provided is a mixture of a controller and a request spec...

To quote verbatim from RSpec - Controller Specs: Note: To encourage more isolated testing, views are not rendered by default in controller specs.

The main difference (in the way RSpec interprets what kind of spec it is) is the line: describe SessionsController do.

To align it with RSpec and Testing best practices:

  1. Move the spec to spec/requests
  2. Change the describe to describe "SessionsController" do
  3. Remove render_views

your spec should run just fine...

Check out RSpec - Request Specs for what I mean. I would also check out betterspecs.org for ways you can improve on testing.




回答2:


You can debug it with terminal like:

it {puts page.body}

And see if there is 'username' input. But I think that problem on the first step visit '/login'




回答3:


I realised that I have to explicitly tell my controller to render the views. I found it in the rspec readme, so I solve the problem adding render_views.

describe SessionsController do
  render_views #this line solved the problem
  before :each do
    user = FactoryGirl.create(:user)
  end
...


来源:https://stackoverflow.com/questions/18205166/capybaraelementnotfound-but-it-is-there

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!