2013-02-21 12 views
5

में ग्रंथों को लिखना है, मैं कैपिबरा में सामान्य रूप से एक सरणी में ड्रॉपडाउन सूची के विकल्प डालना चाहता हूं। प्रक्रिया के बाद मुझे स्ट्रिंग्स का एक एरे होने की उम्मीद है, जिसमें सभी ड्रॉपडाउन विकल्प शामिल हैं। मैंने नीचे दिए गए कोड को आजमाया है लेकिन मेरी सरणी की लंबाई 1 रहता है चाहे विकल्प गिनती क्या हो।कैपिबरा लिखना ड्रॉप डाउन के विकल्प एक सरणी

periods = Array.new() 
periods = all('#MainContent_dd') 
print periods.length 

उत्तर

21

समस्या यह है कि all('#MainContent_dd') रिटर्न सभी तत्वों आईडी MainContent_dd है। मान लीजिए कि आपका ड्रॉपडाउन और आईडी अद्वितीय हैं, यह उम्मीद है कि periods.length 1 है (यानी periods चुनिंदा सूची है)।

आप क्या करना चाहते हैं select तत्व के बजाय option तत्व प्राप्त करें।

अपने html मानते हुए है:

<select id="MainContent_dd"> 
    <option>Option A</option> 
    <option>Option B</option> 
    <option>Option C</option> 
</select> 

तो फिर तुम कर सकते हैं:

periods = find('#MainContent_dd').all('option').collect(&:text) 
    p periods.length 
    #=> 3 
    p periods 
    #=> ["Option A", "Option B", "Option C"] 

क्या करता है:

  1. find('#MainContent_dd') - चयन सूची आप प्राप्त करना चाहते हैं कि ढूँढता है
  2. all('option') - जी के विकल्प ETS चयन सूची
  3. collect(&:text) के भीतर सभी विकल्प तत्वों - प्रत्येक विकल्प के पाठ एकत्र और एक सरणी
+0

वर्क्स एक आकर्षण की तरह :) धन्यवाद जस्टिन, के और अधिक करना होगा इन नोब सवालों :) –

+0

इसमें प्रदर्शन के साथ समस्या हो सकती है –

2

@ JustinCo का जवाब एक समस्या है, तो इस्तेमाल किया ड्राइवर तेजी से नहीं है के रूप में यह रिटर्न: गेम Capybara एक प्रश्न कर देगा text के प्रत्येक आमंत्रण के लिए ड्राइवर को। इसलिए यदि चयन में 200 तत्व हैं, तो कैपिबरा 201 की क्वेरी को ब्राउज़र के लिए 1 की बजाय करेगा जो धीमा हो सकता है।

मैं सुझाव है कि आप जावास्क्रिप्ट के साथ एक क्वेरी का उपयोग कर यह करने के लिए:

periods = page.execute_script("options = document.querySelectorAll('#MainContent_dd > option'); texts=[]; for (i=0; i<options.length; i++) texts.push(options[i].textContent); return texts") 

या (jQuery के साथ कम विविधता):

periods = page.evaluate_script("$('#MainContent_dd').map(function() { return $(this).text() }).get()") 
संबंधित मुद्दे