Ho un'applicazione che sta utilizzando KnockoutJS e sto tentando di scrivere alcuni test che testano un modulo. Se non conosci KnockoutJS, il suo racconto è che fornisce collegamenti dal mio punto di vista al mio modello di dati. Ciò significa che quando digito un valore in un campo di input, il mio oggetto sottostante viene automaticamente aggiornato con quel valore dei campi di input. Questo viene fatto attraverso un evento di cambiamento per impostazione predefinita.WebDriver: modifica evento non attiva
Il problema che sto avendo è che quando il mio test WebDriver sta digitando nel campo, l'evento change non viene attivato, quindi il modello dati sottostante non ha i valori appropriati. Ciò causa il fallimento della convalida del modulo quando non dovrebbe.
Ho fatto tutto quello che ho potuto trovare su internet per fare questo lavoro. Ho:
- inviato la scheda chiave
- cliccato lontano dal campo modulo
- inviare il codice JavaScript al fuoco messa a fuoco e sfocatura eventi (convalida si verifica nel caso di sfocatura)
- cliccato il campo modulo prima di digitare
- set attende solo in caso che sia un problema di temporizzazione
- KnockoutJS modificati per aggiornare campo di input afterkeydown
Nessuno di questi ha funzionato per me. Ho bisogno di aiuto.
Inoltre, ho verificato che questo non è un problema di bubbling degli eventi poiché ho rimosso esplicitamente tutti gli altri eventi, lasciando solo l'evento di modifica KnockoutJS.
per la soluzione che sto cercando è quella che funziona per tutti i driver del browser (... almeno quelli principali, ad esempio IE, FF, Chrome, Safari) e non richiede l'uso di jQuery.
Qualsiasi aiuto sarebbe molto apprezzato.
Ecco il codice relativo che sto usando per scrivere i valori nel campo:
// find element
WebElement input = this.element.findElement(By.className("controls"))
.findElement(By.tagName("input"));
// to set focus?
input.click();
// erase any existing value (because clear does not send any events
for (int i = 0; i < input.getAttribute("value").length(); i++) {
input.sendKeys(Keys.BACK_SPACE);
}
// type in value
input.sendKeys(text);
// to fire change & blur? (doesnt fire change)
//input.sendKeys(Keys.TAB);
// to fire change & blur? (doesnt fire change)
driver.findElement(By.tagName("body")).click();
Quindi, se io sto capendo, aggiorna il campo 'input' con ogni colpo chiave? – Brian
Perdonami per aver fatto una domanda potenzialmente stupida, ma la pagina in questione funziona correttamente quando interagisci manualmente con esso nel browser? Ad esempio, se si visualizza la pagina nel browser, si digita il campo di testo e la scheda fuori dal campo di testo, il modello viene aggiornato? – RodneyTrotter
@Brian il campo di inserimento viene aggiornato dall'utente. il modello di dati sottostante viene aggiornato al valore nel campo di input quando l'evento onchange viene attivato (almeno è previsto). E se modifico il valore sottostante nel modello dati, il campo di input verrà aggiornato automaticamente al nuovo valore. Questo è tutto fornito da KnockoutJS. – loesak