Як вибрати варіант у спадному меню за допомогою Capybara


125

Я намагаюся вибрати пункт із випадаючого меню за допомогою Capybara (2.1.0).

Я хочу вибрати за номером (тобто вибрати другий, третій варіант тощо).

Я гугла, як божевільний, пробуючи всілякі речі, але не пощастило.

Я зміг вибрати його за допомогою значення:

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

Але я не хочу використовувати цей метод b / c, значення має щось, що зміниться, і це зробить мій тест крихким.

HTML для спадного меню:

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

Я також спробував це:

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

Але це призводить до цієї помилки:

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

Тож як я можу вибрати перший, другий, третій і т.д. варіант зі спадного меню (використовуючи Capybara)?

Відповіді:


129

Якщо ви подивитесь на джерело selectметоду , ви можете бачити, що те, що він робить при передачі fromключа, є по суті:

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

Іншими словами, він знаходить <select>вас цікавить, то знаходить <option>в тому, що потім викликає select_optionна <option>вузлі.

Ви вже майже зробили перші дві речі, я б просто їх переставити. Потім ви можете застосувати select_optionметод в кінці:

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

1
Велике спасибі Керол! Дуже цінуй допомогу! : D
Farooq


3
Чудова відповідь! Я хотів би додати , що в Rails 5 ви можете зробити це в такий спосіб , а також: select('option_name', from: 'select_box'). Де значення можуть бути: id, ім'я, пов'язаний елемент мітки. Більше про параметри Capybara та DSL ви можете прочитати тут .
Неша Зорич

177

Чомусь у мене це не вийшло. Тому мені довелося скористатися чимось іншим.

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

працював на мене.


1
Дивно, що для мене це не працює, оскільки метод, здається, має щонайменше 3 варіанти. Хоча запропонований вами код відповідає прикладу коду з посібника по капібарі.
Лінус

1
це не так form, це є from. Ось документація на вибір
fontno

3
Можливо, варто відзначити значення зі значенням імені, ідентифікатора чи тексту мітки. тобто "#organizationSelect" невірно, але "organizationSelect" має працювати.
MZB

Це не спрацювало для мене, але рішення carols10cents зробило. Це не є критикою вашої відповіді. Мені просто дивно, що навіть в останній версії capybara деякі дзвінки працюють, а деякі дзвінки навіть тоді, коли інтуїція приведе вас до думки, що численні рішення виглядають дійсними. Це зводить мене з розуму. Чи пов’язано це з Firefox (або з будь-яким іншим браузерним браузером)?
хаостерія

Я думаю, що це спрацює лише тоді, коли ім'я опції та значення параметра однакові.
пікселеарт

8

інший варіант - додати такий метод

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

Корисні варіантиfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option, який є відображеним текстом опції, працював для мене, тоді як значення параметра не було.
codenoob

4

На жаль, найпопулярніша відповідь не працювала для мене цілком. Мені довелося додати .select_optionдо кінця висловлювання

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

без цього select_optionвибір не виконувався


Чому ви можете зателефонувати .select_option, оскільки selectметод повертає булеве значення?
Рубі

4

Щоб додати ще одну відповідь до палі (оскільки, мабуть, існує так багато способів зробити це залежно від вашої установки) - я це зробив, вибравши буквальний optionелемент і клацнувши його

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

Це не дуже красиво, але це працює: /


2

жодна з відповідей не працювала для мене у 2017 році з capybara 2.7. Я отримав "ArgumentError: неправильна кількість аргументів (дано 2, очікується 0)"

Але це зробило:

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

0

Це не пряма відповідь, але ви можете (якщо ваш сервер дозволяє):

1) Створіть модель для вашої організації; додатково: простіше буде заповнити свій HTML.

2) Створіть фабрику (FactoryGirl) для вашої моделі;

3) Створіть список (create_list) з фабрикою;

4) "Вибрати" (зразок) Організації зі списку з:

# 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
якщо мені доведеться створити модель, немає сенсу використовувати capybara
user1735921

Це зовсім не відповідь. Це питання про Капібару.
Робін Догерті

0

Ось найкоротший спосіб, який я знайшов (використовуючи capybara 3.3.0 та драйвер хрому):

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

вибере 2-й варіант. Збільшити індекс за потребою.


0

У Capybara ви можете використовувати лише знахідку з xpath

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

та метод клацання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.