2015-06-17 21 views
13

Ho alcuni test scritti usando il goniometro per l'app angular.js. Sto usando il modello di progettazione Page Objects e lì ho alcuni metodi che consentono di accedere ad altre pagine facendo clic su collegamenti e pulsanti. e subito dopo chiamo browser.waitForAngular().Goniometro - Dove usare browser.waitForAngular()

Pagina oggetto

module.exports = function() { 
    this.companyNameLink = element(by.id('viewCompany')); 
    this.newMeetingButton = element(by.id('newMeetingButton')); 

    this.createNewGeneralMeeting = function() { 
     this.newMeetingButton.click(); 
     browser.waitForAngular(); 
    }; 

    this.goToCompanyPage = function() { 
     this.companyNameLink.click(); 
     browser.waitForAngular(); 
    }; 
}; 

e in alcuni file spec io uso questa pagina oggetto come questo ..

var DashboardPage = require('../dashboardPageObject.js'); 
dashboardPage = new DashboardPage(); 

... 

dashboardPage.goToCompanyPage(); 

Ma il problema è a volte ho l'errore angular could not be found on the window e le mie prove falliscono . Il più delle volte i test sono eseguiti. Questo problema è casuale. La mia domanda è che Devo rimuovere la browser.waitForAngular() dal metodo oggetto pagina e chiamarlo dopo che faccio la chiamata al metodo come questo ...

Modificato Pagina oggetto

... 
this.goToCompanyPage = function() { 
    this.companyNameLink.click(); 
}; 
... 

specifica file

dashboardPage.goToCompanyPage(); 
browser.waitForAngular(); 

Il numero browser.waitForAngular() sta causando il problema? Dove devo chiamare lo waitForAngular ci sono delle buone pratiche su come usare questo?

risposta

22

Da goniometro di documentation:

Istruire WebDriver aspettare fino angolare ha terminato il rendering e non ha sospeso $ http o $ chiamate timeout prima di continuare. Si noti che il goniometro applica automaticamente questo comando prima di ogni azione di WebDriver.

Non dovresti chiamarlo affatto e non riesco a pensare a un caso valido dove dovresti.

+0

Ho questo caso d'uso come in, testare le modifiche apportate alla pagina dopo l'aggiornamento. Apporta modifiche -> fai clic su Salva (non causa alcun aggiornamento della pagina) -> Aggiorna -> verifica la pagina ricaricata. In questo caso, l'aggiornamento viene attivato prima che la funzione di salvataggio sia completata causando avvisi inutili del browser sulla pagina. Ho dovuto usare, waitForAngular() prima di attivare l'aggiornamento sulla pagina. –

+0

Bene, se si effettua l'aggiornamento chiamando 'browser.refresh', dovrebbe attendere che l'operazione precedente termini automaticamente. Ho appena guardato il codice e verificato che [lo fa] (https://github.com/angular/protractor/blob/3.0.0/lib/protractor.js#L726) (se non hai disattivato la funzione di sincronizzazione questo è). Forse hai individuato un bug - puoi presentare un problema nella [pagina github del goniometro] (https: // github.com/angular/goniometro/problemi) se questo è il caso. –

8

Invece di utilizzare waitForAngular, è necessario gestire la promessa restituita da click.

Quindi, prima di tutto, i vostri metodi degli oggetti della pagina dovrebbero tornare quelle promesse:

this.goToCompanyPage = function() { 
    return this.companyNameLink.click(); 
}; 

Quindi, l'utilizzo effettivo di questo metodo può apparire come segue:

dashboardPage.goToCompanyPage().then(function() { 
    // this will be executed when the click is done. 
    // No need for any waitForAngular. 
}); 

Per alcuni ulteriori esempi , vedere il mio state/page-object version della suite di test del goniometro di Angular PhoneCat.