ruby on rails - tutorial - ¿Hay alguna forma de enviar pulsaciones de teclas a Webkit usando Capybara?
how to install capybara webkit (8)
Necesito enviar algunas pulsaciones de teclas a una aplicación web en una prueba de integración que utiliza Capybara y WebKit. Usando Selenium (WebDriver y Firefox) puedo lograrlo así:
find("#element_id").native.send_keys :tab
pero el nodo elemento nativo de WebKit no tiene un método send_keys. En realidad, nativo en WebKit devolvió una cadena que contiene un número. ¿Hay alguna otra forma de enviar pulsaciones de teclas a WebKit? Tal vez incluso alguna solución usando JavaScript / jQuery?
Ahora desde Capybara-webkit 1.9.0 puedes enviar pulsaciones de teclas como enter y otras usando send_keys:
find("textarea#comment").send_keys(:enter)
Fuente: https://github.com/thoughtbot/capybara-webkit/issues/191#issuecomment-228758761
Documentos API de Capybara: http://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FNode%2FElement%3Asend_keys
Aquí está mi solución, que funciona con 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
Tenga en cuenta que en el nuevo capibara debe usar page.evaluate_script
.
Esto funcionó para mí con Poltergeist, para activar la tecla asterisco:
find("body").native.send_key("*")
No tuve suerte con las otras soluciones; ni siquiera Syn.
Esto fue para activar un evento angular-hotkeys .
He intentado implementar la respuesta de Marc sin ningún éxito, pero encontré algo de ayuda de una pregunta similar: capibara: completa el valor del campo del formulario con la tecla Intro . Y aparentemente hubo una solicitud de extracción de capibara que parece abordar este problema.
Lo que funcionó para mí fue:
before { fill_in "some_field_id", with: "/t" }
Mi ejemplo borra el texto en el campo y luego presiona Tab . Para completar un campo con ''foobar''
, reemplace "/t"
por "foobar/t"
. También puede usar "/n"
para la tecla Intro .
Para su ejemplo, puede usar:
find("#element_id").set("/t")
Para Capybara Webkit, esta es la solución que utilicé:
def press_enter(input)
script = "var e = jQuery.Event(''keypress'');"
script += "e.which = 13;"
script += "$(''#{input}'').trigger(e);"
page.execute_script(script);
end
Luego lo uso limpiamente en mi prueba como:
press_enter("textarea#comment")
Para casos simples, activar un evento de keypress
en JS funcionará:
def press(code)
page.execute_script("$(''#my-input'').trigger($.Event(''keypress'', {keyCode: #{code}}))")
end
Para una respuesta más general y robusta, use esta gran biblioteca que pasa por la molestia de desencadenar los eventos correctos (es decir, keydown
, luego keypress
y finalmente keyup
).
def type(string)
page.execute_script("Syn.click({}, ''my-input'').wait().type(#{string.to_json})")
end
Un ejemplo más complejo se puede encontrar here
Puedes hacerlo así:
keypress_script = "var e = $.Event(''keydown'', { keyCode: #{keycode} }); $(''body'').trigger(e);"
page.driver.browser.execute_script(keypress_script)
Terminé haciendo lo siguiente:
Capybara.current_driver = Capybara.javascript_driver
keypress_script = "$(''input#my_field'').val(''some string'').keydown();"
page.driver.browser.execute_script(keypress_script)
Descubrí en Chrome, probando mi JavaScript, que en realidad estaba creando $.Event
con keyCode
o charCode
y luego activando eso en mi campo de entrada no ponía los caracteres en la entrada. Estaba probando la autocompletación que requería unos pocos caracteres en el campo de entrada, y comenzaría la autocompletación en el keydown
. Así que configuré el valor de entrada manualmente con val
, luego keydown
el keydown
para hacer que se inicie el script de autocompletado.