Подтвердить что ты не робот

Есть ли способ отправить ключевые нажатия на Webkit с помощью Capybara?

Мне нужно отправить некоторые нажатия клавиш в веб-приложение в тесте интеграции, который использует Capybara и WebKit. Используя Selenium (WebDriver и Firefox), я могу добиться этого следующим образом:

find("#element_id").native.send_keys :tab

но родной элемент WebKit node не имеет метода send_keys. Фактически native в WebKit возвратил строку, содержащую число. Есть ли другой способ отправить нажатия клавиш в WebKit? Может быть, даже некоторое обходное решение с использованием JavaScript/jQuery?

4b9b3361

Ответ 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.

Ответ 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")