Cách chọn tùy chọn thả xuống bằng Capybara


125

Tôi đang cố gắng chọn một mục từ menu thả xuống bằng Capybara (2.1.0).

Tôi muốn chọn theo số (có nghĩa là chọn tùy chọn thứ hai, thứ ba, v.v.).

Tôi đã googled như điên thử mọi thứ nhưng không có may mắn.

Tôi đã có thể chọn nó bằng cách sử dụng giá trị:

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

Nhưng tôi không muốn sử dụng phương pháp đó vì giá trị là thứ sẽ thay đổi và điều đó sẽ khiến bài kiểm tra của tôi trở nên dễ vỡ.

HTML cho trình đơn thả xuống là:

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

Tôi cũng đã thử điều này:

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

Nhưng nó dẫn đến lỗi này:

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

Vậy làm thế nào tôi có thể chọn tùy chọn thứ nhất, thứ hai, thứ ba, v.v. từ trình đơn thả xuống (sử dụng Capybara)?

Câu trả lời:


129

Nếu bạn xem nguồn gốc của selectphương thức , bạn có thể thấy rằng những gì nó làm khi bạn truyền một fromkhóa về cơ bản là:

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

Nói cách khác, nó tìm thấy <select>bạn quan tâm, sau đó tìm thấy <option>bên trong đó, sau đó gọi select_optionvào <option>nút.

Bạn đã thực hiện khá nhiều hai việc đầu tiên, tôi chỉ sắp xếp lại chúng. Sau đó, bạn có thể giải quyết select_optionphương thức ở cuối:

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

1
Cảm ơn rất nhiều Carol! Thực sự đánh giá cao sự giúp đỡ! : D
Farooq

2
Muốn thêm tài liệu tham khảo này cho những người nghiên cứu về điều này trong tương lai: gist.github.com/zhengjia/428105
BKSpurgeon

3
Câu trả lời chính xác! Tôi muốn thêm rằng trong Rails 5 bạn cũng có thể làm theo cách sau : select('option_name', from: 'select_box'). Trong đó các giá trị có thể là: id, name, phần tử nhãn liên quan. Bạn có thể đọc thêm về các tùy chọn Capybara và DSL tại đây .
Nesha Zoric

177

Vì một số lý do, nó không hoạt động với tôi. Vì vậy, tôi đã phải sử dụng một cái gì đó khác.

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

đã làm cho tôi.


1
Thật kỳ lạ, điều đó không hiệu quả với tôi vì phương pháp này dường như có ít nhất 3 tùy chọn. Mặc dù mã bạn đề xuất khớp với mã ví dụ từ hướng dẫn capybara.
Linus

1
nó không phải form, đó là from. Dưới đây là tài liệu về chọn
fontno

3
Có lẽ đáng chú ý giá trị từ là tên, id hoặc văn bản nhãn. tức là "# OrganizationSelect" không chính xác, nhưng "organSelect" sẽ hoạt động.
MZB

Điều này không làm việc cho tôi, nhưng giải pháp của carols10cents đã làm. Đây không phải là một lời chỉ trích câu trả lời của bạn. Tôi chỉ thấy thực sự kỳ lạ là ngay cả trên phiên bản mới nhất của capybara, một số cuộc gọi hoạt động và một số cuộc gọi không ngay cả khi sự thận trọng sẽ khiến bạn tin rằng nhiều giải pháp có vẻ hợp lệ. Nó khiến tôi như phát điên. Điều này có liên quan đến firefox (hoặc bất cứ thứ gì trình duyệt capybara kết thúc bằng cách sử dụng) không?
chaostheory

Tôi nghĩ rằng điều này sẽ chỉ hoạt động khi tên tùy chọn và giá trị tùy chọn là như nhau.
pixelearth 17/03/2017

8

tùy chọn khác là thêm một phương thức như thế này

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

Tùy chọn hữu íchfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option, đó là văn bản tùy chọn được hiển thị, hoạt động với tôi, trong khi giá trị của tùy chọn thì không.
codenoob

4

Thật không may, câu trả lời phổ biến nhất không hoàn toàn phù hợp với tôi. Tôi đã phải thêm .select_optionvào cuối tuyên bố

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

không có select_option, không có lựa chọn nào được thực hiện


Làm thế nào bạn có thể gọi .select_option, vì selectphương thức trả về giá trị boolean?
Ruby

4

Để thêm một câu trả lời khác cho đống (vì rõ ràng có rất nhiều cách thực hiện tùy thuộc vào thiết lập của bạn) - Tôi đã làm điều đó bằng cách chọn thành optionphần nghĩa đen và nhấp vào nó

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

Nó không đẹp lắm, nhưng nó hoạt động: /


2

không có câu trả lời nào phù hợp với tôi trong năm 2017 với capybara 2.7. Tôi đã nhận được "ArgumentError: sai số lượng đối số (cho 2, dự kiến ​​0)"

Nhưng điều này đã làm:

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

0

Đây không phải là câu trả lời trực tiếp, nhưng bạn có thể (nếu máy chủ của bạn cho phép):

1) Tạo mô hình cho Tổ chức của bạn; thêm: Sẽ dễ dàng hơn để điền HTML của bạn.

2) Tạo một nhà máy (FactoryGirl) cho mô hình của bạn;

3) Tạo một danh sách (create_list) với nhà máy;

4) 'chọn' (mẫu) một Tổ chức từ danh sách với:

# 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
Nếu tôi phải tạo một mô hình, không có điểm nào trong việc sử dụng capybara
user1735921

Nó hoàn toàn không phải là một câu trả lời. Đây là một câu hỏi về Capybara.
Robin Daugherty

0

Đây là cách ngắn gọn nhất mà tôi đã tìm thấy (sử dụng trình điều khiển capybara 3.3.0 và trình điều khiển crom):

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

sẽ chọn tùy chọn thứ 2. Tăng chỉ số khi cần thiết.


0

Trong Capybara bạn chỉ có thể sử dụng tìm với xpath

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

nhấp vào phương thức

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.