我是Protractor的新手,我正在尝试运行我的脚本。
describe('Navigator homepage', function() {
it('should proceed to login', function() {
browser.get('url');
})
it('Clicks the proceed button',function() {
const proceedButton = element(by.id('auth-login-page-button'));
proceedButton.click();
});
});
但每当我运行它时,浏览器会打开并进入网站,然后等待20秒,然后我收到错误:ScriptTimeoutError: asynchronous script timeout: result was not received in 20 seconds
。元素显然在那里,可以点击,但不适用于量角器。难道我做错了什么?
配置文件如下所示:
// An example configuration file.
exports.config = {
directConnect: true,
// Capabilities to be passed to the webdriver instance.
capabilities: {
'browserName': 'chrome'
},
// Framework to use. Jasmine is recommended.
framework: 'jasmine',
// Spec patterns are relative to the current working directory when
// protractor is called.
specs: ['login_spec.js'],
allScriptsTimeout: 20000,
getPageTimeout: 15000,
framework: 'jasmine',
jasmineNodeOpts: {
isVerbose: false,
showColors: true,
includeStackTrace: false,
defaultTimeoutInterval: 40000
}
};
答案 0 :(得分:11)
鉴于您添加的错误消息(请参阅注释),原因似乎是持续轮询$timeout
,这使得承诺无限期无法解析,因此导致量角器的异步超时(see details here)
<强>溶液强>
正确的解决方案是避免使用$timeout
并使用$interval
代替。这样,量角器可以继续掌控ControlFlow,管理您的异步任务。所以它是一种软件错误,而不是量角器错误。
您的错误消息:
Failed: Timed out waiting for asynchronous Angular tasks to finish after 20 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular While waiting for element with locator - Locator: By(css selector, md-raised md-primary md-button md-ink-ripple).
*The following tasks were pending: - $timeout: function (){return _this.getVersion()}*
解决方法强>
不太好的解决方法是通过设置browser.waitForAngularEnabled(false);
(在beforeEach中或直接在规范中)来关闭量角器的waitForAngular部分。
然而,这也意味着,在测试规范本身内手动处理controlFlow。这需要使用大量.then()
和ExpectedConditions
,失去了量角器的一个主要优势。
调试可能性
检查说明here for potential causes and workarounds。
特别是尝试browser.waitForAngularEnabled(false);
以排除角度量角器问题。
如果找不到原因,可能是时间问题(不太可能,但值得在此时进行检查)。
您可以尝试添加日志消息以缩小执行的有效顺序:
describe('Navigator homepage', function() {
it('should proceed to login', function() {
browser.get('url').then(function(){
console.log("Page is fully loaded");
});
});
it('Clicks the proceed button',function() {
console.log("Start 2nd Test");
const proceedButton = element(by.id('auth-login-page-button'));
proceedButton.click();
});
});
或者您将操作放在同一测试用例中,使用then()
同步执行它们:
describe('Navigator homepage', function() {
it('should proceed to login', function() {
browser.get('url').then(function(){
const proceedButton = element(by.id('auth-login-page-button'));
proceedButton.click();
});
});
在onPrepare
作为一个不错的评论:如果你总是首先加载主页,只需将它放入conf.js的onPrepare部分,它将始终在测试开始前执行一次:
onPrepare: function () {
browser.driver.manage().window().maximize();
browser.get('url');
},
答案 1 :(得分:3)
我有一个类似的问题,我通过打开“忽略同步”来解决了
browser.ignoreSynchronization = true