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?
Я пытался реализовать ответ Марка без какого-либо успеха, но я нашел некоторую помощь от подобного вопроса: capybara: заполните значение поля формы с завершающим ключом ввода . И, видимо, было что-то вроде pull pull от капибары, которая, похоже, решает эту проблему.
То сработало для меня:
before { fill_in "some_field_id", with: "\t" }
Мой пример стирает текст в поле, а затем нажимаетTabТобы заполнить поле с помощью 'foobar'
, замените "\t"
на "foobar\t"
. Вы также можете использовать "\n"
дляEnterключ.
Для вашего примера вы можете использовать:
find("#element_id").set("\t")
Vous pouvez le faire comme ça:
keypress_script = "var e = $.Event('keydown', { keyCode: #{keycode} }); $('body').trigger(e);"
page.driver.browser.execute_script(keypress_script)
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 .
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
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.
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
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")
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
.