47

Ho il seguente metodo di supporto per inserire una stringa in un campo di input e premere il tasto Invio, ma sembra che il tasto Invio non venga mai premuto. Vedo la stringa immessa nel campo di input, ma gli eventi che si verificano al momento dell'inserimento non sono mai accaduti.Come si simula il colpire entrare in un campo di input con Capybara e ChromeDriver?

Ho verificato in un browser effettivo che la chiave di invio attiva correttamente gli eventi previsti. Non sono sicuro di cosa mi stia perdendo.

def fill_and_trigger_enter_keypress(selector, value) 
    page.execute_script %Q(
          var input = $('#{selector}'); 
          input.val('#{value}'); 
          input.trigger("keypress", [13]); 
         ) 
end 

EDIT:

Ho anche provato il seguente inutilmente:

find('#q_name').native.send_keys(:return) 
find('#q_name').native.send_keys(:enter) 

non causano alcun errore, ma ancora nessuna entrare tasto premuto.

risposta

4

Capybara non ha il supporto nativo per un evento di tipo send_keys. Potresti essere in grado di andare al selenio per farlo, oppure puoi provare questo gioiello https://github.com/markgandolfo/send-keys

+0

Perfetto, controllerò la gemma. Ma Capybara non dovrebbe essere il problema dal momento che sto inviando il jQuery direttamente al selenio, giusto? –

6

Di solito quando esegui page.execute_script, ottieni gli stessi risultati che avresti eseguito nella console della pagina. Provare a farlo manualmente nella console e vedere se si ottengono i risultati previsti. Di solito è quello che faccio. Crea il codice js necessario nella finestra della console del browser e incollalo nel codice capybara quando funziona, usando execute_script.

+0

Lavorando su quello. Non ottengo alcun errore quando faccio $ ('# input_selector'). Trigger ('keyPress', [13]), ma ancora nulla sembra attivato come se dovessi premere invio nel browser. –

+1

sì, probabilmente dovrai modificare l'evento che stai attivando. prova a innescare un evento di messa a fuoco per primo, per simulare che hai fatto clic sull'input per inserirlo e poi sul tasto Press .. quello che ho trovato è che di solito devi giocare con gli eventi giusti –

+1

questo è quello che faccio per riempire un completamento automatico, per esempio: page.execute_script% Q {$ ('# {selector}'). val ('# {valore}'). focus(). keydown()} –

67
find('#q_name').native.send_keys(:return) 

funziona per me. Non ho un nome o l'ID per il mio campo, ma il tipo è entrata così ho usato qualcosa come

find('.myselector_name>input').native.send_keys(:return) 

opere perfettamente bene!

+0

Come informazione aggiuntiva, Selinium non simula la chiave eventi su elementi nascosti, mentre questa soluzione funziona bene anche con elementi nascosti. – RajaRaviVarma

+2

@Mysterio Man Questa soluzione non funziona con Capybara 2.5.Genera 'NoMethodError: metodo non definito' send_keys 'per "5": String' error. –

1

Funziona per me

page.execute_script("$('form.css-class/#form_id').submit()") 
+0

'$ ('form.css-class/# form_id')' non è valido jQuery - eseguendolo genera un errore. – GMA

+0

Penso che debba essere formattato senza la barra, quindi '$ ('form.css-class # form_id')' – foomip

0

@Page.selector.send_keys :return

Questo funziona per me, dove selector è l'elemento nella tua pagina oggetto elemento :selector, '<css selector>'

11

In questi giorni (versione Capybara 2.5+) si può simulare la chiave <enter> nel modo seguente:

find('.selector').set("text\n") 

Il \n è il bit molto importante qui.

Problemi correlati