Capybara का उपयोग करके ड्रॉप डाउन में विकल्प का चयन कैसे करें


125

मैं Capybara (2.1.0) का उपयोग करके ड्रॉप डाउन मेनू से एक आइटम का चयन करने का प्रयास कर रहा हूं।

मैं नंबर से चयन करना चाहता हूं (मतलब दूसरा, तीसरा, आदि विकल्प चुनें)।

मैं पागलों की तरह हर तरह की कोशिश कर रहा हूँ, लेकिन कोई किस्मत नहीं।

मैं मूल्य का उपयोग करके इसे चुनने में सक्षम था:

 find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click

लेकिन मैं उस पद्धति का उपयोग नहीं करना चाहता b / c मान कुछ ऐसा है जो बदल जाएगा और जो मेरे परीक्षण को भंगुर बना देगा।

ड्रॉप डाउन के लिए HTML है:

<td class="value">
    <select name="organizationSelect" id="organizationSelect" class="required">
     <option value="NULL">Choose...</option>
     <option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8">&nbsp;Institution1</option>
     <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;Institution / test</option>
    </select>
</td>

मैंने भी यह कोशिश की:

  option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text  
  select(option, :from => organizationSelect)

लेकिन यह इस त्रुटि का परिणाम है:

Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous)

तो मैं ड्रॉप डाउन (Capbbara का उपयोग करके) से पहला, दूसरा, तीसरा आदि विकल्प कैसे चुन सकता हूं?

जवाबों:


129

यदि आप विधि के स्रोतselect पर एक नज़र डालते हैं , तो आप देख सकते हैं कि जब आप एक fromकुंजी को पास करते हैं तो यह अनिवार्य रूप से क्या करता है:

find(:select, from, options).find(:option, value, options).select_option

दूसरे शब्दों में, यह <select>आप में रुचि रखते हैं, तो उस के <option>भीतर पाता है, फिर नोड select_optionपर कॉल करता <option>है।

आप पहले से ही बहुत पहले दो चीजें कर चुके हैं, मैं उन्हें फिर से व्यवस्थित करूंगा। तो फिर तुम select_optionअंत में विधि से निपट सकते हो:

find('#organizationSelect').find(:xpath, 'option[2]').select_option

1
बहुत बहुत धन्यवाद कैरोल! वास्तव में मदद की सराहना! : डी
फारूक

2
भविष्य में इस पर शोध करने वालों के लिए इस संदर्भ को जोड़ना चाहेंगे: gist.github.com/zhengjia/428105
BKSpurgeon

3
बहुत बढ़िया जवाब! मैं जोड़ने के लिए है कि रेल 5 में आप के रूप में अच्छी निम्नलिखित तरीके से यह कर सकते हैं करना चाहते हैं: select('option_name', from: 'select_box')। जहां मान हो सकते हैं: आईडी, नाम, संबंधित लेबल तत्व। आप यहां Capybara और DSL विकल्पों के बारे में अधिक पढ़ सकते हैं ।
नीशा ज़ोरिक

178

किसी कारण से यह मेरे लिए काम नहीं किया। इसलिए मुझे कुछ और इस्तेमाल करना पड़ा।

select "option_name_here", :from => "organizationSelect"

मेरे लिए काम किया।


1
अजीब है, कि मेरे लिए काम नहीं करता है क्योंकि विधि कम से कम 3 विकल्प लेने लगती है। हालाँकि आपने जो कोड सुझाया था वह कैपिबारा गाइड के उदाहरण कोड से मेल खाता है।
लाइनस

1
यह नहीं है form, यह है from। यहाँ चयनित दस्तावेज है
फॉन्ट्नो

3
शायद मूल्य से ध्यान देने योग्य नाम, आईडी या लेबल पाठ है। यानी "#ऑर्गनाइजेशन सेलेक्ट" गलत है, लेकिन "ऑर्गनाइजेशन सेलेक्ट" को काम करना चाहिए।
MZB

