Я тоже столкнулся с тем же болевым пятном. Потратив на это несколько часов, у меня есть один хороший помощник, который работает как с селеном, так и с polstergeist, и не использует sleep()
. Следующий код был протестирован с Capybara 2.1.0:
def fill_autocomplete(field, options = {})
fill_in field, with: options[:with]
page.execute_script %Q{ $('##{field}').trigger('focus') }
page.execute_script %Q{ $('##{field}').trigger('keydown') }
selector = %Q{ul.ui-autocomplete li.ui-menu-item a:contains("#{options[:select]}")}
page.should have_selector('ul.ui-autocomplete li.ui-menu-item a')
page.execute_script %Q{ $('#{selector}').trigger('mouseenter').click() }
end
Обычно я говорю Capybara заполнить поле ввода, а затем использую JS, чтобы вызвать событие keydown
, чтобы активировать автозаполнение. Однако вместо sleep()
я использую преимущество page.should have_selector('ul.ui-autocomplete li.ui-menu-item a')
, которое ожидает появления раскрывающегося списка. Затем я использую JS, чтобы вызвать событие mouseenter
, затем нажимаю. Я бы хотел, чтобы был лучший способ, чем работать с JS eval, но это самое надежное решение, которое я мог бы найти.