我有一个自举的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会议上看来,这个测试似乎正在运行......它只是奇怪地认为它已被引导两次。
我还尝试在测试中使用waitForAngular
,wait
和其他组合的各种组合。这是我尝试过的一种变体:
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
我也试过在配置文件中增加各种超时无济于事。
非常感谢任何帮助!
答案 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完成后继续进行。