Есть ли способ отправить нажатия клавиш в Webkit с помощью Capybara? - PullRequest
34 голосов
/ 12 декабря 2011

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

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

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

Ответы [ 8 ]

18 голосов
/ 10 октября 2012

Я пытался реализовать ответ Марка без какого-либо успеха, но я нашел некоторую помощь от аналогичного вопроса: capybara: заполните значение поля формы с завершающей клавишей ввода .И, по-видимому, был запрос на получение от капибары, который, кажется, решает эту проблему.

Что сработало для меня:

before { fill_in "some_field_id", with: "\t" }

Мой пример стирает текст в поле и затем нажимает Tab .Чтобы заполнить поле с 'foobar', замените "\t" на "foobar\t".Вы также можете использовать "\n" для клавиши Enter .

Например, вы можете использовать:

find("#element_id").set("\t")
14 голосов
/ 13 декабря 2011

Вы можете сделать это так:

keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)
11 голосов
/ 22 августа 2014

Это сработало для меня с Полтергейстом, чтобы вызвать звездочку:

find("body").native.send_key("*")

Мне не повезло с другими решениями; даже не син.

Это должно было вызвать событие angular-hotkeys .

5 голосов
/ 20 августа 2016

Теперь, начиная с Capybara-webkit 1.9.0, вы можете отправлять нажатия клавиш, такие как enter и другие, используя send_keys:

find("textarea#comment").send_keys(:enter)

Источник: https://github.com/thoughtbot/capybara-webkit/issues/191#issuecomment-228758761

Документы API Capybara: http://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FNode%2FElement%3Asend_keys

3 голосов
/ 24 октября 2012

Я закончил тем, что сделал следующее:

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, чтобы запустить сценарий автозаполнения.

1 голос
/ 29 апреля 2014

Для простых случаев срабатывание события 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

Более сложный пример можно найти здесь

0 голосов
/ 04 апреля 2016

Для 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")
0 голосов
/ 04 декабря 2013

Вот мое решение, которое работает с капибарой 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

Обратите внимание, что в новой капибаре вы должны использовать page.evaluate_script.

...