2012-02-29 3 views
5

La pagina Web che sto testando utilizza il knockout. Su altre pagine del nostro sito che al momento non utilizzano il knockout non ho lo stesso problema. Lo scenario che ho è dove si apre la pagina, inserisco vari campi obbligatori e faccio clic sul pulsante Salva. A un certo punto, quando immette un valore nell'ultimo campo di testo e quando fa clic sul pulsante di salvataggio, i campi che in precedenza avevano i valori vengono cancellati e quindi lo script non può continuare. Ecco un esempio del codice che sto correndo:seleziona i campi dopo che SendKeys li aveva precedentemente compilati.

driver.findElement(By.id("sku")).clear(); 
driver.findElement(By.id("sku")).sendKeys(itemNo); 
driver.findElement(By.id("desktopThankYouPage")).clear(); 
driver.findElement(By.id("desktopThankYouPage")).sendKeys(downloadUrl); 
driver.findElement(By.id("mobileThankYouPage")).clear(); 
driver.findElement(By.id("mobileThankYouPage")).sendKeys(mobileDownloadUrl); 
driver.findElement(By.id("initialPrice")).clear(); 
driver.findElement(By.id("initialPrice")).sendKeys(initialPrice); 
driver.findElement(By.id("submitSiteChanges")).click(); 

Come ho detto, tra il momento si immette del testo nell'ultimo campo e il tempo non scatta salvare i campi che in precedenza aveva testo in loro si schiarì fuori, e quindi il mio test fallisce. Il problema è che non sempre accade. A volte il test funziona bene, altre volte no.

Ho provato a inserire Thread.sleep (x); dappertutto per vedere se la pausa in determinati punti risolverebbe il problema. Ho anche provato ad usare javascript per attendere in background qualsiasi ajax che potrebbe essere in esecuzione. Avere anche l'attesa implicita di driver.manage(). Timeouts(). ImplicitlyWait (10, TimeUnit.SECONDS). Nessuna di queste sembra aver fatto alcuna differenza.

sto correndo la versione 2.13 di server di selenio e tutti i miei test eseguito su Firefox 8.

Qualsiasi aiuto su questo sarebbe molto apprezzato!

+0

Come è stato confermato che i valori impostati sono effettivamente impostati. Cosa succede nel tuo codice KO dopo aver fatto clic su Invia? Gli elementi dom associati a KO sono resi come parte di un modello? – madcapnmckay

+0

Sì, ho verificato che i valori siano presenti nei campi prima di fare clic sul pulsante di invio. In realtà a volte il test passa. Il pulsante di invio prende il nostro oggetto associato e lo converte in JSON e lo invia tramite ajax alla nostra API. Sembra che prima di creare il JSON, il driver Web stia cancellando diversi campi. –

+0

Dubito che il web driver stia cancellando i campi. Una possibilità più probabile è che la pagina stessa stia cancellando i campi a causa di un problema di temporizzazione, o potenzialmente di un bug nel codice del gestore di eventi, tuttavia hai menzionato che aggiungere il sonno non sembra aver risolto il problema. Hai aggiunto un sonno molto lungo (30 secondi) prima di inserire il testo in uno dei campi per escludere completamente un problema di temporizzazione? Hai aggiunto un secondo ritardo tra l'inserimento del testo in ciascun campo per escludere un problema di temporizzazione? –

risposta

1

Ho avuto lo stesso identico problema. Immagino anche che il tuo codice funzioni bene in Chrome ma non in Firefox, e che funzioni sempre quando lo fai manualmente?

In ogni caso, è probabile che il problema sia che il selenio non si comporta nello stesso modo di un utente reale e non attiva gli stessi eventi. Quando si "invia" il modulo, a volte non è stato eseguito l'evento "modifica" su un'area di testo, il che significa che non sarà cambiato.

Ho avuto lo stesso problema testando Backbone.modelbinding, che utilizza l'evento "change" per aggiornare il modello dal modulo. Knockout utilizza anche l'evento "change", ma fortunatamente può anche utilizzare l'evento "keyup". Vedere valueUpdate in the docs:

<input data-bind="value: someValue, valueUpdate: 'keyup'" /> 

In ogni caso, che riproducibile risolto per me, e non ha bisogno di alcuna posti letto una volta ho avuto che fare. Il rovescio della medaglia è che gestiresti l'evento più del necessario nella produzione, per far funzionare i test. Un altro svantaggio è che se si desidera eseguire un codice quando cambia un valore, ora si otterrà un evento per ogni pressione del tasto anziché uno per ogni cambio di campo, il che a volte fa schifo.

C'è un'altra soluzione, che è quella di fare in modo che Selenium faccia da solo l'evento di modifica, ad esempio: Selenium IE change event not fired. È anche subottimale, ma cosa puoi fare.

Si potrebbe anche provare a mettere a fuoco un pulsante prima di cliccarlo. Non so se funzionerà, non l'ho provato.

4

Firefox ha uno bug che impedisce l'esecuzione di alcuni eventi mentre la finestra del browser non è a fuoco. Questo potrebbe essere un problema quando esegui i test di automazione, che potrebbero essere digitati anche se la finestra non è a fuoco.

Il punto è che gli aggiornamenti del modello a eliminazione diretta vengono attivati ​​(per impostazione predefinita) con l'evento change. Se non viene eseguito, il modello sottostante non sarà aggiornato.

Per risolvere questo problema che ha generato l'evento cambiamento "manualmente", iniettando javascript nelle mie prove .:

//suppose "element" is an input field 
element.sendKeys("value"); 
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; 
jsExecutor.executeScript("$(arguments[0]).change();", element); 

Come forse avrete notato, sto usando jQuery per attivare l'evento di modifica. Se non usi jQuery nella tua app, puoi controllare here come attivarlo usando vanilla javascript.

La speranza che aiuta qualcuno.

+0

Mi ha sicuramente aiutato! e FWIW, in C# è il driver 'var jsExecutor = (IJavaScriptExecutor); jsExecutor.ExecuteScript ("$ (argomenti [0]). change();", elemento); ' – LosManos