2014-10-09 19 views
7

In un modulo Web creato utilizzando AngularJS, sto cercando di inserire alcuni dati in una casella combinata, quindi selezionare un valore premendo il tasto freccia giù e quindi il tasto Invio. Dopodiché, sto verificando che la finestra popup della casella combinata (è una casella combinata UI di Kendo) non sia più visibile.Goniometro in attesa di tasti di invio()

I test eseguiti in Chrome su Windows e Mac OS X. In Windows, il seguente codice funziona bene:

comboInput.sendKeys('CAN') 
    .sendKeys(protractor.Key.ENTER) 
    .sendKeys(protractor.Key.ARROW_DOWN) 
    .sendKeys(protractor.Key.ENTER); 

expect(input.getAttribute('value')).toBe('id_3'); 
expect(popup.getAttribute('style')).toContain('display: none'); 

goniometro entra "CAN" nella casella combinata, quindi seleziona la voce visibile utilizzando la freccia verso il basso chiave, quindi conferma la selezione utilizzando il tasto Invio, che consente di chiudere anche il popup della casella combinata.

Su OS X, questo non funziona, la seconda aspettativa fallisce sempre, poiché l'evento di tasto Invio per chiudere il popup non viene attivato prima di valutare l'aspettativa per qualche motivo.

ho scoperto che devo cambiare il codice di seguito per farlo funzionare:

comboInput.sendKeys('CAN') 
    .sendKeys(protractor.Key.ENTER) 
    .sendKeys(protractor.Key.ARROW_DOWN) 
    .sendKeys(protractor.Key.ENTER).then(function() { 
     expect(input.getAttribute('value')).toBe('id_3'); 
     expect(popup.getAttribute('style')).toContain('display: none'); 
    }); 

sendKeys restituisce una promessa, e se metto l'attesa in là, tutto funziona bene.

È questo il modo corretto per farlo? Nessuno degli esempi che ho trovato sul web utilizza la chiamata then su sendKeys.

E perché il primo codice funziona su Windows e non su OS X? Mi sto perdendo qualcosa? C'è un modo migliore per farlo?

Modifica: questo è probabilmente correlato alla gestione degli eventi di tastiera nativa su OS X? La documentazione goniometro al http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.sendKeys ha il seguente:

Nota: Il browser in cui gli eventi della tastiera native non sono ancora supportati (ad esempio Firefox su OS X), saranno sintetizzati eventi chiave. I tasti di punteggiatura speciali verranno sintetizzati in base a un layout di tastiera en-us QWERTY standard.

+0

Ottima domanda! Non ho una risposta, ma ti suggerisco di, se usi Jasmine, separare la parte 'sendKeys' dalla parte' expect' ciascuna all'interno del proprio blocco 'it()' ed evitare poi con quella tecnica. –

+0

Estrarre anche il problema [n. 690] (https://github.com/angular/protractor/issues/690) per alcuni collegamenti relativi ai problemi SendKeys di OSX. –

+0

Ma non sarebbe quello sconfiggere lo scopo?Per me, ogni test (descritto in un "it") comprende sia le azioni ('sendKeys' in questo caso) che la verifica (' expect'). Suddividendoli in test separati si interrompe il collegamento. – nwinkler

risposta

6

Poiché sendKeys restituisce una promessa, è asincrono (come sapete) ed è probabile che accada più tardi del previsto su qualsiasi macchina. Ho il forte sospetto che se avessi eseguito il test 1000 volte su Windows, non avrebbe funzionato almeno un paio di volte per lo stesso motivo.

Sono quasi morto di vecchiaia cercando di trovare una "pratica migliore" per casi come questo, e non credo che ce ne sia uno diverso da quello che stai già facendo. Molti dei miei test sul goniometro che si basano su azioni promettenti di ritorno finiscono per essere lunghe stringhe di istruzioni then() con funzioni anonime all'interno. Vedi il link:

How to assign count of rows or getText to a variable in Protractor

In sostanza, se non forzare goniometro per fare le cose nel giusto ordine, quindi cinque volte su dieci che avverranno in ordine errato.

Problemi correlati