2011-12-12 13 views
30

Necesito enviar algunas pulsaciones de teclas a una aplicación web en una prueba de integración que utiliza Capybara y WebKit. El uso de selenio (WebDriver y Firefox) que puedo lograr de esta manera:¿Hay alguna manera de enviar pulsaciones de teclas a Webkit usando Capybara?

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

pero 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?

+0

¿Alguna vez tuvo un poco de suerte con este Pablo? Todavía tengo el mismo problema que originalmente con el método .native. Simplemente devuelve '4', por ejemplo. – kikuchiyo

Respuesta

13

Puede hacerlo así:

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

Esto funcionó para mí. En realidad estamos usando el controlador poltergeist (PhantomJS) en lugar de Capybara WebKit, así que tuve que hacer un pequeño cambio en la segunda línea de código: page.driver.execute_script (keypress_script) –

+1

Esto funcionó para mí, pero debería use page.execute_script (keypress_script). – drinor

+1

FYI - Poltergeist admite element.native.send_keys (* keys) – Rimian

16

que he estado tratando de poner en práctica la respuesta de Marc sin ningún éxito, pero me encontré con la ayuda de una pregunta similar: capybara: fill in form field value with terminating enter key. Y aparentemente hubo un pull request 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" con "foobar\t". También puede usar "\n" para la clave Enter.

Para su ejemplo, se puede utilizar:

find("#element_id").set("\t") 
+1

Confirmo que 'find (" # label "). Set (my_label +" \ n ")' activa la tecla 'Enter'. –

+0

¡Gracias hombre! Trabajó para mi. ¡Realmente me sorprendió una solución tan simple! –

3

que 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, prueba mi JavaScript, que en realidad la creación de un $.Event con keyCode o charCode y luego activar eso en mi campo de entrada no puso 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 keydown. Así que configuré el valor de entrada manualmente con val, luego activé keydown para provocar que se inicie la secuencia de comandos de autocompletado.

0

Aquí está mi solución, que trabaja con capibara 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 

Por favor, tenga en cuenta, que en la nueva capibara usted tiene que utilizar page.evaluate_script.

1

Para los casos simples, lo que provocó un evento 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, utilice este great library que pasa por la molestia de activar los sucesos de la derecha (es decir, keydown, a continuación, 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

9

Esto funcionó para mí con Poltergeist, para activar la tecla asterisco:

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

que no tenía suerte con las otras soluciones; ni siquiera Syn.

Esto fue para desencadenar un evento angular-hotkeys.

+0

Otra razón más para usar Poltergeist. Simplemente hace la vida más fácil. Esto funcionó para mí con cero fricción. – DannyB

0

Para Capibara en Webkit, esta es la solución 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 uso limpiamente en mi prueba como:

press_enter("textarea#comment") 
Cuestiones relacionadas