2011-04-19 90 views
12

考虑下面的下拉列表来得到它的名字/标签:下拉与选择的项目,如何使用水豚

<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 

谢谢:)

回答

18

您可以使用CSS3选择器查找所选择的项目,

http://net.tutsplus.com/tutorials/html-css-techniques/the-30-css-selectors-you-must-memorize/

,并称之为 '文本' 的方法在获取文本的元素上。

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element:text

尝试:

find_field('#my-dropdown option[selected]').text 
+1

只有在某个选项元素上明确设置了“selected”属性时,此功能才有效。一个简单的方法是找到下拉列表的'selectedIndex',然后使用':nth-​​child'伪选择器来抓取当前选择的选项(这将是'selectedIndex + 1') – 2013-08-01 20:15:17

+0

我没有调试它,但'find_field'没有与水豚2.3.0。 'find('#my-dropdown option [selected]')。text' worked properly – jmgarnier 2014-11-13 20:14:25

3

如果您更喜欢使用标签,你可以链的发现:

find_field('My Dropdown').find('option[selected]').text 

的find_field的上下文中找到搜索。

+1

这只适用于默认选项,而不是输入改变时。 – 2012-04-20 10:32:30

4

当其他答案接近时,他们似乎没有与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 
0

基于由M.斯科特·福特的回答,我能够想出下面的函数(其中字段是一个ID)

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 
0

你可以试试这个! find('#MyFieldId option[selected]').text

相关问题