Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capybara choose method Unable to find radio button

I have a form which is generated by simple form:

TL TR
<div class="form-group radio_buttons required user_register_temp_package">
  <label class="radio_buttons required control-label">
    <abbr title="zorunlu">
      *
    </abbr>
    Paket
  </label>
  <label class="radio">
    <input class="radio_buttons required" id="user_register_temp_attributes_domain_package_id_1" name="user[register_temp_attributes][domain_package_id]" type="radio" value="1">
    Small
  </label>
  <label class="radio">
    <input checked="checked" class="radio_buttons required" id="user_register_temp_attributes_domain_package_id_2" name="user[register_temp_attributes][domain_package_id]" type="radio" value="2">
    Medium
  </label>
  <label class="radio">
    <input class="radio_buttons required" id="user_register_temp_attributes_domain_package_id_3" name="user[register_temp_attributes][domain_package_id]" type="radio" value="3">
    Large
  </label>
</div>
TL TR

I have a simple spec like this:

# encoding: UTF-8
require 'spec_helper'

feature 'Register' do

  background do
    visit new_user_registration_path
  end

  scenario 'fill register form and register' do
    # TL TR
    choose('user_register_temp_attributes_domain_package_id_1')
    # TL TR
  end

end

My spec_helper.rb is

ENV['RAILS_ENV'] ||= 'test'
require File

.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rspec'

Capybara.javascript_driver = :webkit
Capybara.default_selector = :css

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  # ## Mock Framework
  #
  # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true

  # If true, the base class of anonymous controllers will be inferred
  # automatically. This will be the default behavior in future versions of
  # rspec-rails.
  config.infer_base_class_for_anonymous_controllers = false

  # Run specs in random order to surface order dependencies. If you find an
  # order dependency and want to debug it, you can fix the order by providing
  # the seed, which is printed after each run.
  #     --seed 1234
  config.order = 'random'

  # Capybara DSL
  config.include Capybara::DSL

  # Factory girl
  config.include FactoryGirl::Syntax::Methods

end

The Capybara API for the choose method says:

"Find a radio button and mark it as checked. The radio button can be found via name, id or label text."

But when I run spec with choose('user_register_temp_attributes_domain_package_id_1'), I get Capybara::ElementNotFound: Unable to find radio button "user_register_temp_attributes_domain_package_id_1"

I've tried code below but got Capybara::ElementNotFound: Unable to find css "user_register_temp_attributes_domain_package_id_1" error:

find('#user_register_temp_attributes_domain_package_id_1[value=1]').set(true)

It seems there is no problem with fill_in, check or click_button methods.

Regards.

like image 224
onurozgurozkan Avatar asked Jan 23 '14 21:01

onurozgurozkan


1 Answers

Most likely underlying driver thinks that this radio button is invisible. By default Capybara finds only visible elements (as Capybara.ignore_hidden_elements is true by default) so it didn't find that element.

Try:

choose('user_register_temp_attributes_domain_package_id_1', visible: false)

You can improve error message by submitting a pull request to Capybara.

like image 71
Andrei Botalov Avatar answered Nov 11 '22 00:11

Andrei Botalov