2014-12-06 6 views
8

Mam aplikację bootstrapped Angular (1.2.6). Oznacza to, że nie ma wyraźnego ng-app. W związku z tym natknąłem się na różnego rodzaju problemy z testowaniem szkieletu Protractor (przy użyciu SauceLabs i grunt-protractor-runner).Kątomierz: jak czekać na pełne obciążenie bootstrapped AngularJS

Błędy różnić w zależności od tego, co próbuję, ale ogólnie:

Error: Angular could not be found on the page http://xxx:9000/ : 
angular never provided resumeBootstrap 

Albo ...

Error: Error while waiting for Protractor to sync with the page: {} 

Znalazłem kilka proponowanych rozwiązań, które próbowałem. W tym te znalezione w this rich thread, a także here. Nic, co robię, nie działa.

Próbowałem użyć angular.resumeBootstrap w bootstrappingu jak tak (uwaga Próbowałem wiele odmian tego bezskutecznie, w tym stara się ustawić NG-app programowo na ciele dokumentu):

angular.element(document).ready(function() { 
    window.name = 'NG_DEFER_BOOTSTRAP!' 
    angular.bootstrap(document, [ 'app' ]); 
    setTimeout(angular.resumeBootstrap, 0); 
}); 

błąd na to, jak odkryli inni, jest dziwne:

UnknownError: unknown error: [ng:btstrpd] App Already Bootstrapped with this Element 
'<body ng-app="" ng-controller="ApplicationController" class=" ng-scope pace-done">' 

Co dziwne/irytujące jest to, że, przynajmniej patrząc na sesji Labs sos wydaje się, że ten test działa ... to tylko dziwnie myślenie był dwukrotnie ładowany.

Próbowałem również używać różnych kombinacji waitForAngular, wait i innych w samym teście. Oto jedna odmiana Próbowałem:

it('should load the home page', function() { 
    ptor = protractor.getInstance(); 
    ptor.waitForAngular(); 
    ptor.driver.get('http://xxx:9000/'); 
    ptor.driver.wait(function() { 
    return ptor.getCurrentUrl().then(function() { 
     return ptor.isElementPresent(by.id('signIn')).then(function() { 
     console.log('we are here!'); 
     return true; 
     }); 
    }); 
    }) 
    .then(function() { 
    expect(ptor.isElementPresent(by.id('signIn'))).toBe(true); 
    }); 
}); 

To skutkuje błędami tak:

1) e2e: home should load the home page 
    Message: timeout: timed out after 20000 msec waiting for spec to complete 
    Stacktrace: undefined 

Próbowałem zostały również zwiększenie różne limity czasu w pliku konfiguracyjnym bezskutecznie.

Każda pomoc będzie bardzo ceniona!

+0

@alecxe 'grunt-protractor-runner @ 1.1.4' oraz' kątomierz @ 1.4.0'. Pracowałem z wcześniejszymi wersjami obu, ulepszonymi (myśląc, że to pomogłoby) ... i nie (zauważalne) różnice w błędach. – pjb

+0

Nie jestem pewien, czy to pomogłoby, ale spróbuj zmienić kątomierz na wcześniejsze wersje. – alecxe

+0

@alecxe tak, wcześniej próbowałem z 'kątomierzem @ 0.24.2' (!) I tymi samymi wynikami. – pjb

Odpowiedz

3

Test należy oddzielić w dwóch krokach "to". W ten sposób:

Problem z kątomierzem polega na tym, że każde polecenie działa bez czekania na zakończenie poprzedniego kroku. Tak więc ptor.waitForAngular() i ptor.driver.get('http://xxx:9000/') działają prawie w tym samym czasie. Jeśli rozdzielimy je na dwa etapy, kątomierz porusza się po wykonaniu pierwszego "it" kroku.

+0

Zapomniałem wspomnieć, że protrator.getInstance() jest przestarzałe. Użyj przeglądarki zamiast https://github.com/angular/protractor/blob/master/CHANGELOG.md#breaking-changes-1 – apoh

+0

To działało dla mnie dla mojej ręcznie ładowanej aplikacji używającej require.js. Wstawiłem blok "it" prekursora za pomocą przeglądarki browser.waitForAngular() i ustaw browser.ignoreSynchronization = true w moim pliku confractor kątomierza. Wydaje się być hacky, ale działa. uff. –

+2

Korekta, to działa tylko dla mnie * przez pewien czas *.Bardzo frustrujące, wciąż mam sporadyczne błędy z tym samym testem. –

Powiązane problemy