65

我必须为网站编写测试。我正在尝试获取下拉框的选定值。到目前为止,我可以通过这样做来获取下拉列表的内容

find_field('restrictions__rating_movies').text

返回 - 不允许电影 G PG M R13 R15 R16 R18 R RP16 允许所有电影

我可以获得所选对象的值。

find_field('restrictions__rating_movies').value

回报 - 1000

这对我没有多大帮助,因为我试图从下拉框中获取所选项目的文本。

<select class="" id="restrictions__rating_movies" name="restrictions[][rating_movies]">            
<option value="0">Don't Allow Movies</option>
<option value="100">G</option>
<option value="200">PG</option>
<option value="300">M</option>
<option value="325">R13</option>
<option value="350">R15</option>
<option value="375">R16</option>
<option value="400">R18</option>
<option value="500">R</option>
<option value="600">RP16</option>
<option value="1000" selected="selected">Allow All Movies</option></select>

在这种情况下,我需要获取值“允许所有电影”我已经尝试了上述两个示例的许多不同组合。

4

7 回答 7

163

have_select如果您将 Capybara 与 Rspec 一起使用,则会有一个匹配器:

expect(page).to have_select(
  'my-select',         # locator
  selected: 'Option 2' # option
) 
参数:

Locator (String) (默认为:nil) — 选择框的标签、名称或 id Options (Hash) using :selected(String, Array) — 应选择的选项

于 2013-09-04T20:15:47.673 回答
43
find_field('restrictions__rating_movies').find('option[selected]').text
于 2012-07-16T14:59:18.783 回答
13

获取所选选项值的非常简单的方法是:

find("#restrictions__rating_movies").value

这将返回选定的选择选项值。

于 2014-08-26T16:00:18.117 回答
4

如果您只需要断言是否使用给定选项选择了一个字段,那么简单的答案是

#Find a select box by (label) name or id and assert the given text is selected
When /^select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|    
  assert page.has_select?(dropdown, selected: selected_text)
end

来源:http ://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_select%3F-instance_method

但是你的问题的标题是"Get select value for dropdown"。而且我遇到了类似的问题,我不仅想断言选择,还想检索所选字段的文本和值。我在 API 上找不到直接的方法。我发现的最简单的方法是:#all("option").find &:selected?

When /^ select box "([^"]*)" is selected with "([^"]*)"$/ do |dropdown, selected_text|
  sb = find_field(dropdown)
  sb_selected = sb.all("option").find &:selected?
  msg = "Selected: #{sb_selected.text.inspect} - value:#{sb_selected.value.inspect}"
  assert page.has_select?(dropdown, selected: selected_text), msg
end

当断言失败时,这会给我一个更全面的错误消息。

如果有多个选择,您可以使用 #select 代替 #find,如#all("option").select &:selected?. 它将返回一个数组。

这个答案不像以前的那样依赖于'option [selected]'技巧,所以即使选择是由Javascript完成的(这就是以前的答案对我根本不起作用的原因)。

测试:

capybara (2.2.1)
capybara-webkit (1.1.0)
cucumber (1.3.14)
cucumber-rails (1.4.0)
于 2014-06-28T15:58:25.747 回答
2

如果您想查找当前选定的文本,而不假设它可能是什么,以便您可以将其与期望进行比较,即使选择是由 JS 做出的(因此没有 'option[selected]' )。

首先我找到选择的值,然后找到具有该值的选项文本:

  def selected(selector)
    value = find(selector).value
    text = find(selector).find("option[value='#{value}']").text
  end
于 2018-01-31T16:44:09.867 回答
0

创建一个简单的函数来返回给定select元素的文本(下拉菜单):

def get_dropdown_selected_item_text(dropdown)
  value = dropdown.value
  return dropdown.all(:css, "option").select {|opt| opt.value == value} .first.text
end
于 2021-04-15T23:10:11.307 回答
-1

像这样的东西会起作用吗?

within("//select[@id='restrictions__rating_movies']") do
  find_field("//option[@selected='selected']").text
end
于 2012-07-16T09:25:35.563 回答