68

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

没关系。

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

谢谢

4

9 回答 9

76

这将用于按值选择选项:

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

为了保持选择器的范围,您可以将其包装在一个内块中,如下所示:

within '#date' do
  find("option[value='20120905']").click
end
于 2012-09-10T19:58:51.717 回答
40

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

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

于 2013-03-12T07:40:49.603 回答
21

我写了一个辅助方法:

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
于 2013-04-04T20:39:17.010 回答
4

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

find_by_id('date').find("option[value='20120905']").click
于 2013-02-27T14:27:46.063 回答
3

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

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
于 2014-09-24T21:35:56.017 回答
1

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

def select_by_value(id, value)
  option_xpath = "//*[@id='#{id}']/option[@value='#{value}']"
  find(:xpath, option_xpath).select_option
结尾
于 2016-02-05T16:37:01.440 回答
0

单击使用 find_field 可以正常工作:

find_field("date").find("option[value='20120905']").click
于 2014-09-10T10:56:15.007 回答
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 表单的更多信息。

于 2016-01-22T16:22:53.703 回答
0

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

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

或范围为:

within '#date', visible: false do
    find("option[value='20120905']").click
end
于 2021-07-02T05:30:20.093 回答