2013-02-21 16 views
5

Chciałbym umieścić opcje listy rozwijanej w tablicy ogólnie w kapibarze. Po tym procesie oczekuję, że będę mieć tablicę ciągów, zawierającą wszystkie opcje rozwijania. Próbowałem kodu poniżej, ale długość mojej tablicy pozostaje 1 niezależnie od tego, co jest licznik opcji.Pisanie kapibara z opcjami do tablicy

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

Odpowiedz

21

Problemem jest to, że all('#MainContent_dd') powraca wszystkie elementy, które mają identyfikator MainContent_dd. Zakładając, że jest to twoje menu rozwijane, a identyfikatory są unikalne, oczekuje się, że periods.length ma wartość 1 (tj. periods jest listą wyboru).

Co chcesz zrobić, to uzyskać elementy option zamiast elementu .

Zakładając, że HTML jest:

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

Następnie można zrobić:

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

Co to robi to:

  1. find('#MainContent_dd') - Znajduje listy select, który chcesz dostać opcje od
  2. all('option') - G ETS wszystkie elementy opcji w liście select
  3. collect(&:text) - Zbiera tekst każdej opcji i zwraca go jako tablica
+0

działa jak czar :) Thanks Justin będzie miał więcej te noob pytania :) –

+0

Może to mieć problemy z wydajnością –

2

@ odpowiedź JustinCo zawiera problem, jeśli używany sterownik nie jest szybki: Kapibara złoży zapytanie do sterownika dla każdej inwokacji text. Więc jeśli select zawiera 200 elementów, Capybara zrobi 201 zapytanie do przeglądarki zamiast 1, które może być wolne.

Proponuję zrobić to za pomocą jednego zapytania z javascript:

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

lub (krótszy wariant z jQuery):

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