最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Protractor: how to wait for full load of bootstrapped AngularJS - Stack Overflow

programmeradmin2浏览0评论

I have a bootstrapped Angular (1.2.6) app. This means it doesn't have an explicit ng-app. As such, I've run into all sorts of problems getting Protractor framework'd tests to work (using SauceLabs and grunt-protractor-runner).

The errors vary based on what I try, but generally:

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

Or...

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

I've found a few proposed solutions which I've tried. Including those found in this rich thread, as well as here, too. Nothing I do, though, gets things working.

I've tried to use angular.resumeBootstrap in the bootstrapping like so (note I tried multiple variations of this to no avail, including trying to set an ng-app programatically on the document body):

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

The error for this, as others have found, is weird:

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

What's weird/annoying is that, at least looking in Sauce Labs session, it appears that this test is working... it's just weirdly thinking that it's been bootstrapped twice.

I've also tried using various binations of waitForAngular, wait, and others in the test itself. Here's one variation I've tried:

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

This results in errors like the following:

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

I've also tried increasing various timeouts in the config file to no avail.

Any help would be much appreciated!

I have a bootstrapped Angular (1.2.6) app. This means it doesn't have an explicit ng-app. As such, I've run into all sorts of problems getting Protractor framework'd tests to work (using SauceLabs and grunt-protractor-runner).

The errors vary based on what I try, but generally:

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

Or...

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

I've found a few proposed solutions which I've tried. Including those found in this rich thread, as well as here, too. Nothing I do, though, gets things working.

I've tried to use angular.resumeBootstrap in the bootstrapping like so (note I tried multiple variations of this to no avail, including trying to set an ng-app programatically on the document body):

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

The error for this, as others have found, is weird:

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

What's weird/annoying is that, at least looking in Sauce Labs session, it appears that this test is working... it's just weirdly thinking that it's been bootstrapped twice.

I've also tried using various binations of waitForAngular, wait, and others in the test itself. Here's one variation I've tried:

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

This results in errors like the following:

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

I've also tried increasing various timeouts in the config file to no avail.

Any help would be much appreciated!

Share Improve this question asked Dec 6, 2014 at 5:59 peter braypeter bray 1,3451 gold badge12 silver badges22 bronze badges 3
  • @alecxe [email protected] and [email protected]. I was running much earlier versions of both, upgraded (thinking that would help)... and no (noticeable) differences in errors. – peter bray Commented Dec 6, 2014 at 6:44
  • I'm not sure this would help, but try downgrading protractor to earlier versions. – alecxe Commented Dec 6, 2014 at 6:46
  • @alecxe yeah, previously was trying with [email protected] (!) and same results. – peter bray Commented Dec 6, 2014 at 7:11
Add a ment  | 

1 Answer 1

Reset to default 3

You should separate the test in two 'it'-steps. Like this:

it( 'should load angular', function() {
  ptor = protractor.getInstance();
  ptor.waitForAngular();
})

it( 'should load the home page', function() {
  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 );
  });
});

The problem with protractor is that every mand runs without waiting for the prior step to plete. So, ptor.waitForAngular() and ptor.driver.get( 'http://xxx:9000/' ) are running at almost the same time. If you separate these into two steps, protractor moves on after the first 'it'-step is done.

发布评论

评论列表(0)

  1. 暂无评论