Получить выбранное значение выпадающего списка для тестирования капибар
Я должен писать тесты для веб-сайта. Я пытаюсь получить выбранное значение из выпадающего списка. До сих пор я могу получить содержимое выпадающего делать
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 ответов:
здесь
have_select
matcher если вы используете капибару с Rspec:expect(page).to have_select('my-select', selected: 'Option 2')
очень простой способ получить значение выбранного параметра:
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
но название вашего вопроса "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