यह मेरे लिए काम नहीं किया, लेकिन carols10cents समाधान किया। यह आपके उत्तर का आलोचक नहीं है। मुझे यह वास्तव में बहुत अजीब लगता है कि कैपिबारा के नवीनतम संस्करण पर भी, कुछ कॉल काम करते हैं और कुछ कॉल तब भी नहीं होते हैं जब इंट्यूशन आपको विश्वास दिलाता है कि कई समाधान मान्य हैं। यह मुझे पागल कर रहा है। क्या यह फ़ायरफ़ॉक्स (या जो भी ब्राउज़र capybara का उपयोग करके समाप्त होता है) से संबंधित है?
चॉस्टोरी

मुझे लगता है कि यह केवल तभी काम करेगा जब विकल्प का नाम और विकल्प मूल्य समान हों।
पिक्सेलअर्थ

8

एक अन्य विकल्प इस तरह से एक विधि जोड़ना है

  def select_option(css_selector, value)
    find(:css, css_selector).find(:option, value).select_option
  end

मददगार विकल्पfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
Pixearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option, जो प्रदर्शित विकल्प पाठ है, मेरे लिए काम किया, जबकि विकल्प का मूल्य नहीं था।
कोडेनोब

4

दुर्भाग्य से, सबसे लोकप्रिय जवाब मेरे लिए पूरी तरह से काम नहीं किया। मुझे .select_optionबयान के अंत में जोड़ना था

select("option_name_here", from: "organizationSelect").select_option

इसके बिना select_option, कोई भी प्रदर्शन नहीं किया जा रहा था


कैसे आप कॉल कर सकते हैं .select_option, क्योंकि selectविधि एक बूलियन मान लौटाता है?
रूबी

4

ढेर पर एक और जवाब जोड़ने के लिए (क्योंकि जाहिरा तौर पर आपके सेटअप के आधार पर इसे करने के कई तरीके हैं) - मैंने इसे शाब्दिक optionतत्व का चयन करके और इसे क्लिक करके किया था

find(".some-selector-for-dropdown option[value='1234']").select_option

यह बहुत सुंदर नहीं है, लेकिन यह काम करता है: /


2

2017 में कैपिबारा 2.7 के साथ मेरे लिए जवाब में से किसी ने भी काम नहीं किया। मुझे "तर्क-वितर्क: गलत तर्क की संख्या (दिए गए 2, अपेक्षित 0)"

लेकिन यह किया:

find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option

0

यह एक सीधा जवाब नहीं है, लेकिन आप (यदि आपका सर्वर परमिट है):

1) अपने संगठन के लिए एक मॉडल बनाएं; अतिरिक्त: आपके HTML को पॉप्युलेट करना आसान होगा।

2) अपने मॉडल के लिए एक कारखाना (FactoryGirl) बनाएं;

3) कारखाने के साथ एक सूची (create_list) बनाएं;

4) 'पिक' (नमूना) सूची से एक संगठन:

# Random select
option = Organization.all.sample 

# Select the FIRST(0) by id
option = Organization.all[0] 

# Select the SECOND(1) after some restriction
option = Organization.where(some_attr: some_value)[2]
option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on... 

4
अगर मुझे एक मॉडल बनाना है, तो capybara का उपयोग करने का कोई मतलब नहीं है
user1735921

इसका जवाब नहीं है। यह कैपिबारा के बारे में एक सवाल है।
रॉबिन डॉगी

0

यहां मैंने जो सबसे संक्षिप्त तरीका पाया है (काप्यबारा 3.3.0 और क्रोमियम ड्राइवर का उपयोग करके):

all('#id-of-select option')[1].select_option

दूसरा विकल्प चुनेंगे। सूचकांक को आवश्यकतानुसार बढ़ाएँ।


0

Capybara में आप केवल xpath के साथ पा सकते हैं

find(:xpath, "//*[@id='organizationSelect']/option[2]").click

और विधि क्लिक करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.