2015-06-17 17 views
5

Desidero utilizzare la funzione browser.wait per controllare ripetutamente se un elemento del pulsante è presente per un determinato periodo di tempo, quindi utilizzare il callback pertinente. Sotto ho il codice che non usa l'attesa.Cosa restituisce il browser browser.wait se la condizione non diventa mai vera?

detailsButton.isPresent() 
    .then(function(present){ 
     if(!present) { 
      callback(); 
     } else { 
      callback(new Error('The details button was not present.')); 
     } 
    }); 

vorrei qualche aiuto risoluzione di questo codice, come io non sono sicuro di come le offerte funzione di attesa con falure/timeout. Essenzialmente sto chiedendo cosa dovrebbe essere nella parte '.then' del codice qui sotto che è meno goffa di quello che ho attualmente.

browser.driver.wait(function(){ 
    return pgTransactionHistory.transactionHistoryDetails.isPresent(); 
}, 60000).then(function(){ 
    pgTransactionHistory.transactionHistoryDetails.isPresent() 
     .then(function(present){ 
      if(!present) { 
       callback(); 
      } else { 
       callback(new Error('The details button was not present.')); 
      } 
     }); 
}); 

Grazie!

risposta

9

Ci sono due modi per farlo: primo luogo è possibile utilizzare il terzo argomento di browser.wait ad una stringa che verrà inviato come messaggio di errore. In questo modo:

browser.driver.wait(function(){ 
    return //condition 
}, timeout, 'Error message string') 
    .then(function(){ 
     callback(); 
    }); 

O in secondo luogo utilizzando un secondo argomento per le .then come questo:

browser.driver.wait(function(){ 
    return //condition 
}, timeout) 
    .then(function(){ 
     callback(); 
    }, function(){ 
     //code to want to execute on failure. 
    }); 
+0

Perché il goniometro non solo rifiuta l'errore e lo fa finire nel gestore .catch? – Abdel

1

La funzione di attesa rifiuta il timeout. Cioè - restituisce una promessa e quando viene raggiunto il timeout lo rifiuta.

browser.driver.wait(function(){ 
    return pgTransactionHistory.transactionHistoryDetails.isPresent(); 
}, 60000).then(function(){ 
    callback(); // instead of doing this, you should return a promise 
}).catch(function(){ 
    callback(new Error('The details button was not present.')); 
}); 
+0

Grazie per la risposta! Per qualche motivo, tuttavia, l'aggiunta di .catch() causa un errore: "non definito non è una funzione". Quando lascio la presa, funziona senza intoppi, inoltre ovviamente nulla verrà "catturato". – JasoonS

+0

Ok, quindi come ho fatto a funzionare è quello di utilizzare il terzo parametro di browser.wait, che è una stringa da utilizzare come messaggio di errore. Sembra che avrei dovuto leggere i documenti più attentamente ... Non sono sicuro del motivo per cui la cattura non funziona. – JasoonS

1

Perché goniometro dà la possibilità di scrivere operazioni asincrone sincrona, è anche possibile gestire il browser. attendere il timeout in modo più sincrono.

export class AppPage { 

    public static isLoaded() { 
    return browser 
    .wait(until.presenceOf(by.id('myID')), 5000) 
    .then(() => true,() => false); 
    } 
} 

e utilizzarlo nella vostra e2e.spec come segue:

expect(AppPage.isLoaded()).toBeTruthy(); 
+0

Mentre questo funziona, mi chiedo cosa sta facendo il 'expect' sotto il cofano e se questo sarà bloccare il thread o meno. – Abdel