2013-02-21 27 views
5

Tôi muốn đặt các tùy chọn danh sách thả xuống vào một mảng chung trong capybara. Sau quá trình tôi mong đợi có một chuỗi các chuỗi, chứa tất cả các tùy chọn thả xuống. Tôi đã thử các mã dưới đây nhưng chiều dài của mảng của tôi vẫn 1 bất kể số lượng tùy chọn là gì.Tùy chọn thả xuống văn bản của Capybara văn bản thành một mảng

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

Trả lời

21

Vấn đề là all('#MainContent_dd') trả về tất cả các thành phần có id MainContent_dd. Giả sử đây là danh sách thả xuống và id của bạn là duy nhất, được mong đợi là periods.length là 1 (ví dụ: periods là danh sách chọn).

Điều bạn muốn làm là lấy các phần tử option thay vì phần tử select.

Giả sử html của bạn là:

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

Sau đó, bạn có thể làm:

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

Điều này không là:

  1. find('#MainContent_dd') - Tìm danh sách lựa chọn mà bạn muốn để có được các tùy chọn từ
  2. all('option') - G ETS tất cả các yếu tố lựa chọn trong danh sách lựa chọn
  3. collect(&:text) - Thu thập các văn bản của mỗi lựa chọn và trả về nó như một mảng
+0

trình như một say mê :) Cảm ơn Justin, sẽ có nhiều hơn những câu hỏi noob này :) –

+0

Có thể có vấn đề với hiệu suất –

2

@ câu trả lời JustinCo của có một vấn đề nếu người lái xe sử dụng không nhanh: Capybara sẽ thực hiện một truy vấn để lái xe cho mọi yêu cầu của text. Vì vậy, nếu chọn có chứa 200 phần tử, Capybara sẽ thực hiện 201 truy vấn tới trình duyệt thay vì 1 truy vấn có thể chậm.

tôi đề nghị bạn để làm điều đó bằng một truy vấn với 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") 

hoặc (biến thể ngắn hơn với jQuery):

periods = page.evaluate_script("$('#MainContent_dd').map(function() { return $(this).text() }).get()") 
Các vấn đề liên quan