如何跟踪量角器正在等待哪些异步任务?

2024-02-29

我有一个中型 Angular 应用程序,由于某些原因,我的一些量角器测试在我的实时生产环境中运行时超时。

我相当确定超时是由于量角器等待某些异步任务而发生的。我了解区域,并且我尝试将所有长时间运行的异步任务保留在 ngZone 之外(根据the FAQ https://github.com/angular/protractor/blob/master/docs/timeouts.md),但由于某种原因量角器仍然超时。

我可能错过了一些东西,但我不知道如何调试问题。有什么方法可以找出代码量角器正在等待的哪一部分?

NgZone 仅公开函数来确定是否正在运行微任务或宏任务,但不会告诉我是哪一个。

EDIT:此类超时错误的典型示例如量角器所示:

失败:等待异步 Angular 任务在 11 秒后完成时超时。这可能是因为当前页面不是 Angular 应用程序。请参阅常见问题解答了解更多详情:https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular

等待带有定位器的元素时 - Locator: By(css 选择器, [data-e2e='scroll-to-offer'])

该元素存在于页面上(我已经手动验证了这一点),但量角器仍然超时。


我有一个类似的问题,可测试性 https://angular.io/api/core/Testability不稳定,我只知道我有一些pendingMacroTasks。本地化这些任务确实有点棘手(您不会浏览整个代码库并寻找setTimeout).
不过我最终还是做到了。

相对简单的解决方案

您可以做的第一件事是在 Chrome 中打开开发工具,按Ctrl+O, type zone.js并按Enter.
这将打开zone.js源文件(不是 Typescript,而是其他东西)。
Inside zone.js寻找Zone.prototype.runTask并在该方法中放置一个断点。
启用断点加载应用程序后,否则会被击中太多次。

如果你的可测试性不稳定,这可能意味着你有一些重复的重新安排自身的宏任务。至少那是我的情况。
如果是这种情况,则在加载应用程序后,每 X 次都会命中断点。

命中断点后,转到task.callback.[[FunctionLocation]]这将带你(很可能)一些setTimeout or setInterval.
要修复它,请运行它角区之外 https://angular.io/api/core/NgZone#runoutsideangular.

有点棘手的解决方案

这涉及调整 Zone.js 代码,但为您提供更持久的调试信息。

  1. Go to node_modules/zone.js/dist/zone.js.
  2. 寻找Zone的构造函数:function Zone(parent, zoneSpec)
  3. 里面添加以下内容:this._tasks = {}
  4. 添加计数器变量全球范围: let counter = 0
  5. 寻找Zone.prototype.scheduleTask并在调用之前添加以下内容this._updateTaskCount(task,1):

    task.id = counter++;
    this._tasks[task.id] = task;
    
  6. 寻找Zone.prototype.scheduleTask并在调用之前添加以下内容this._updateTaskCount(task,-1):

    delete this._tasks[task.id]
    
  7. 重新编译应用程序并运行它

假设您进行了上述调整,您始终可以像这样访问待处理的任务:

tasks = Object.values(window.getAllAngularTestabilities()[0]._ngZone._inner._tasks)

要获取影响可测试性状态的所有挂起的宏任务:

tasks.filter(t => t.type === 'macroTask' && t._state === 'scheduled')

之后与之前的解决方案类似,查看.callback.[[FunctionLocation]]并通过在角度区域之外运行来修复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何跟踪量角器正在等待哪些异步任务? 的相关文章

随机推荐

  • 通过 gspread 和 Google Sheets API 更改 Google Sheets 中的列格式

    我正在使用 gspread 并且正在寻找一种通过脚本更改列格式的正确方法 我有一个包含持续时间的专栏 我想将整个列的格式更改为duration 在 Google UI 中 我可以标记整个列 然后单击格式 然后单击编号并设置duration
  • Eclipse:导出运行配置

    我用 eclipse 编写了一个复杂的 Java 应用程序 它使用了项目文件夹中包含的许多 jar 库 有没有一种快速的方法来导出应用程序的运行配置 允许我从 shell 运行它 我实际上不需要在机器上移动它 所以没有 jar 导出或类似的
  • 将测试双打与 DbEntityEntry 和 DbPropertyEntry 结合使用

    我正在按照概述使用 EF6 中的新测试替身这里来自 MSDN http msdn microsoft com en us data dn314431 aspx contextInterface 带有起订量和 nUnit 的 VS2013 一
  • 如何使用 pycurl 读取标题

    如何读取 PyCurl 请求返回的响应标头 有多种解决方案 默认情况下 它们被删除 这是一个 使用选项 HEADERFUNCTION 的示例 它可以让您指示 函数来处理它们 其他解决方案是选项 WRITEHEADER 与 WRITEFUNC
  • 在 x86 平台中使用 -mcmodel=kernel 标志

    我正在尝试将为 x86 架构构建的设备驱动程序交叉编译到 ARM 平台 它的编译没有任何错误 但我认为所有功能都不可用 所以我检查了 makefile 并找到了这个特定的部分 ifeq ARCH x86 64 EXTRA CFLAGS mc
  • Firebase 和后端逻辑

    我是 parse com 用户 现在我正在寻找其他服务 如何将后端逻辑写入 firebase 假设我想验证服务器端的所有值 或者触发一些事情 我想到了一种解决方案 但我想知道推荐的方法 我想 创建使用express的nodejs服务器 创建
  • 使用 classpathentry 包含多个 jar

    我有一个 eclipse 的 classpath 文件 如下所示
  • Laravel 3 - 如何验证复选框数组,至少选中 1 个?

    我开始学习 Laravel 并且仍在学习曲线上 现在我从 Laravel 3 开始 但一旦我开始工作 很可能会将我的项目切换到 Laravel 4 现在的问题是 如何验证复选框数组 我想验证组内至少有 1 个复选框已启用 选中 我在 Lar
  • Bulma 导航栏和 VueJS 路由器活动链接

    我已经开始使用布尔玛0 7 1 and VueJs 2 5 17 现在 我正在使用 Vue 路由器组件 并且我希望每当我位于链接表示的 页面 上时 将导航栏中的按钮设置为活动状态 我的代码如下
  • 由于冲突,无法删除一些未标记的 docker 镜像

    我无法显式删除一些未标记的 docker 映像 具体来说 那些带有标签的
  • C#/.NET:在 C# 中创建动态视觉效果

    注意 我不太确定如何标题或标记这个问题 所以如果您有任何想法 请帮忙 我目前正在设想一些可能的项目 涉及动态渲染某些东西 作为假设的例子 无论是点 线 文本还是五线谱上的音符 但是 如果我要承担这些项目 我 我不太确定如何实现这个设计 我很
  • 在 C# 中验证 FQDN

    有人有正则表达式来验证合法的 FQDN 吗 现在 我使用这个正则表达式 1 254 d a zA Z0 9 1 63 a zA Z 2 但是 此正则表达式会导致 aa a 无效 而 aa aa 有效 有谁知道为什么 这是一个较短的模式 1
  • 如何查询所有子文档

    我从 MongoDb 和 nodejs 使用 mongoose 开始 我有一个收藏Stories 每个都可以有一个或多个Tags 是这样的 title The red fox content The red fox jumps away t
  • 使用 bootstrap 的 Angular 6 库

    我正在使用 Angular 6 库功能在 Angular 项目中创建 Angular 库https github com angular angular cli wiki stories create library https githu
  • 如何在图片下方写标题?

    我有两个图像需要保持内联 我想在每张图片下写一个标题
  • Ionic 3 - 每个页面都需要自己的模块吗?

    我是 Ionic 新手 试图了解如何组织中型应用程序 每个页面应该有自己的模块吗 或者将相似的页面分组到同一个模块中是否更好 有可能这样做吗 看来 IonicPageModule forChild 方法只接受一页 IonicPageModu
  • 将环境类与管道运行结合使用

    我正在使用环境类对管道使用估计器步骤 以便拥有自定义 Docker 映像 因为我需要一些apt get软件包能够安装特定的 pip 软件包 从日志中可以看出 与估计器的非管道版本不同 它完全忽略了环境变量的 docker 部分 很简单 这似
  • Microsoft AlwaysOn 故障转移解决方案和 Delphi

    我正在尝试制作一个 Delphi 应用程序来与 AlwaysOn 解决方案一起使用 我在谷歌上发现我必须使用MultiSubnetFailover True在连接字符串中 应用程序在Delphi XE3中编译并使用TADOConnectio
  • 什么是直接引用?

    严格模式规则之一 Annex C http ecma international org ecma 262 5 1 sec C 状态 When a delete运算符出现在严格模式代码中 语法错误被抛出 如果它一元表达式是对变量 函数参数或
  • 如何跟踪量角器正在等待哪些异步任务?

    我有一个中型 Angular 应用程序 由于某些原因 我的一些量角器测试在我的实时生产环境中运行时超时 我相当确定超时是由于量角器等待某些异步任务而发生的 我了解区域 并且我尝试将所有长时间运行的异步任务保留在 ngZone 之外 根据th