水豚:按值选择一个选项而不是文本

时间:2012-09-04 14:03:06

标签: ruby capybara

对于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>

我有以下的Capybara Ruby代码:

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

但是这个错误与:

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

然而,如果我这样做

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

没关系。

是否可以通过而不是文本在Capybara中选择一个选项?

由于

9 个答案:

答案 0 :(得分:69)

这将按值选择一个选项:

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

要维护选择器的范围,可以将其包装在内部块中:

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

答案 1 :(得分:39)

使用Poltergeist作为驱动程序我无法点击上面某些其他选项中建议的选项,而是可以执行以下操作:

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

答案 2 :(得分:19)

我写了一个辅助方法:

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

保存在 spec / support /

中的.rb文件中

使用示例:

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

答案 3 :(得分:4)

您还可以通过执行以下操作来实现它:

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

答案 4 :(得分:2)

那个辅助方法非常聪明。我会稍微改变一下:

def select_by_value(id, value)

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

  find(:xpath, option_xpath).click

end

或只是:

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

答案 5 :(得分:1)

在我的情况下,我有几个相同文本的选项,这就是我需要按值选择的原因。结合几个答案,我找到了最适合我的解决方案:

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

答案 6 :(得分:0)

点击使用find_field正常工作:

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

答案 7 :(得分:0)

您还可以使用capybara-ui首先匹配文字,然后匹配该值。

# 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'

详细了解capybara-ui表格here

答案 8 :(得分:0)

如果字段不可见,试试这个

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

或范围为:

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