2015-01-12 1 views
10

Scrivo i test del goniometro e mi piace, anche se a volte sembra di essere coinvolto in qualcosa che sembra come se fosse semplice. Ad esempio, voglio scorrere tutti i pulsanti di una delle nostre pagine che contengono il testo di "Nominate". Ci sono dozzine sulla pagina, ma solo 1 o 2 saranno visibili. Quindi voglio fare clic sul primo che è. Ecco il codice che sto utilizzando attualmente:Seleziona il primo elemento visibile nel goniometro

var nominateButtons = element.all(by.buttonText('Nominate')); 
    nominateButtons.then(function(els){ 
     for(var x = 0;x < els.length;x++){ 
      //Since isDisplayed returns a promise, I need to do it this way to get to the actual value 
      els[x].isDisplayed().then(function(isVisible){ 
       //isVisible now has the right value     
       if(isVisible){ 
        //But now els is not defined because of the scope of the promise!! 
        els[x].click(); 
       } 
      }); 
     } 
    }); 

Quando ho eseguito questo codice, ottengo un 'non può chiamare il metodo click del non definito' errore, perché els [x] non è più in campo di applicazione, ma posso' Sembra che controlliamo la visibilità senza usare la promessa. Quindi la mia domanda è: come è possibile scorrere una serie di elementi, controllarne la visibilità e fare clic sulla prima che è visibile? (Sto cercando di non utilizzare una di check visibilità perché so che la maggior parte dei pulsanti non saranno visibili)

Grazie in anticipo

risposta

15

els è definito. Quello che non è definito è x. Il modo più semplice per farlo è:

var nominateButtons = element.all(by.buttonText('Nominate')); 
var displayedButtons = nominateButtons.filter(function(elem) { 
    return elem.isDisplayed(); 
}); 
displayedButtons.first().click(); 

o

element.all(by.buttonText('Nominate')). 
    filter(function(elem) { 
    return elem.isDisplayed(); 
    }). 
    first(). 
    click(); 

EDIT, tra l'altro, non si dovrebbe fare affidamento su questo comportamento (clicca primo pulsante del testo 'Nominate') perché causerà problemi quando cambi la tua app. Vedere se è possibile selezionare per ID, o selezionare una più specifica 'Nominate' come element(by.css('the section the nominate is under')).element(by.buttonText('Nominate'));

EDIT di nuovo: vedi Using protractor with loops per la spiegazione

+0

Grazie mille. Ho combattuto con questo tutto il giorno. Non solo non mi rendevo conto che x era il colpevole, non ero a conoscenza della prima() funzione a cui ti riferivi, quindi sono molto grato. Sono consapevole che fare clic sul primo elemento non è una buona idea e normalmente lo eviterei. Questo è un po 'strano, però, e in realtà dovrebbe funzionare, anche se sono consapevole che potrei finire per mordermi la lingua. In ogni caso, apprezzo molto che tu abbia trovato il tempo di rispondere. Ha finalmente funzionato il mio test case e mi ha insegnato un paio di cose lungo la strada. Sono un ragazzo pitone e abbastanza nuovo per JS e promette – user2233949

+0

Prego. Dovresti accettare la risposta se ti ha aiutato invece di rispondere in una nuova risposta però =) – hankduan

+0

Non sapevo che avremmo potuto concatenare elemento - grazie – mrwaim