2011-04-19 8 views
12

निम्नलिखित लटकती को देखते हुए का उपयोग कर अपने नाम/लेबल पाने के लिए:लटकती, कैसे 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 

धन्यवाद :)

उत्तर

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

यह केवल तभी काम करेगा जब "चयनित" विशेषता स्पष्ट रूप से विकल्प तत्वों में से एक पर सेट हो। ऐसा करने का एक मूर्ख तरीका यह है कि ड्रॉपडाउन के 'चयनित इंडेक्स' को ढूंढना होगा और फिर वर्तमान में चुने गए विकल्प को पकड़ने के लिए ': nth-child' छद्म चयनकर्ता का उपयोग करना होगा (जिसे 'चयनित इंडेक्स + 1'' होगा –

+0

मैंने नहीं किया इसे डीबग करें लेकिन 'find_field' capybara 2.3.0 के साथ काम नहीं किया। 'ढूंढें ('# मेरा ड्रॉपडाउन विकल्प [चयनित]')। पाठ' ठीक काम करता है – jmgarnier

3

आप उपयोग कर पसंद करते हैं लेबल आप श्रृंखला एक पा सकते हैं:

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

find_field के संदर्भ में खोज खोज करता है।

+1

यह केवल डिफ़ॉल्ट विकल्पों के लिए काम करता है, इनपुट इनपुट में नहीं। –

4

जबकि अन्य उत्तर बंद हो गए, वे कैपिबरा 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

एम स्कॉट फोर्ड द्वारा जवाब मैं निम्नलिखित समारोह (जहां क्षेत्र एक आईडी है) के साथ आने में सक्षम था

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