2015-06-17 11 views
13

Mam kilka testów napisanych za pomocą kątomierza dla aplikacji angular.js. Używam wzoru projektowego Page Objects i mam kilka metod, które przechodzą do innych stron, klikając łącza i przyciski. a wkrótce potem zadzwonię pod numer browser.waitForAngular().Kątomierz - gdzie użyć browser.waitForAngular()

Page Object

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(); 
    }; 
}; 

aw niektórych pliku spec używam tę stronę przedmiotu takiego ..

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

... 

dashboardPage.goToCompanyPage(); 

Ale problem jest czasami pojawia się błąd angular could not be found on the window i moje próby nie . Większość testów trwa. Ten problem jest losowy. Moje pytanie brzmi, że należy usunąć browser.waitForAngular() od metody stronę obiektu i nazywają to po dokonaniu wywołanie metody takiego ...

Modified Page Object

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

Spec File

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

Czy wywołanie browser.waitForAngular() powoduje emisję? Gdzie powinienem zadzwonić pod numer waitForAngular czy istnieje jakaś sprawdzona metoda korzystania z tego?

Odpowiedz

22

Od kątomierza documentation:

Instruct webdriver poczekać, aż zakończy kątowa renderowania i nie ma wybitny $ http lub $ Limit czasu połączenia przed kontynuowaniem. Zauważ, że Kątomierz automatycznie stosuje to polecenie przed każdą operacją WebDriver.

Nie powinieneś w ogóle dzwonić i nie mogę wymyślić ważnego przypadku, w którym powinieneś.

+0

Mam ten przypadek użycia jak w, test zmian wprowadzonych na stronie po odświeżeniu. Wprowadź zmiany -> kliknij przycisk Zapisz (nie spowoduje to odświeżenia strony) -> odśwież -> przetestuj ponownie załadowaną stronę. W takim przypadku odświeżenie jest uruchamiane przed zakończeniem funkcji składowania, co powoduje niepotrzebne wyświetlanie alertów przeglądarki na stronie. Musiałem użyć, waitForAngular() przed uruchomieniem odświeżania strony. –

+0

Cóż, jeśli odświeżysz się, wywołując 'browser.refresh', powinien poczekać, aż poprzednia operacja zakończy się automatycznie. Właśnie spojrzałem na kod i zweryfikowałem, że to robi (https://github.com/angular/protractor/blob/3.0.0/lib/protractor.js#L726) (jeśli nie wyłączyłeś funkcji synchronizacji to jest). Być może złapałeś błąd - możesz zgłosić problem na [github strony] kątomierza (https: // github.com/kątowe/kątomierz/problemy), jeśli tak jest. –

8

Zamiast używać waitForAngular, należy obsłużyć obietnicę zwróconą przez click.

Tak więc, przede wszystkim, na stronie Metody obiekt powinien powrócić te obietnice:

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

Następnie rzeczywiste stosowanie tej metody może wyglądać następująco:

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

Dla niektórych dalszych przykładach , zobacz mój zestaw testowy Angular PhoneCat Protractor dla state/page-object version.

Powiązane problemy