赛普拉斯请求默认等待?
Cypress request wait by default?
我需要 Cypress 在执行任何操作之前默认等待任何 xhr 请求完成。有什么方法可以将其设为默认值或任何其他替代方案,因为我正在测试的应用程序速度很慢并且会进行大量 api 调用?
编辑:为每个 api 请求写一条语句会变得混乱和不必要的工作。需要一种方法使这更容易。
如果您想要等待特定的 xhr,您可以使用 cy.route()
来完成。我在某些场景中使用它,它真的很有用。使用它的一般步骤是:
cy.server()
cy.route('GET','**/api/my-call/**').as('myXHR');
- 在 UI 中执行某些操作,例如单击将触发此类 api 调用的按钮
cy.wait(@myXHR)
这样,如果未触发此类调用,您的测试将失败。您可以找到有关此 here
的大量文档
在这里找到适合我的东西https://github.com/PinkyJie/cypress-auto-stub-example
寻找cy.waitUntilAllAPIFinished
我在 support 中添加 waitAll 命令并覆盖 route 命令部分解决了问题文件夹:
const routeCallArr = [];
Cypress.Commands.overwrite('route', (route, ...params) => {
const localRoute = route(...params);
if (localRoute.alias === undefined) return;
localRoute.onRequest = function() {
routeCallArr.push({alias: `@${localRoute.alias}`, starTime: Date.now()});
}
localRoute.onResponse = function() {
clearCall(`@${localRoute.alias}`);
}
})
const waitAll = (timeOut = 50000, options = {verbose: false, waitNested: false}) => {
const filterRouteCallArr = [];
const date = Date.now();
for (const routeCall of routeCallArr) {
if ((date - routeCall.starTime) > timeOut) continue;
filterRouteCallArr.push(routeCall.alias);
}
if (options.verbose ){
console.table(routeCallArr.map(routeCall => ({
deltaTime: date - routeCall.starTime,
alias: routeCall.alias,
starTime: routeCall.starTime,
})));
console.log(routeCallArr, filterRouteCallArr)
};
routeCallArr.length = [];
if (filterRouteCallArr.length > 0) {
const waiter = cy.wait(filterRouteCallArr, {timeout: timeOut});
options.waitNested && waiter.then(() => {
if (routeCallArr.length > 0) {
waitAll(timeOut, options);
}
});
}
}
Cypress.Commands.add('waitAll', waitAll)
并且在测试中我使用 cy.waitAll();
而不是 cy.wait(['@call01',..., '@callN']);
当嵌套调用与原始调用的时间间隔相对不同时,此实现就会出现问题。在这种情况下,您可以使用递归等待 cy.waitAll(50000, {waitNested: true});
我需要 Cypress 在执行任何操作之前默认等待任何 xhr 请求完成。有什么方法可以将其设为默认值或任何其他替代方案,因为我正在测试的应用程序速度很慢并且会进行大量 api 调用?
编辑:为每个 api 请求写一条语句会变得混乱和不必要的工作。需要一种方法使这更容易。
如果您想要等待特定的 xhr,您可以使用 cy.route()
来完成。我在某些场景中使用它,它真的很有用。使用它的一般步骤是:
cy.server()
cy.route('GET','**/api/my-call/**').as('myXHR');
- 在 UI 中执行某些操作,例如单击将触发此类 api 调用的按钮
cy.wait(@myXHR)
这样,如果未触发此类调用,您的测试将失败。您可以找到有关此 here
的大量文档在这里找到适合我的东西https://github.com/PinkyJie/cypress-auto-stub-example
寻找cy.waitUntilAllAPIFinished
我在 support 中添加 waitAll 命令并覆盖 route 命令部分解决了问题文件夹:
const routeCallArr = [];
Cypress.Commands.overwrite('route', (route, ...params) => {
const localRoute = route(...params);
if (localRoute.alias === undefined) return;
localRoute.onRequest = function() {
routeCallArr.push({alias: `@${localRoute.alias}`, starTime: Date.now()});
}
localRoute.onResponse = function() {
clearCall(`@${localRoute.alias}`);
}
})
const waitAll = (timeOut = 50000, options = {verbose: false, waitNested: false}) => {
const filterRouteCallArr = [];
const date = Date.now();
for (const routeCall of routeCallArr) {
if ((date - routeCall.starTime) > timeOut) continue;
filterRouteCallArr.push(routeCall.alias);
}
if (options.verbose ){
console.table(routeCallArr.map(routeCall => ({
deltaTime: date - routeCall.starTime,
alias: routeCall.alias,
starTime: routeCall.starTime,
})));
console.log(routeCallArr, filterRouteCallArr)
};
routeCallArr.length = [];
if (filterRouteCallArr.length > 0) {
const waiter = cy.wait(filterRouteCallArr, {timeout: timeOut});
options.waitNested && waiter.then(() => {
if (routeCallArr.length > 0) {
waitAll(timeOut, options);
}
});
}
}
Cypress.Commands.add('waitAll', waitAll)
并且在测试中我使用 cy.waitAll();
cy.wait(['@call01',..., '@callN']);
当嵌套调用与原始调用的时间间隔相对不同时,此实现就会出现问题。在这种情况下,您可以使用递归等待 cy.waitAll(50000, {waitNested: true});