Capybara: Select an option by value not text

RubyCapybara

Ruby Problem Overview


For the HTML

<select id="date">
  <option value="20120904">Tue 4 Sep 2012</option>
  <option value="20120905">Wed 5 Sep 2012</option>
  <option value="20120906">Thu 6 Sep 2012</option>
</select>

I have the following Capybara Ruby code:

select "20120905", :from => "date"

But this errors with:

cannot select option, no option with text '20120905' in select box 'date' (Capybara::ElementNotFound)

However, if I do

select "Wed 5 Sep 2012", :from => "date"

It's ok.

Is it possible to select an option in Capybara by Value not Text?

Thanks

Ruby Solutions


Solution 1 - Ruby

This will work to select an option by value:

find("option[value='20120905']").click

To maintain the scope of the selector you could wrap it in a within block as such:

within '#date' do
  find("option[value='20120905']").click
end

Solution 2 - Ruby

With Poltergeist as driver I can't click on an option like suggested in some of the other options above, instead you can do the following:

page.find_by_id('date').find("option[value='20120905']").select_option

Solution 3 - Ruby

I wrote a helper method:

def select_by_value(id, value)
  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"
  option = find(:xpath, option_xpath).text
  select(option, :from => id)
end

Save in a .rb file in spec/support/

Example use:

before do
  select_by_value 'some_field_id', 'value'
  click_button 'Submit'
end

Solution 4 - Ruby

You can also achieve it by doing the following:

find_by_id('date').find("option[value='20120905']").click

Solution 5 - Ruby

That helper method is pretty clever. I would change it just a little bit:

def select_by_value(id, value)

  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"

  find(:xpath, option_xpath).click

end

or just:

find(:xpath, "//select[@id='date']/option[@value='20120904']").click

Solution 6 - Ruby

In my case I have a few options with same text, that's the reason why I need select by value. Combining a few answers together I've found the best solution for me:

def select_by_value(id, value)
option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"
find(:xpath, option_xpath).select_option
end

Solution 7 - Ruby

Click using find_field works fine:

find_field("date").find("option[value='20120905']").click

Solution 8 - Ruby

You could also use capybara-ui which will look first to match the text, then to match the value.

# define your form widget, in this case in a role
class UserRole < Capybara::UI::Role
  form :my_form do
    select :my_select, 'my_select'
  end
end

# then just submit your form params via #submit
role = UserRole.new

role.submit :my_form, my_select: '20120905'

See more about capybara-ui forms here.

Solution 9 - Ruby

In case of not visible field, try this

find("#date", visible: false).find("option[value='20120905']").click

Or with scope as:

within '#date', visible: false do
	find("option[value='20120905']").click
end

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPaulView Question on Stackoverflow
Solution 1 - RubyrobynhendersonView Answer on Stackoverflow
Solution 2 - RubyMarkView Answer on Stackoverflow
Solution 3 - Rubyd_railView Answer on Stackoverflow
Solution 4 - RubyTrashyMcTrashView Answer on Stackoverflow
Solution 5 - RubyGeneKView Answer on Stackoverflow
Solution 6 - RubyiRetView Answer on Stackoverflow
Solution 7 - RubycageView Answer on Stackoverflow
Solution 8 - RubysteelView Answer on Stackoverflow
Solution 9 - RubySuman TiwariView Answer on Stackoverflow