获取水豚测试下拉列表的选择值

时间:2012-07-16 05:33:54

标签: ruby-on-rails rspec capybara

我必须为网站编写测试。我试图获取下拉框的选定值。到目前为止,我可以通过

获取下拉列表的内容
find_field('restrictions__rating_movies').text

返回 - 不要让电影 G PG 中号 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>

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

7 个答案:

答案 0 :(得分:148)

如果你将Capybara与Rspec一起使用,那就有一个have_select匹配器:

expect(page).to have_select('my-select', selected: 'Option 2')

答案 1 :(得分:39)

find_field('restrictions__rating_movies').find('option[selected]').text

答案 2 :(得分:13)

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

find("#restrictions__rating_movies").value

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

答案 3 :(得分:3)

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

#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

但您问题的标题是&#34;获取下拉菜单的选择值&#34; 。 而且我遇到了类似的问题,我不仅要断言选择,还要检索所选字段的文本和值。我在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?一样。它将返回一个数组。

这个答案并不依赖于[选择]&#39;选项。与之前的技巧相同,所以即使选择是通过Javascript完成的(这也是之前的答案对我来说根本不起作用的原因),它也能正常工作。

经过测试:

capybara (2.2.1)
capybara-webkit (1.1.0)
cucumber (1.3.14)
cucumber-rails (1.4.0)

答案 4 :(得分:1)

如果你想找到当前选中的文本,而不是假设它可能是什么,以便你可以将它与期望进行比较,即使选择是由JS做出的,所以下面也可以工作(这样就没有'选项[选择]')。

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

  def selected(selector)
    value = find(selector).value
    text = find(selector).find("option[value='#{value}']").text
  end

答案 5 :(得分: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

答案 6 :(得分:-1)

这样的事情会起作用吗?

within("//select[@id='restrictions__rating_movies']") do
  find_field("//option[@selected='selected']").text
end
相关问题