what tutorial rails how docs ruby-on-rails webkit capybara keypress

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?



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.