Получить выбранное значение выпадающего списка для тестирования капибар


Я должен писать тесты для веб-сайта. Я пытаюсь получить выбранное значение из выпадающего списка. До сих пор я могу получить содержимое выпадающего делать

find_field('restrictions__rating_movies').text

возвращает - Не разрешать фильмы Г ПГ М R13 с R15 R16 R18 Р 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>

в этом случае показано, что мне нужно получить значение "разрешить все фильмы" я пробовал много различных комбинаций из двух приведенных выше примеров.

6   51  

6 ответов:

здесь have_select matcher если вы используете капибару с Rspec:

expect(page).to have_select('my-select', selected: 'Option 2')
find_field('restrictions__rating_movies').find('option[selected]').text

очень простой способ получить значение выбранного параметра:

find("#restrictions__rating_movies").value

это вернет выбранное значение параметра select.

Если вам нужно только утверждать, что поле выбрано с заданной опцией, прямой ответ

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

Если вы хотите найти текущий выделенный текст, не предполагая, что это может быть, так что вы можете просто сравнить его с ожиданием, следующее работает, даже если выбор был сделан JS (так что нет 'option[selected]').

сначала я нахожу значение select, затем я нахожу текст опции с этим значением:

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

будет ли что-то вроде этого работать?

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