2013-02-21 16 views
5

Bir açılan liste seçeneklerini genel olarak capibara bir dizi içine koymak istiyorum. İşlemden sonra tüm açılan seçenekleri içeren bir dizi arrray olmasını bekliyorum. Aşağıdaki kodu denedim ancak dizi sayımın ne olduğuna bakmaksızın dizimin uzunluğu 1 kalır.Capybara yazı yazma seçenekleri bir dizi içine metinleri düzenleme

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

cevap

21

sorun olduğunu all('#MainContent_dd') döner kimliği MainContent_dd olan tüm unsurları. Bunun sizin açılır ve kimliğiniz benzersiz olduğunu varsayarak, periods.length'un 1 olması beklenir (yani, periods seçim listesidir).

Yapmak istediğiniz, select öğesi yerine option öğelerini almanızdır. Html'nizi varsayarsak

geçerli:

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

Yapabileceğiniz:

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

ne yapar geçerli:

  1. find('#MainContent_dd') - sen almak istiyorum seçim listesini bulur
  2. all('option') - G arasındaki seçenekler ets Seçim listesinde
  3. collect(&:text) içindeki tüm seçenek elemanları - Her seçeneğin metni toplar ve kullanılan sürücü hızlı değil ise JustinCo cevabı bir sorunu var @
+0

İşleri :) Teşekkür Justin,:

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") 

veya (jQuery ile kısa varyantı):

Sana bir JavaScript ile sorgu kullanarak bunu yapmak için önermek bu noob soruları :) –

+0

Performansla ilgili sorun yaşayabilir –

2

bir dizi olarak döndürür: Capybara bir sorgu yapacak text'un her çağrısı için sürücüye. Bu yüzden eğer seçim 200 unsur içeriyorsa, Capybara yavaşça 1 yerine tarayıcıya 201 sorgu yapar. daha olacak bir cazibe gibi

periods = page.evaluate_script("$('#MainContent_dd').map(function() { return $(this).text() }).get()") 
İlgili konular