gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:28:22 30 4
gpt4 key购买 nike

当使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com