Капибара/полтергейст не может выбрать из поля автозаполнения jQuery

У меня проблема с выбором из поля автозаполнения с помощью Capybara.

У меня есть следующий код:

def choose_autocomplete_result(text, input_id="input[data-autocomplete]")
  page.execute_script %Q{ $('#{input_id}').trigger("focus") }
  page.execute_script %Q{ $('#{input_id}').trigger("keydown") }
  sleep 1
  page.execute_script %Q{ $('.ui-menu-item a:contains("#{text}")').trigger("mouseenter").trigger("click"); }
end

И у меня есть следующий тест:

scenario 'Check autocomplete', js: true do
  find('.prop_address').native.send_keys 'lond'
  choose_autocomplete_result 'London', '.commercial_property_addresses_attributes_0_address'
  expect(page).to have_text('Some text')
end

И ошибка:

Failure/Error: find('#output').find('div').trigger('click')

     Capybara::ElementNotFound:
       Unable to find css "#output"

Также я попробовал следующий тест:

scenario 'Check autocomplete', js: true do
  fill_autocomplete('.prop_address', with: 'lond', select: 'London')
  expect(page).to have_text('Some text')
end

С помощью следующего метода:

def fill_autocomplete(css_id, options = {})
  find("#{css_id}").native.send_keys options[:with]
  page.execute_script %{ $('#{css_id}').trigger('focus') }
  page.execute_script %{ $('#{css_id}').trigger('keydown') }
  selector = %{ul.ui-autocomplete li.ui-menu-item:contains("#{options[:select]}")}
  expect(page).to have_selector('ul.ui-autocomplete li.ui-menu-item')
  page.execute_script %{ $('#{selector}').trigger('mouseenter').click() }
end

Таким образом, ошибка:

Failure/Error: expect(page).to have_selector('ul.ui-autocomplete li.ui-menu-item')
       expected to find css "ul.ui-autocomplete li.ui-menu-item" but there were no matches

В обоих вариантах форма заполняется словом «лонд», но ни один из доступных вариантов не выбран.

Спасибо!


person verrom    schedule 23.09.2016    source источник


Ответы (1)


Я не уверен, чего вы пытаетесь достичь со всем материалом execute_script. Предполагая, что вы используете автозаполнение jQueryUI, все, что требуется, — это отправить ключи в текстовый ввод, а затем нажать на показанном выборе. Таким образом, ваш метод должен быть просто

def fill_autocomplete(css_selector, options = {})
  find(css_selector).send_keys options[:with]   # No .native. needed
  find("ul.ui-autocomplete li.ui-menu-item", text: options[:select]).click()
end

Вот пример, который вы можете запустить, чтобы показать, как он работает: https://gist.github.com/twalpole/a12aeef278c9c714b9e078ce2adfda99

person Thomas Walpole    schedule 23.09.2016