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

标签 angular testing web cypress

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

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

最佳答案

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

cy.waitforpageidle();

typescript 如下:

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;
    }
}

关于angular - 你如何在 cypress.io 测试中可靠地等待页面空闲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525143/

相关文章:

angular - 对 Firestore 的递归调用

Angular 2 : Route generator for '...' was not included in parameters passed

python - 使用测试数据库在 "test-mode"中运行服务器

通过调用 browserHistory 测试异步 redux 操作

android - 考虑移动设备设计 Flask 应用程序?

javascript - 在网页中选择下拉值后如何将焦点设置在输入上

asp.net - Visual Studio 2008 迫使我每次都重新构建网站以实现我所做的任何更改

typescript - Angular2 @HostBinding 无法绑定(bind)背景图像样式

angular - 要么我错误地使用了 Angular Renerer2,要么它已损坏。有人能弄清楚吗?

python - 如何查看模板名称?