Как использовать капибару для выбора раскрывающегося поля select2

В Интернете есть помощь по использованию select2 с капибарой (см. ссылки ниже), но никакой помощи, в частности, насколько я видел, для раскрывающихся полей select2. Я пробовал всевозможные вещи, в том числе пытался заполнить поле, когда :js => false (используя что-то вроде строк find(:xpath, "//input[@id='product_manufacturer_id']").set "Test product manufacturer") или варианты решений, которые работают с другими полями select2 (см. ссылки, приведенные ниже). У меня пока ничего не работает.

Примечания к моей конфигурации:

  • Использование select2 версии 3
  • Использование капибары WebKit
  • Это конкретное поле также использует простую форму и является ассоциацией (как и f.association...). В частности, ProductManufacturer экземпляров находятся в отношениях has_many с продуктами.
  • Раскрывающееся поле select2 должно динамически заполняться экземплярами ProductManufacturer, которые соответствуют тексту запроса (т. е. тексту, который вы вводите в поле поиска).

В случае, если будет полезно посмотреть, как я реализую фабрику:

Вот мой заводской файл:

factory :product do
  name "Test product"
  url { Faker::Name.name.parameterize }
  access_level 1
  product_manufacturer
end

factory :product_manufacturer do
  name "Test product manufacturer"

  factory :product_manufacturer_with_product do
    transient do
      products_count 1
    end

    after(:create) do |product, evaluator|
      create_list(:product,
                   evaluator.products_count,
                   product: product)
    end
  end
end

И затем, перед началом теста, я запускаю:

@product_manufacturer = create(:product_manufacturer)

Моя последняя попытка: мой вспомогательный метод (который работает для других моих полей select2):

def select2_choose(id, options)
  page.execute_script  "$('#{id}').trigger('keydown').val('{options[:query]}').trigger('keyup');"
  find(".select2-result-label", :text => options[:choose]).click
end

И затем, как я это реализую:

select2_choose( "#s2id_autogen7", 
  :query => @product_manufacturer.name[0...-2], 
  :choose => @product_manufacturer.name)

Что выводит следующее сообщение об ошибке:

Failure/Error: create_product
Capybara::ElementNotFound:
   Unable to find css ".select2-result-label" with text "Test product manufacturer"

(что в основном означает, что он нашел и щелкнул раскрывающееся окно, и он вставил текст запроса «Производство тестового продукта». Но select2 не нашел вариант в базе данных, чтобы найти его.)

Обратите внимание, что я успешно использовал factory_girl для создания моего объекта экземпляра ProductManufacturer @product_manufacturer, и вызов таких вещей, как puts @product_manufacturer, успешен, возвращая объект экземпляра: ProductManufacturer:0x007f0145f9cb38>.

Вот скриншот, сделанный прямо перед сбоем теста: скриншот

Другие вопросы, которые связаны с этой проблемой, но не решают ее полностью:

– Выбор раскрывающихся списков select2 (но не в капибаре):

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

Невозможно выбрать элемент в раскрывающемся списке Select2

– Выбор варианта select2 в капибаре (но не в раскрывающихся списках):

Как протестировать элемент Select2 с помощью Capybara DSL? (Примечание: я успешно использовал ответы отсюда, чтобы выбрать не раскрывающиеся поля select2)

– выбор раскрывающегося списка select2 с помощью селена

команда Selenium Select2 для раскрывающегося списка


person RyanQuey    schedule 21.12.2016    source источник


Ответы (4)


Полевые действия Capybara (fill_in, set и т. д.) работают только с базовыми полями HTML-формы, а не с виджетами, управляемыми JS, поскольку они обычно скрывают основные поля. Ключом к работе с любым виджетом, управляемым JS, в Capybara является выполнение действий, которые должен будет выполнить пользователь, в данном случае это щелчок по видимому элементу, чтобы вызвать раскрывающийся список, а затем щелчок по элементу, который вы хотите выбрать.

Например, чтобы выбрать «Калифорния» из первого раскрывающегося списка select2 на странице примера http://select2.github.io/examples.html это можно сделать так

first('.select2-container', minimum: 1).click
find('li.select2-results__option[role="treeitem"]', text: 'California').click

Если вы хотите сделать это, введя поисковый запрос, а не нажимая на результат, это будет что-то вроде

first('.select2-container', minimum: 1).click
find('.select2-dropdown input.select2-search__field').send_keys("California", :enter)

Использование execute_script и trigger — плохая идея, если вы тестируете веб-приложение, поскольку оно обходит большинство проверок того, что на самом деле может сделать пользователь, они хороши, если вы просто автоматизируете страницу.

person Thomas Walpole    schedule 21.12.2016
comment
Я разобрался с проблемой (см. ниже), и оказалось, что это простая ошибка. Однако в итоге я использовал ваш метод, поскольку он лучше воспроизводит то, что на самом деле делает пользователь, так что спасибо за это. - person RyanQuey; 22.12.2016
comment
Хорошо, выберите один из ответов (галочку), чтобы вопрос был помечен как отвеченный. - person Thomas Walpole; 22.12.2016

Как оказалось, моя проблема заключалась просто в том, что мне нужно было запустить фабрики перед загрузкой страницы с формами, чтобы их можно было выбрать с помощью select2.

Другими словами, я пытался сделать это:

click_link "New Product"
create(:product_manufacturer)

когда я должен был сделать это:

create(:product_manufacturer)
click_link "New Product"
person RyanQuey    schedule 22.12.2016
comment
Это то, что сработало для меня, поскольку ответ @ThomasWalpole, вероятно, будет более полезным для других, и вы не можете найти подобное решение в другом месте, поэтому примите его - person RyanQuey; 23.03.2018

Вы также можете взглянуть на гем capybara-select-2, который предоставляет select2 помощника для Capybara. Он работает с select2 версии 3. Также он поддерживает версию 4 (на всякий случай, если вы обновитесь)

select2 'Test product manufacturer', from: 'Product manufacturer'

Если вам нужно найти вариант (или сделать вызов Ajax), вы можете сделать следующее:

select2 'Test product manufacturer', from: 'Product manufacturer', search: true
person Hirurg103    schedule 25.10.2018

щелкните стрелку раскрывающегося списка, чтобы открыть варианты выбора

find('span.select2-selection__arrow').click

нажмите на опцию, чтобы выбрать ее

find('li.select2-results__option', text: 'Exactly content/text of your search').click

Дополнительная информация здесь

person Luis Zambrano    schedule 17.04.2020