2016-12-21 2 views
1

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

Заметки о моей конфигурации:

  • Использование ВЫБ.2 версии 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) 

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

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" 

(что в основном означает, что он нашел и нажал на раскрывающийся список, и он ввел текст запроса «Test product production». Но Выбор2 не найти вариант из базы данных, чтобы найти его)

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

Вот скриншот справа перед тест не пройден: screenshot

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

- Выбор падения Выбор2 спады (но не в капибары):

How to select option in drop down using Capybara

Unable to select item in Select2 drop down

- Выбор параметров ВЫБ.2 в водосвинки (но не падение падения):

How to test a Select2 element with capybara DSL? (Примечание: Я успешно использовал ответы от сюда, чтобы установить не выпадающий Select2 полей)

- выбор выбор2 раскрывающийся с использованием селен

Selenium Select2 command for drop-down box

ответ

0

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

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

click_link "New Product" 
create(:product_manufacturer) 

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

create(:product_manufacturer) 
click_link "New Product" 
+0

Принял мой собственный ответ, потому что это то, что на самом деле устранило проблему. Однако для того, как реализовать capybara с select2, см. Ответ ThomasWalpole, который предоставляет решение и объяснение для решения, которое вы не можете найти в другом месте. – RyanQuey

7

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

В качестве примера, чтобы выбрать «Калифорния» с первого ВЫБ.2 выпадающего списка на примере страницы 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 плохие идеи, если вы тестирование веб-приложения, так как он обходит большинство проверок на то, что пользователь на самом деле могли бы сделать, они прекрасно если вы просто автоматизируете страницу

+0

Попытка реализовать свое первое предложение, с этим: 'страницу .find ('# s2id_product_manufacturer_id.select2-container'). щелкните page.find ('li.select2-highlight]', текст: @ product_manufacturer.name) .click ' Но получив следующую ошибку:' Capybara :: Webkit :: InvalidResponseError: SyntaxError: DOM Exception 12 ' Любые предложения? – RyanQuey

+0

Ничего, я понял. Удалено '' '.Но теперь, все еще получая ошибку: «Невозможно найти css» li.select2-highlight »с текстом« Производитель тестового продукта ». Я предполагаю, что каким-то образом select2 неправильно вытаскивает данные из таблицы базы данных, поэтому никаких параметров не отображаются, хотя он отлично работает в среде разработки. Я просто не знаю, почему это было бы – RyanQuey

+0

. Я дал более подробную информацию о моей фабричной реализации выше в моем оригинальном посте, если это полезно – RyanQuey

Смежные вопросы