Reputation: 1208
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
Upvotes: 72
Views: 48286
Reputation: 31
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
Upvotes: 0
Reputation: 31
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
Upvotes: 3
Reputation: 61
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
Upvotes: 1
Reputation: 12520
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.
Upvotes: 0
Reputation: 103
Click using find_field works fine:
find_field("date").find("option[value='20120905']").click
Upvotes: 0
Reputation: 4119
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
Upvotes: 21
Reputation: 1068
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
Upvotes: 44
Reputation: 1368
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
Upvotes: 77
Reputation: 1292
You can also achieve it by doing the following:
find_by_id('date').find("option[value='20120905']").click
Upvotes: 4