Есть ли способ отправить ключевые нажатия на Webkit с помощью Capybara?
Мне нужно отправить некоторые нажатия клавиш в веб-приложение в тесте интеграции, который использует Capybara и WebKit. Используя Selenium (WebDriver и Firefox), я могу добиться этого следующим образом:
find("#element_id").native.send_keys :tab
но родной элемент WebKit node не имеет метода send_keys. Фактически native в WebKit возвратил строку, содержащую число. Есть ли другой способ отправить нажатия клавиш в WebKit? Может быть, даже некоторое обходное решение с использованием JavaScript/jQuery?
Ответы
Ответ 1
Я пытаюсь выполнить Marc-ответ без каких-либо успехов, но я нашел некоторую помощь по аналогичному вопросу: capybara: заполните значение поля формы с завершающим ключом ввода. И, видимо, из capybara был тянуть запрос, который, кажется, решает эту проблему.
Что для меня работало:
before { fill_in "some_field_id", with: "\t" }
Мой пример стирает текст в поле и затем нажимает Tab. Чтобы заполнить поле с помощью 'foobar'
, замените "\t"
на "foobar\t"
. Вы также можете использовать "\n"
для клавиши Enter.
В качестве примера можно использовать:
find("#element_id").set("\t")
Ответ 2
Вы можете сделать это следующим образом:
keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)
Ответ 3
Это работало для меня с помощью Poltergeist, чтобы вызвать ключ звездочки:
find("body").native.send_key("*")
Мне не повезло с другими решениями; даже не Syn.
Это должно было вызвать событие angular-hotkeys.
Ответ 4
В итоге я сделал следующее:
Capybara.current_driver = Capybara.javascript_driver
keypress_script = "$('input#my_field').val('some string').keydown();"
page.driver.browser.execute_script(keypress_script)
Я обнаружил в Chrome, тестируя свой JavaScript, фактически создавая $.Event
с keyCode
или charCode
, а затем запуская, что в моем поле ввода не помещали символы на вход. Я тестировал автозаполнение, которое требовало ввода нескольких символов в поле ввода, и оно запустило автозаполнение на keydown
. Поэтому я устанавливаю входное значение вручную с помощью val
, затем запускаю keydown
, чтобы запустить автозаполнение script.
Ответ 5
Теперь, когда Capybara-webkit 1.9.0 вы можете отправлять нажатия клавиш, такие как enter и другие, используя send_keys:
find("textarea#comment").send_keys(:enter)
Источник: https://github.com/thoughtbot/capybara-webkit/issues/191#issuecomment-228758761
Capybara API Docs: http://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FNode%2FElement%3Asend_keys
Ответ 6
Для простых случаев срабатывание события keypress
в JS будет работать:
def press(code)
page.execute_script("$('#my-input').trigger($.Event('keypress', {keyCode: #{code}}))")
end
Для более общего и надежного ответа используйте эту отличную библиотеку, которая устраняет проблему запуска правильных событий (т.е. keydown
, затем keypress
и, наконец, keyup
).
def type(string)
page.execute_script("Syn.click({}, 'my-input').wait().type(#{string.to_json})")
end
Более сложный пример можно найти здесь
Ответ 7
Вот мое решение, которое работает с capybara 2.1.0
:
fill_in('token-input-machine_tag_list', :with => 'new tag name')
page.evaluate_script("var e = $.Event('keydown', { keyCode: 13 }); $('#token-input-machine_tag_list').trigger(e);") # Press enter
Обратите внимание, что в новом capybara вам нужно использовать page.evaluate_script
.
Ответ 8
Для Capybara Webkit это решение, которое я использовал:
def press_enter(input)
script = "var e = jQuery.Event('keypress');"
script += "e.which = 13;"
script += "$('#{input}').trigger(e);"
page.execute_script(script);
end
Затем я использую его чисто в своем тесте, например:
press_enter("textarea#comment")