выпадающий список с выбранным элементом, как получить его имя / метку с помощью capybara
учитывая следующее меню:
<select id="my-dropdown" name="my-dropdown">
<option value="1">Peter</option>
<option value="2" selected>Pan</option>
</select>
Я знаю, что могу получить значение (2 здесь) текущего выбора, используя этот код:
find_field("#my-dropdown").value
но как я могу получить имя/ надпись (Здесь Пан) текущего выбора? Следующий код не работы:
find_field("#my-dropdown").label
спасибо :)
5 ответов
вы можете использовать селекторы css3 для поиска выбранного элемента,
http://net.tutsplus.com/tutorials/html-css-techniques/the-30-css-selectors-you-must-memorize/
и вызовите метод "text" для элемента, чтобы получить текст.
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element:text
попробуй:
find_field('#my-dropdown option[selected]').text
в то время как другие ответы были близки, они, похоже, не работали с Capybara 1.1.2 (версия, которую я использую). С этой версией я обнаружил, что следующий подход работал, но только потому, что я знал, каким должно быть значение.
#based on Capybara::Node::Actions#select
def find_select_option(select_finder, option_finder)
no_select_msg = "cannot select option, no select box with id, name, or label '#{select_finder}' found"
no_option_msg = "cannot select option, no option with text '#{option_finder}' in select box '#{select_finder}'"
select = find(:xpath, XPath::HTML.select(select_finder), :message => no_select_msg)
select.find(:xpath, XPath::HTML.option(option_finder), :message => no_option_msg)
end
find_select_option('Countries', 'United States').should be_selected
Если вы предпочитаете использовать метки, Вы можете связать поиск:
find_field('My Dropdown').find('option[selected]').text
поиск выполняется в контексте поля find_field.
основываясь на ответе М. Скотта Форда, я смог придумать следующую функцию (где поле является идентификатором)
def field_should_have_value(field, value)
element = @session.find_field(field)
if !element
throw "field_should_have_value(#{field}, #{value}) - unable to fine field: #{field}"
end
# Question: is there any other way of doing: if element[:nodeName] == "select"
option = element.has_selector?("option") && element.find(:xpath, XPath::HTML.option(value))
if option
if element.value != value && option.text != value
throw "field_should_have_value(#{field}, #{value}) - value does not match. Expected: #{value}. Got element.value: #{element.value} || option.text: #{option.text}"
end
elsif element.value != value
throw "field_should_have_value(#{field}, #{value}) - value does not match. Expected: #{value}. Got element.option.text: #{option.text}"
end
end