如何在 cypress.io 测试中可靠地等待页面空闲

2024-01-12

当使用 cypress.io 测试 Angular 网页时,检测页面何时完全加载和空闲的最佳/最可靠方法是什么。不仅仅是 onload 事件。需要包括所有 XHR 请求、完成角度摘要循环以及完成所有渲染,包括完成所有动画。

原因是,此时我想测试页面是否不包含元素,并且在上述所有内容完全完成之前无法进行测试。


为了记录我们为此做了什么(对于 AngularJS)是添加一个新的waitforpageidle可以像这样使用命令:

cy.waitforpageidle();

打字稿如下:

Cypress.Commands.add(
    "waitforpageidle",
    () => {
        console.warn("Waiting for page idle state");

        const pageIdleDetector = new PageIdleDetector();

        pageIdleDetector.WaitForPageToBeIdle();
    }
);

其中PageIdleDetector如下:

export class PageIdleDetector
{   
    defaultOptions: Object = { timeout: 60000 };

    public WaitForPageToBeIdle(): void
    {
        this.WaitForPageToLoad();
        this.WaitForAngularRequestsToComplete();
        this.WaitForAngularDigestCycleToComplete();
        this.WaitForAnimationsToStop();
    }

    public WaitForPageToLoad(options: Object = this.defaultOptions): void
    {
        cy.document(options).should((myDocument: any) =>
        {
            expect(myDocument.readyState, "WaitForPageToLoad").to.be.oneOf(["interactive", "complete"]);
        });
    }

    public WaitForAngularRequestsToComplete(options: Object = this.defaultOptions): void
    {
        cy.window(options).should((myWindow: any) =>
        {
            if (!!myWindow.angular)
            {
                expect(this.NumberOfPendingAngularRequests(myWindow), "WaitForAngularRequestsToComplete").to.have.length(0);
            }
        });
    }

    public WaitForAngularDigestCycleToComplete(options: Object = this.defaultOptions): void
    {
        cy.window(options).should((myWindow: any) =>
        {
            if (!!myWindow.angular)
            {
                expect(this.AngularRootScopePhase(myWindow), "WaitForAngularDigestCycleToComplete").to.be.null;
            }
        });
    }

    public WaitForAnimationsToStop(options: Object = this.defaultOptions): void
    {
        cy.get(":animated", options).should("not.exist");
    }

    private getInjector(myWindow: any)
    {
        return myWindow.angular.element(myWindow.document.body).injector();
    }

    private NumberOfPendingAngularRequests(myWindow: any)
    {
        return this.getInjector(myWindow).get('$http').pendingRequests;
    }

