量角器:如何等待Bootstrapped AngularJS的满载

时间:2014-12-06 05:59:30

标签: javascript angularjs protractor

我有一个自举的Angular(1.2.6)应用。这意味着它没有明确的ng-app。因此,我遇到了使Protractor框架测试工作的各种问题(使用SauceLabs和grunt-protractor-runner)。

错误因我尝试的内容而异,但通常是:

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

或者...

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

我找到了一些我尝试过的解决方案。包括this rich thread中的内容以及here中的内容。但是,我没有做任何事情。

我尝试在引导中使用angular.resumeBootstrap就像这样(注意我尝试了多种变体无效,包括尝试以编程方式在文档主体上设置ng-app):

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

其他人发现的错误很奇怪:

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

奇怪/令人讨厌的是,至少在Sauce Labs会议上看来,这个测试似乎正在运行......它只是奇怪地认为它已被引导两次。

我还尝试在测试中使用waitForAngularwait和其他组合的各种组合。这是我尝试过的一种变体:

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

这会导致如下错误:

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

我也试过在配置文件中增加各种超时无济于事。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您应该将测试分成两个&#39; -steps。像这样:

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

量角器的问题在于每个命令都在运行而不等待前一步骤完成。因此,ptor.waitForAngular()ptor.driver.get( 'http://xxx:9000/' )几乎同时运行。如果将这些步骤分成两个步骤,量角器将在第一个&#39; -step完成后继续进行。