赛普拉斯请求默认等待吗?

时间:2019-02-19 12:52:28

标签: javascript angular automation e2e-testing cypress

在执行任何操作之前,我需要赛普拉斯默认情况下等待任何xhr请求完成。是否有任何方法可以将其设置为默认值或其他替代方法,因为我正在测试的应用程序运行缓慢且需要进行大量的api调用?

编辑:通过为每个api请求编写一个语句,会变得混乱和不必要的工作。需要一种使它更容易的方法。

3 个答案:

答案 0 :(得分:2)

https://github.com/PinkyJie/cypress-auto-stub-example

找到了对我有用的东西

寻找cy.waitUntilAllAPIFinished

答案 1 :(得分:0)

如果您要等待特定的xhr,可以使用cy.route()。我在某些情况下使用它,它确实很有用。使用它的一般步骤是:

  • cy.server()
  • cy.route('GET','**/api/my-call/**').as('myXHR');
  • 在用户界面中执行操作,例如单击将触发此类api调用的按钮
  • cy.wait(@myXHR)

这样,如果未触发此类调用,则测试将失败。您可以找到有关此here

的大量文档

答案 2 :(得分:0)

我部分解决了添加 waitAll 命令并在 support 文件夹中写 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.wait(['@call01',..., '@callN']);

而不是使用cy.waitAll();

此实现的问题是,嵌套调用与原始调用的时间间隔相对分开。在这种情况下,您可以使用递归等待cy.waitAll(50000, {waitNested: true});