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

Ruby on rails 获取水豚测试下拉列表的选择值,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我必须为网站编写测试。我正在尝试获取下拉框的选定值。到目前为止,我可以通过 find_field('restrictions__rating_movies').text 报税表- 不允许看电影 G PG M R13 R15 R16 R18 R RP16 允许所有电影 我可以得到所选对象的值 find_field('restrictions__rating_movies').value 返回- 一千 但这对我帮助不大,因为我试图从下拉框中获取所选项目的文本 <select class="

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

find_field('restrictions__rating_movies').text
报税表- 不允许看电影 G PG M R13 R15 R16 R18 R RP16 允许所有电影

我可以得到所选对象的值

find_field('restrictions__rating_movies').value
返回- 一千

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

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

在本例中,我需要获得“允许所有电影”的值。我尝试了以上两个示例的许多不同组合。

是否需要此工作

within("//select[@id='restrictions__rating_movies']") do
  find_field("//option[@selected='selected']").text
end
如果您将水豚与Rspec一起使用,则有一个匹配器:

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

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

#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
资料来源:

但您的问题的标题是Get select value for dropdown。 我遇到了一个类似的问题,我不仅要断言所选内容,还要检索所选字段的文本和值。我在API上找不到捷径。我找到的最简单的方法是:alloption.find&:selected

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

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

这个答案不像前面的答案那样依赖于“option[selected]”技巧,因此即使选择是由Javascript完成的,它也能工作,这就是为什么前面的答案对我根本不起作用的原因

测试日期:

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

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

find("#restrictions__rating_movies").value

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

如果您想查找当前选定的文本,而不假设它可能是什么,这样您就可以将它与期望值进行比较,那么即使JS进行了选择,因此没有“option[selected]”选项,下面的操作仍然有效

首先查找select的值,然后查找具有该值的选项文本:

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

创建一个简单函数,以返回给定select元素下拉列表的文本:

def get_dropdown_selected_item_text(dropdown)
  value = dropdown.value
  return dropdown.all(:css, "option").select {|opt| opt.value == value} .first.text
end

那是行不通的。以下是错误Selenium::WebDriver::error::InvalidSelectorError:给定的选择器。///select[@id='restrictions\uu rating\u movies']无效或未生成WebElement。出现以下错误:[InvalidSelectorError]无法找到具有xpath表达式的元素。///select[@id='restrictions\uu rating\u movies'],原因是以下错误:[异常…表达式不是合法表达式。查找//选择选项[@selected='selected']如何那么?我认为您需要传递xpath说明符,例如,`within:xpath,'blah blah'轻微的变化,我更喜欢find_field'restrictions.\u rating_movies'。应该有_content'required string'@AshBlue,以确保“required string”包含在下拉列表的选项中,而不是确保它实际上被选中。如果选项的选择被取消在javascript中,find'option[selected]'可能不起作用。在这种情况下,可能可以使用水豚的selected?方法:find'restrictions\u rating\u movies。find:xpath,./option[contains.,'Starwars']。selected?我接受了@Leslongtingill的想法,最后做了:findselect\u name option[value='something']。应选择如果您使用Javascript设置select的值,此方法将不起作用。如果是这种情况,您希望使用has_select?和has_no_select?方法和所选选项。请参阅。在尝试了许多变体后,这是一个对我有效的方法。我最终执行了以下操作:findselectmy-select.value.should eq'test_value'。我喜欢你的方法,因为对我来说,它更简单、更容易阅读——这意味着我更有可能记住它在做什么,并记住以后如何再做。谢谢!+1这似乎最自然地符合RSpec expect语法expectfindselectmy-select.value。对于eq“test_value”,这也是适用于大多数驱动程序的唯一选项nium,poltergeist,Webkitt这是我最喜欢的可读性答案,你可以在没有不必要的抽象的情况下准确地看到正在发生的事情。这个答案对我不起作用。我得到ArgumentError异常:无效键:已选择,可能已弃用?。来自@brandon的已接受答案是。也许你正在使用旧版本的gem?sou水豚的rce代码显示了以下用法:未来探险家的小提示:在本例中,“我的选择”是选择的名称。可能很清楚,但我一直尝试使用类标记:Passert页面。是否选择?“我的选择”,选择:“选项2”,如果列表上有很多选项时minitest而不是rspecThis have_select非常慢。I必须使用find_fieldname.value使断言更快完成。
  def selected(selector)
    value = find(selector).value
    text = find(selector).find("option[value='#{value}']").text
  end
def get_dropdown_selected_item_text(dropdown)
  value = dropdown.value
  return dropdown.all(:css, "option").select {|opt| opt.value == value} .first.text
end