2013-05-30 21 views
10

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:

  1. inviato la scheda chiave
  2. cliccato lontano dal campo modulo
  3. inviare il codice JavaScript al fuoco messa a fuoco e sfocatura eventi (convalida si verifica nel caso di sfocatura)
  4. cliccato il campo modulo prima di digitare
  5. set attende solo in caso che sia un problema di temporizzazione
  6. 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(); 
+0

Quindi, se io sto capendo, aggiorna il campo 'input' con ogni colpo chiave? – Brian

+0

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

+1

@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

risposta

4

Quindi credo di aver scoperto il mio problema. Ammetterò pienamente che questo era PEBKAC. Avevo dimenticato che WebDriver ha problemi se la finestra del browser non è messa a fuoco sulla macchina (il che è ancora strano per me). Durante il debug del problema, stavo usando il mio editor per scorrere il codice. Eseguendo il codice normalmente e senza rimuovere il focus dal browser, gli eventi si attivano come previsto utilizzando tutte e tre le soluzioni (scheda, click-away e javascript).

Ho un progetto di esempio che mostra tutti e tre i metodi, tuttavia sono un noob principale con git e github e sto avendo problemi a consegnare il progetto. Una volta capito, condividerò il progetto con tutti voi.

EDIT: ottenuto il codice di esempio su GitHub (https://github.com/loesak/knockout.webdriver.change.event.test). È possibile avviare il progetto come webapp in un server ed eseguire il test manualmente oppure è possibile eseguire i test tramite Maven (mvn clean install). Non ho fatto un sacco di sforzi per far funzionare tutto questo in modo affidabile, supponendo che tu abbia installato Firefox e la porta 8080 sia aperta.

EDIT: fisso il numero di porta specificato

+0

Congratulazioni per risolvere il problema, +1. – Brian

3

Così ho trovato un modo per ovviare a questo problema, per ora, ma di gran lunga fare Credo che questo sia il soluzione corretta Questo infrange la mia regola sul non usare jQuery, tuttavia ritengo che questo sia ok per me dato che KnockoutJS richiede il caricamento di jQuery. C'è probabilmente un semplice modo JavaScript per farlo. Ho provato questo con FireFox, Safari e PhantomJS. Presumo che funzionerà altrettanto bene in Chrome. Non prometto nulla per Internet Explorer.

I am NON andando a contrassegnare questa risposta come la risposta corretta. La soluzione corretta dovrebbe essere attraverso i browser WebDriver che attivano gli eventi appropriati. Solo quando ritengo che ciò non sia possibile tramite WebDriver, contrassegnerò questa come risposta corretta.

// find element in question 
WebElement input = this.element.findElement(By.className("controls")) 
           .findElement(By.tagName("input")); 

// click it to fire focus event 
input.click(); 

// erase any existing value 
for (int i = 0; i < input.getAttribute("value").length(); i++) { 
    input.sendKeys(Keys.BACK_SPACE); 
} 

// enter in desired text 
input.sendKeys(text); 

// fire on change event (WebDriver SHOULD DO THIS) 
((JavascriptExecutor) driver).executeScript(
     "$(arguments[0]).change(); return true;" 
    , input); 

// click away to fire blur event 
driver.findElement(By.tagName("body")).click(); 
+0

Se è possibile fornire uno scenario riproducibile e ** provare ** questo è un problema con il WebDriver, quindi presentare un bug. – Arran

+0

così ho creato un progetto per riprodurlo e nel farlo ho capito il problema. in breve, è un errore da principiante. Mi collegherei al progetto demo ma il mio git noobness mi impedisce di controllare il progetto. – loesak

Problemi correlati