失败:脚本超时:11 秒内未收到结果来自:任务:Protractor.waitForAngular() - 定位器:By(css 选择器,#my-btn)
Failed: script timeout: result was not received in 11 seconds From: Task: Protractor.waitForAngular() - Locator: By(css selector, #my-btn)
我正在尝试为我的 Angular application using Protractor 编写一些端到端测试。
我有一个简单的 html 按钮,我想点击它 id=my-btn
,使用:
$('#my-btn').click();
不幸的是,我收到以下错误:
Failed: script timeout: result was not received in 11 seconds
From: Task: Protractor.waitForAngular() - Locator: By(css selector, #my-btn)
(Session info: chrome=73.0.3683.75)
(Driver info: chromedriver=2.46.628411 (3324f4c8be9ff2f70a05a30ebc72ffb013e1a71e),platform=Mac OS X 10.14.3 x86_64)
如果点击前我设置:
browser.waitForAngularEnabled(false);
那么我就没有收到任何错误。问题是这样做意味着:
* If set to false, Protractor will not wait for Angular $http and $timeout
* tasks to complete before interacting with the browser. This can cause
* flaky tests, but should be used if, for instance, your app continuously
* polls an API with $timeout.
所以我想知道是什么导致 waitForAngular
操作超时。
有没有办法检查 http 或 timeout 还在挂?
我想调试我的应用程序以了解发生了什么。
我遇到了一些麻烦。您可以尝试一些方法。
- 手动查看是否有定时操作。例如,我的应用程序有一个
timer
每 5 分钟进行一次健康检查。但是这个 timer
操作一直在堆栈上意味着 Angular 永远不会稳定下来。
如果您确实发现了这样的操作,您可以使用 ngZone.runOutsideAngular()
来防止它破坏您的测试。
constructor(
private ngZone: NgZone
) {}
ngOnInit() {
this.ngZone.runOutsideAngular(() => {
this.appStatusInterval = interval(this.appStatusUpdateIntervalTime)
// rest of your code here
});
});
}
- 打开开发工具并运行
getAllAngularTestabilities()
。尝试从那里获取您可以获取的信息。您可以尝试从 the source code 获取额外数据。这一点可能对您特别有用:
isStable(): boolean {
return this._isZoneStable && this._pendingCount === 0 && !this._ngZone.hasPendingMacrotasks;
}
通过依次检查这三个条件中的每一个条件,您至少可以进一步了解什么是不稳定因素 Angular。
正如错误消息所暗示的那样,一个简单的解决方案是将 waitForAngularEnabled(false) 与硬编码睡眠结合使用,无论您希望允许页面加载多长时间而不会使测试失败(比如,3 秒)。 只有当页面在 3 秒后未真正完成加载进入静态时,测试才会不稳定:
await browser.sleep(3000)
然后 运行 您在 waitForAngularEnabled 时的期望是 false
browser.waitForAngularEnabled(false)
// expectations here
browser.waitForAngularEnabled(true)
当您可以使用优雅的回调来确认 Angular 已完成并且您的元素已加载时,这不是首选解决方案。如果页面加载速度超过 3 秒,那么您的测试就是在浪费时间……但是,它简单、可读且可靠。它允许您对页面加载时间施加限制,同时还能够在不受 Protractor 行为不可预测性影响的环境中检查元素 angular 页面播放效果不佳的回调。在前端自动化方面,可靠性比性能更重要。
我正在尝试为我的 Angular application using Protractor 编写一些端到端测试。
我有一个简单的 html 按钮,我想点击它 id=my-btn
,使用:
$('#my-btn').click();
不幸的是,我收到以下错误:
Failed: script timeout: result was not received in 11 seconds
From: Task: Protractor.waitForAngular() - Locator: By(css selector, #my-btn)
(Session info: chrome=73.0.3683.75) (Driver info: chromedriver=2.46.628411 (3324f4c8be9ff2f70a05a30ebc72ffb013e1a71e),platform=Mac OS X 10.14.3 x86_64)
如果点击前我设置:
browser.waitForAngularEnabled(false);
那么我就没有收到任何错误。问题是这样做意味着:
* If set to false, Protractor will not wait for Angular $http and $timeout * tasks to complete before interacting with the browser. This can cause * flaky tests, but should be used if, for instance, your app continuously * polls an API with $timeout.
所以我想知道是什么导致 waitForAngular
操作超时。
有没有办法检查 http 或 timeout 还在挂?
我想调试我的应用程序以了解发生了什么。
我遇到了一些麻烦。您可以尝试一些方法。
- 手动查看是否有定时操作。例如,我的应用程序有一个
timer
每 5 分钟进行一次健康检查。但是这个timer
操作一直在堆栈上意味着 Angular 永远不会稳定下来。
如果您确实发现了这样的操作,您可以使用 ngZone.runOutsideAngular()
来防止它破坏您的测试。
constructor(
private ngZone: NgZone
) {}
ngOnInit() {
this.ngZone.runOutsideAngular(() => {
this.appStatusInterval = interval(this.appStatusUpdateIntervalTime)
// rest of your code here
});
});
}
- 打开开发工具并运行
getAllAngularTestabilities()
。尝试从那里获取您可以获取的信息。您可以尝试从 the source code 获取额外数据。这一点可能对您特别有用:
isStable(): boolean {
return this._isZoneStable && this._pendingCount === 0 && !this._ngZone.hasPendingMacrotasks;
}
通过依次检查这三个条件中的每一个条件,您至少可以进一步了解什么是不稳定因素 Angular。
正如错误消息所暗示的那样,一个简单的解决方案是将 waitForAngularEnabled(false) 与硬编码睡眠结合使用,无论您希望允许页面加载多长时间而不会使测试失败(比如,3 秒)。 只有当页面在 3 秒后未真正完成加载进入静态时,测试才会不稳定:
await browser.sleep(3000)
然后 运行 您在 waitForAngularEnabled 时的期望是 false
browser.waitForAngularEnabled(false)
// expectations here
browser.waitForAngularEnabled(true)
当您可以使用优雅的回调来确认 Angular 已完成并且您的元素已加载时,这不是首选解决方案。如果页面加载速度超过 3 秒,那么您的测试就是在浪费时间……但是,它简单、可读且可靠。它允许您对页面加载时间施加限制,同时还能够在不受 Protractor 行为不可预测性影响的环境中检查元素 angular 页面播放效果不佳的回调。在前端自动化方面,可靠性比性能更重要。