2015-04-30 18 views
11

Ho sviluppato test automatici in Protractor per un po 'di tempo e come molti di voi, ho incontrato lacune che possono essere incrociate solo con il browser.sleep() -bridge. Non sono un fan delle cose difficili da codificare come questa, ma se è necessario lo farò.Timeout goniometro

I test che ho sviluppato mi hanno portato ad un punto in cui ogni browser.sleep(1000) ha un impatto importante sul mio runtime. I test stanno attualmente testando le autorizzazioni per diversi account (128 esattamente) e questo comporta l'accesso e l'uscita mentre si controlla ciò che ogni account ha e non ha ricevuto l'accesso a.

Il sito sto testando è un'applicazione pura AngularJS che, ai miei occhi, dovrebbe fare browser.sleep() un metodo obsoleto in quanto non v'è un metodo browser.waitForAngular() che attende con precisione fino a quando la pagina è completamente caricata rispetto al browser.sleep() che attende un certo lasso di tempo e se il tuo sito web non viene caricato entro quel tempo (succede), avrai un test incoerente (a nessuno piace l'incoerenza).

La ricerca mi ha portato a credere che browser.waitForAngular() non tenga conto delle animazioni e delle relative funzionalità che richiedono tempo poiché non sono correlate a AngularJS, tuttavia questo non è implementato nel nostro sito web. Anche waitForAngular() attende sostanzialmente $digest, $http e $timeout.

Quello che sto chiedendo è che si tratti di qualcosa che è considerato una perdita accettabile dal momento che Goniometro è grande in generale o c'è qualcosa che sto trascurando qui?

TL; DR: Ci sono soluzioni disponibili per permetterci di non accontentarsi di browser.sleep()?

Fonti: Protractor Timeout Docs, Timeout-spec.js (protractor docs), Issue909, Issue279, Issue92, StackQuestion1

+1

Ho riscontrato gli stessi timeout intermittenti che vengono incolpati nelle domande frequenti sull'uso di $ timeout per il polling. Vago se il suo fallimento anche nei casi non è il polling. Per il mio team viene più alla luce poiché facciamo affidamento sui componenti del materiale angolare. Sono pesanti nelle interazioni di animazione con l'uso pesante di $ timeout (func, 0). –

risposta

11

Se si riesce a concepire una sorta di test per determinare se quello che stai aspettando ha completato, è possibile utilizzare browser.wait. Prendendo le idee da da http://docsplendid.com/archives/209, è possibile passare una funzione che restituisce una promessa che si risolve in true o false, come uno che usa isPresent

browser.wait(function() { 
    return element(by.id('some-element')).isPresent(); 
}, 1000); 

o se hai qualche condizione più complicata è possibile utilizzare promessa concatenamento:

browser.wait(function() { 
    return element(by.id('some-element')).isPresent().then(function(isPresent) { 
    return !isPresent; 
    }); 
}, 1000); 

ed il flusso di comando attenderà, chiamando ripetutamente la funzione passata a wait, fino a quando la promessa ritorna decide di true.

+1

È inoltre possibile utilizzare ExpectedConditions per attendere elementi come l'elemento è presente, è selezionabile, contiene testo, ecc. Cf http://www.protractortest.org/#/api?view=ProtractorExpectedConditions – floribon

0

Questo è il modo in cui si desidera eseguire qualsiasi azione quando l'elemento è presente o si desidera attendere finché non è presente sulla pagina.

element(by.id).isPresent().then(function(result) { 
      if (result) { 
       nextButton.click(); 
      } 
      else{ 
       browser.wait(function() { 
        return browser.isElementPresent(element(by.id)); 
       },50000); 
      } 
     }).then(function() { 
      nextButton.click(); 
     }); 

    },