    private AngularRootScopePhase(myWindow: any)
    {
        return this.getInjector(myWindow).get("$rootScope").$$phase;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 cypress.io 测试中可靠地等待页面空闲 的相关文章

随机推荐

  • JDBC 和 SQL Server 连接问题

    我对 Java 很陌生 我是一个纯粹的 net 人 我正在尝试进行 SQL Server 2008 数据库连接 现在我正在使用 jTDS 驱动程序来完成我的工作 db dbConnect jdbc jtds sqlserver XXXXXX
  • 原因及解决方法如何-[__NSCFConstantString trim]? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我用j2objc 从 爪哇 到obj
  • 消息正文上的 Azure 服务总线订阅筛选器

    我想根据消息的内容创建订阅 这可能吗 我试图摆脱添加自定义属性的麻烦 谢谢 这是不可能的 订阅只能根据标准 系统 和自定义 用户 属性进行过滤 如果正文 有效负载中有需要参与过滤的数据 则需要将其提升到标头
  • 如何使用非交互式身份验证连接到 Power BI API?

    用 C 编码 我正在遵循本指南 https azure microsoft com en us documentation articles resource group authenticate service principal aut
  • webpack dev server 的惰性模式有什么作用?

    我正在运行我的 webpack dev server webpack dev server lazy inline progress colors port 8082 但是 当我的浏览器尝试访问时 会显示 404 错误bundle js 其
  • 编译器构建的语义分析阶段有哪些工具?

    编译器构建可以分为词法分析 语法分析 语义分析等几个阶段 词法分析有Lex Flex等工具 语法分析有Yacc Bison等工具 我只是好奇语义分析阶段有哪些可用的工具 据我所知 没有与语言无关的工具来执行类型检查 如果有的话 它们肯定不会
  • Windows:Numpy mkl_intel_thread.dll

    经过几个小时的尝试和调查 我已经成功解决了这个问题Numpys mkl intel thread dll文件错误 以下内容可能无法解决所有情况 但我会尝试解释我的特定案例的详细信息 以帮助其他遇到相同问题的人 我的问题 当尝试启动 Anac
  • GRUB 是否切换到保护模式?

    我想问一下 启动时将CPU切换到保护模式是GRUB还是Linux内核 我还想问 内核本身 vmlinuz 是 ELF 还是纯二进制格式 谢谢 GRUB does让你进入保护模式 GRUB多重引导规范 版本 0 6 96 第 3 2 节 ht
  • Django 中的静态文件和媒体文件有什么区别?

    我正在转向 Django 1 3 发现媒体和静态文件的这种分离有点令人困惑 这是默认的方式settings py好像 Absolute filesystem path to the directory that will hold user
  • 以编程方式添加过滤器和初始化参数

    我需要将 web xml 的内容复制到 WebAppInitializer class Java 配置类 我已经从 web xml 复制了 YahooFilter 类 请参阅代码 但我不确定如何实用地添加 init params 我已在下面
  • Mongodb 返回旧集合

    router post orders finish function req res next var order id req body order id var user id req body user id var table id
  • 在 Chart.js 图表的 x 轴上仅显示第 n 个刻度线

    我一直在寻找这个问题的解决方案一段时间 但由于大量已删除的文档和该库以前版本的黑客答案 我还没有接近解决方案 我正在使用 ChartJS v2 制作一个图表 x 轴上带有季度月份名称 并且我设置了标签 以便仅显示每 4 个标签 即每年一个
  • 我可以将 UILocalnotification 设置为每个月的最后一天重复吗?

    我想自己尝试一下 但我需要一个月的时间才能确定它是否有效 有人尝试过这个吗 NSDate fireDate Date I want to repeat in this case 31 may localNotification fireDa
  • 在 Javascript 测试中断言对象相等 (chai)

    我需要在 JavaScript 单元测试中断言两点之间相等 var pnt1 x 2 y 3 and var pnt2 x 2 y 3 当我做 assert equal pnt1 pnt2 据说要点不同 我可以从检查中排除对象是不同实例的事
  • std::function 构造函数和 nullptr

    为什么以下代码打印 0 作为输出 include
  • 无法获取系统目录 - hadoop

    使用hadoop多节点设置 1个主站 1个从站 在 master 上启动 start mapred sh 后 我在 TT 日志中发现以下错误 从属 org apache hadoop mapred TaskTracker 无法获取系统目录
  • 我可以覆盖 !important 吗? [复制]

    这个问题在这里已经有答案了 我正在尝试在元素上设置此 CSS background red important 但是当我尝试这样做时 background yellow 它仍然只显示红色而不是黄色 正如我希望的那样 我没有使用外部CSS 我
  • Elasticsearch 对多个索引进行评分

    我有一年中任何季度的索引 index 2015 1 index 2015 2 我的每个索引上都有大约 3000 万个文档 文档有一个文本字段 标题 我的文档排序方法是 1 score 2 创建日期 问题是 在所有索引 index 201 的
  • 压缩和解压缩文件和文件夹

    我需要使用 C C 压缩和解压缩 Windows Mobile 中的目录层次结构 什么是 最简单的库可用吗 我用谷歌搜索了很多次 我发现了一些东西 但我无法继续下去 如果您已经实施或者您了解一些相关内容 请告诉我 对于 NET SharpZ
  • 如何在 cypress.io 测试中可靠地等待页面空闲

    当使用 cypress io 测试 Angular 网页时 检测页面何时完全加载和空闲的最佳 最可靠方法是什么 不仅仅是 onload 事件 需要包括所有 XHR 请求 完成角度摘要循环以及完成所有渲染 包括完成所有动画 原因是 此时我想测