我正在尝试使用Angular为我的Protractor应用程序编写一些e2e测试。
我有一个简单的html按钮,它具有要使用的id=my-btn
,我可以使用:
$('#my-btn').click();
不幸的是,我遇到以下错误:
失败:脚本超时:11秒内未收到结果
发件人:任务:Protractor.waitForAngular()-定位器:作者(css选择器,#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 或 超时 仍然挂起?
我想调试我的应用程序以了解发生了什么。
答案 0 :(得分:1)
我对此有些麻烦。您可以尝试一些方法。
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不稳定的问题有更多的了解。
答案 1 :(得分:0)
正如错误消息所暗示的那样,一个简单的解决方案是将 waitForAngularEnabled(false) 与硬编码睡眠结合使用,无论您希望页面加载多长时间,而不会导致测试失败(例如,3 秒)。 只有当页面实际上没有完成加载时,测试才会不稳定 3 秒后进入静态状态:
await browser.sleep(3000)
然后在 waitForAngularEnabled 为 false 时运行您的期望
browser.waitForAngularEnabled(false)
// expectations here
browser.waitForAngularEnabled(true)
当您可以使用优雅的回调来确认 Angular 已完成并且您的元素已加载时,这不是首选解决方案。如果页面加载速度超过 3 秒,那么您的测试就是在浪费时间……但是,它简单、易读且可靠。它允许您对页面加载时间实施限制,同时还能够在一个环境中检查元素,而不受量角器行为的不可预测性影响,因为页面上的角度回调效果不佳。在前端自动化方面,可靠性比性能更重要。