2012-05-29 9 views
48

मुझे पहले से ही पता चला है कि जब मैं टेक्स्ट फ़ील्ड, टेक्स्ट एरिया या पासवर्ड फ़ील्ड में मान सेट करना चाहता हूं, तो मैं fill_in something, :with => some_value में आईडी, नाम या लेबल something के रूप में उपयोग कर सकता हूं। हालांकि जब मैं <input type="hidden"> फ़ील्ड पर मान सेट करने का प्रयास करता हूं तो ऐसा दृष्टिकोण विफल हो जाता है (और मैं इसे करना चाहता हूं क्योंकि वे आम तौर पर क्लाइंट-साइड स्क्रिप्ट भरते हैं जिन्हें मैं अलग से परीक्षण करता हूं)। मैं कैपिबरा के साथ इस तरह के एक छिपे हुए क्षेत्र को कैसे सेट कर सकता हूं? क्या यह संभव है?कैपिबरा के साथ छिपे हुए क्षेत्र को कैसे भरें?

HTML:

<input id='offer_latitude' name='offer[latitude]' type='hidden'> 
<input id='offer_longitude' name='offer[longitude]' type='hidden'> 

कल्पना:

describe "posting new offer" do 
    it "should add new offer" do 
    visit '/offer/new' 
    fill_in 'offer[latitude]', :with => '11.11' 
    fill_in 'offer[longitude]', :with => '12.12' 
    click_on 'add' 
    end 
end 

देता है:

1) posting new offer should add new offer 
    Failure/Error: fill_in 'offer[latitude]', :with => '11.11' 
    Capybara::ElementNotFound: 
    cannot fill in, no text field, text area or password field with id, name, or label 'offer[latitude]' found 
+3

आम तौर पर एक व्यक्ति एक छिपे हुए क्षेत्र में भर नहीं सकता है, इसलिए कैपिबरा उन्हें भरने में सक्षम नहीं है। Https://groups.google.com/forum/ देखें? अधिक चर्चा के लिए # ग्रुप #! विषय/रूबी-कैपिबारा/एस्टलविटकिरा। लेकिन आम तौर पर आप या तो सर्वर पर इसे पॉप्युलेट करते हैं या जावास्क्रिप्ट का उपयोग करते हैं .. – Doon

+0

@ डून की टिप्पणी बहुत सच है। यदि आप छुपा इनपुट का निरीक्षण/परिवर्तन करना चाहते हैं, तो शायद आप गलत टूल का उपयोग कर रहे हैं। Capybara को विभिन्न परिदृश्यों में पूरे एप्लिकेशन का परीक्षण करने के लिए डिज़ाइन किया गया है, न कि आपके जेएस घटकों का परीक्षण न करें। चेकआउट [जैस्मीन] (http://pivotal.github.com/jasmine/) या [चाई] (http://chaijs.com/)। हालांकि ऐसी स्थितियां हैं जहां यह समझदार है, उदाहरण के लिए एचटीएमएल 5 इनपुट भरना जो असंगत ब्राउज़र में पॉलीफिल हैं। पॉलीफिल अक्सर उचित इनपुट छुपाते हैं और अतिरिक्त मार्कअप डालें। – skalee

उत्तर

72

आप छिपा क्षेत्र का पता लगाने और अपने मूल्य निर्धारित करने की आवश्यकता। जानने के कुछ तरीके हैं, यह शायद सबसे सरल

find(:xpath, "//input[@id='my_hidden_field_id']").set "my value" 

आप उत्पादन में एक client_side स्क्रिप्ट पर कार्य कर रहे हैं, तो आप सिर्फ बता सकते हैं एक जावास्क्रिप्ट अनुरूप ड्राइवर

page.execute_script("$('hidden_field_id').my_function()") 
+0

हां, XPath ने नौकरी की। आपके पास @ के पास एक टाइपो है, इसे 'ढूंढना चाहिए (: xpath, "//input[@id='my_hidden_field_id']").set" मेरा मान "' – skalee

+0

हूप्स, फिक्स्ड! धन्यवाद – DVG

+16

सीएसएस मैचर्स ने मेरे लिए ठीक काम किया और साथ ही 'ढूंढें ("# my_hidden_field")। ("मेरा मान")' – bonyiii

1

साथ इसे चलाने के लिए capybara है आप poltergeist उपयोग कर रहे हैं/एक ड्राइवर और jQuery के रूप में phantomjs फिर के लिए काम नहीं कर रहा, वहाँ हमेशा अच्छा पुराने जमाने js है:

page.execute_script("document.getElementById('#some-id').value = 'some-value'"); 
+0

केवल 'मूल्यांकन_स्क्रिप्ट' का उपयोग करें जब आप लौटाए गए मूल्य में रुचि रखते हैं (और यह कोई ऑब्जेक्ट नहीं है)। इस स्थिति में 'execute_script' बेहतर है। – skalee

+0

अच्छा जवाब, लेकिन jQuery poltergeist/phantomjs के साथ काम कर रहा है। –

+2

शायद आपकी आईडी 'कुछ-आईडी' है, न कि '# कुछ-आईडी'। – nroose

41

एक ही परिणाम प्राप्त करने के कई तरीके हैं। मुझे सबसे ज्यादा पसंद है:

first('input#id.class', visible: false).set("your value") 
+0

पहले ('इनपुट # आईडी.क्लास', दृश्यमान: झूठा) .set ('आपका मान') –

+0

धन्यवाद। मेरी प्रतिक्रिया अपडेट की गई। –

+0

काम करता है धन्यवाद! Xpath समाधान से पढ़ने के लिए यह आसान लगता है। –