Подтвердить что ты не робот

Как выбрать опцию при выпадении с помощью Capybara

Я пытаюсь выбрать элемент из выпадающего меню с помощью Capybara (2.1.0).

Я хочу выбрать по номеру (что означает выбор второй, третьей и т.д.).

У меня Googled как сумасшедший, пытающийся всевозможные вещи, но не повезло.

Мне удалось выбрать его, используя значение:

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

4b9b3361

Ответ 1

Если вы посмотрите источник метода select, вы увидите, что он делает, когда вы передаете from по существу:

find(:select, from, options).find(:option, value, options).select_option
Другими словами, он находит интересующий вас <select>, затем находит <option> внутри него, затем вызывает select_option на <option> node.

Вы уже в значительной степени выполнили первые две вещи, я просто перестроил их. Затем вы можете применить метод select_option в конце:

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

Ответ 2

По какой-то причине это не сработало для меня. Поэтому мне пришлось использовать что-то еще.

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

работал на меня.

Ответ 3

другой вариант заключается в добавлении метода, подобного этому

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

Ответ 4

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

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

без select_option, выбор не выполнялся

Ответ 5

Чтобы добавить еще один ответ в кучу (потому что, по-видимому, есть много способов сделать это в зависимости от вашей настройки) - я сделал это, выбрав элемент буквального option и щелкнув его

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

Это не очень красиво, но это работает:/

Ответ 6

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

Но это сделал:

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

Ответ 7

Это не прямой ответ, но вы можете (если ваш сервер разрешить):

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

2) Создайте factory (FactoryGirl) для вашей модели;

3) Создайте список (create_list) с помощью factory;

4) 'pick' (sample) a Организация из списка:

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

Ответ 8

Вот самый лаконичный способ, который я нашел (используя капибару 3.3.0 и драйвер хрома):

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

выберет 2-й вариант. Увеличивайте индекс по мере необходимости.

Ответ 9

В Capybara вы можете использовать только find с xpath

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

и метод нажмите