web-dev-qa-db-fra.com

Existe-t-il un moyen d'envoyer des appuis clavier à Webkit à l'aide de Capybara?

Je dois envoyer des presses à une application Web lors d’un test d’intégration utilisant Capybara et WebKit. En utilisant Selenium (WebDriver et Firefox), je peux y arriver comme ceci:

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

mais le nœud d'élément natif de WebKit n'a pas de méthode send_keys. En réalité, natif dans WebKit a renvoyé une chaîne contenant un nombre. Existe-t-il un autre moyen d’envoyer des frappes à WebKit? Peut-être même qu'une solution de contournement utilisant JavaScript/jQuery?

33
pupeno

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

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

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

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

Для вашего примера вы можете использовать:

find("#element_id").set("\t")
18
d_rail

Vous pouvez le faire comme ça:

keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)
14
Marc Lainez

Cela a fonctionné pour moi avec Poltergeist, pour déclencher la clé astérisque:

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

Je n'ai pas eu de chance avec les autres solutions; même pas Syn.

Cela devait déclencher un événement angular-hotkeys .

11
Henrik N

Maintenant, depuis Capybara-webkit 1.9.0, vous pouvez envoyer des appuis sur les touches comme entrer et d’autres en utilisant send_keys:

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

Source: 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

4
Osmond

J'ai fini par faire ce qui suit:

Capybara.current_driver = Capybara.javascript_driver
keypress_script = "$('input#my_field').val('some string').keydown();"
page.driver.browser.execute_script(keypress_script)

J'ai découvert dans Chrome, en testant mon code JavaScript, que créer en réalité un $.Event avec keyCode ou charCode et ensuite le déclencher sur mon champ de saisie ne mettait pas les caractères dans l'entrée. J'essayais l'auto-complétion qui nécessitait que quelques caractères soient dans le champ de saisie, et l'auto-complétion commencerait sur keydown. J'ai donc défini la valeur d'entrée manuellement avec val, puis déclenché keydown pour que le script d'auto-complétion démarre.

3
Sarah Vessels

Pour les cas simples, le déclenchement d'un événement keypress dans JS fonctionnera comme suit:

def press(code)
  page.execute_script("$('#my-input').trigger($.Event('keypress', {keyCode: #{code}}))")
end

Pour une réponse plus générale et plus robuste, utilisez cette grande bibliothèque qui se charge de déclencher les événements appropriés (c.-à-d. keydown, puis keypress et enfin keyup).

def type(string)
  page.execute_script("Syn.click({}, 'my-input').wait().type(#{string.to_json})")
end

Vous trouverez un exemple plus complexe ici

1

Pour Capybara Webkit, voici la solution que j'ai utilisée:

def press_enter(input)
  script = "var e = jQuery.Event('keypress');"
  script += "e.which = 13;"
  script += "$('#{input}').trigger(e);"
  page.execute_script(script);
end

Ensuite, je l'utilise proprement dans mon test comme:

press_enter("textarea#comment")
0
Greg Blass

Voici ma solution, qui fonctionne avec 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

Notez que dans new capybara, vous devez utiliser page.evaluate_script.

0
ExiRe