Как выбрать вариант в раскрывающемся списке с помощью 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
Фарук

2
Хотел бы добавить эту ссылку для тех, кто будет исследовать это в будущем: gist.github.com/zhengjia/428105
BKSpurgeon

3
Отличный ответ! Я хотел бы добавить , что в Rails 5 вы можете сделать это следующим образом , а также: select('option_name', from: 'select_box'). Где могут быть значения: id, name, связанный элемент метки. Вы можете узнать больше о вариантах Capybara и DSL здесь .
Неша Зорич

178

У меня почему-то не получилось. Так что пришлось использовать что-то еще.

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

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


1
Странно, но у меня это не работает, поскольку этот метод, кажется, принимает как минимум 3 варианта. Хотя предложенный вами код совпадает с примером кода из руководства по капибарам.
Линус

1
это не так form, это так from. Вот документация по select
fontno

3
Возможно, стоит отметить, что значение from - это имя, идентификатор или текст метки. т.е. "#organizationSelect" неверен, но "organizationSelect" должно работать.
MZB

Это не сработало для меня, но решение carols10cents сработало. Это не критика вашего ответа. Мне просто кажется очень странным, что даже в последней версии capybara некоторые вызовы работают, а некоторые - нет, даже если интуиция заставит вас поверить, что несколько решений выглядят действительными. Это сводит меня с ума. Связано ли это с firefox (или каким-либо другим браузером, который использует Capybara)?
chaostheory

Я думаю, это сработает, только если имя параметра и значение параметра совпадают.
pixelearth

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метод возвращает логическое значение?
Ruby

4

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

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

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


2

ни один из ответов не работал у меня в 2017 году с капибарой 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
если мне нужно создать модель, нет смысла использовать капибару
user1735921 04

Это вообще не ответ. Это вопрос о капибаре.
Робин Догерти,

0

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

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

выберет второй вариант. При необходимости увеличьте индекс.


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.