失败:脚本超时:11秒内未收到结果来自:任务:Protractor.waitForAngular()-定位器:作者(css选择器,#my-btn)

时间:2019-03-19 12:01:20

标签: angular typescript protractor e2e-testing angular-e2e

我正在尝试使用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 超时 仍然挂起?

我想调试我的应用程序以了解发生了什么。

2 个答案:

答案 0 :(得分:1)

我对此有些麻烦。您可以尝试一些方法。

  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
    });
  });
}
  1. 打开开发工具并运行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 秒,那么您的测试就是在浪费时间……但是,它简单、易读且可靠。它允许您对页面加载时间实施限制,同时还能够在一个环境中检查元素,而不受量角器行为的不可预测性影响,因为页面上的角度回调效果不佳。在前端自动化方面,可靠性比性能更重要。