6

我正在尝试使用Protractor为我的Angular应用程序编写一些 e2e 测试。

我有一个简单的 html 按钮id=my-btn,我想点击它,使用:

$('#my-btn').click();

不幸的是,我收到以下错误:

失败:脚本超时:11 秒内未收到结果

来自:任务:Protractor.waitForAngular() - 定位器:By(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操作超时。

有没有办法检查什么httptimeout仍然挂起?

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

4

2 回答 2

14

我遇到了一些麻烦。您可以尝试几件事。

  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(). 尝试从那里获得什么信息。您可以尝试从源代码中获取额外的数据。这一点可能对您特别有用:
isStable(): boolean {
    return this._isZoneStable && this._pendingCount === 0 && !this._ngZone.hasPendingMacrotasks;
}

通过依次检查这三个条件中的每一个,您至少可以更多地了解是什么使 Angular 不稳定。

于 2019-03-19T17:18:11.100 回答
0

正如错误消息所暗示的那样,一个简单的解决方案是将 waitForAngularEnabled(false) 与硬编码的 sleep 结合使用,无论您希望页面加载多长时间而不会导致测试失败(例如 3 秒)。 仅当页面在 3 秒后没有真正完成加载到静态状态时,测试才会变得不稳定:

await browser.sleep(3000)

然后在 waitForAngularEnabled 为 false 时运行您的期望

browser.waitForAngularEnabled(false)
// expectations here
browser.waitForAngularEnabled(true)

当您可以使用优雅的回调来确认 Angular 已完成并且您的元素已加载时,这不是首选解决方案。如果页面加载速度超过 3 秒,那么您的测试就是在浪费时间……但是,它简单、易读且可靠。它允许您强制限制页面加载时间,同时还能够检查环境中的元素,而不会因 Protractor 的行为的不可预测性而影响页面上的角回调。在前端自动化方面,可靠性比性能更重要。

于 2021-07-22T16:57:31.573 回答