5
votes

Demande de cyprès attendre par défaut?

J'ai besoin que Cypress attende que toutes les requêtes xhr se terminent par défaut avant d'effectuer des opérations. Y a-t-il un moyen de faire cela par défaut ou d'autres alternatives parce que l'application que je teste est lente et fait beaucoup d'appels API?

Edit: En écrivant une seule déclaration pour chaque demande d'API, cela devient un travail compliqué et inutile. Besoin d'un moyen de rendre cela plus facile.


0 commentaires

3 Réponses :


0
votes

Si vous voulez attendre un xhr spécifique, vous pouvez le faire en utilisant cy.route () . J'utilise ceci dans certains scénarios et c'est vraiment utile. Les étapes générales pour l'utiliser sont:

  • cy.server()
  • cy.route('GET','**/api/my-call/**').as('myXHR');
  • Faites des choses dans l'interface utilisateur, comme cliquer sur un bouton qui déclenchera de tels appels d'API
  • cy.wait(@myXHR)

De cette façon, si un tel appel n'est pas déclenché, votre test échouera. Vous pouvez trouver une documentation complète sur ce ici


2 commentaires

Je ne veux pas attendre un appel spécifique. J'ai besoin d'un moyen d'attendre toutes les demandes xhr par défaut, écrire une instruction d'attente pour chaque appel devient trop compliqué et beaucoup de travail.


le problème ici est si vous devez attendre 45 appels API. Comment faire cela de manière simple?



2
votes

J'ai trouvé quelque chose qui fonctionne pour moi ici https://github.com/PinkyJie/ exemple de cypress-auto-stub

Recherchez cy.waitUntilAllAPIFinished


0 commentaires

0
votes

J'ai partiellement résolu le problème en ajoutant une commande waitAll et en écrasant la commande route dans le dossier support :

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)

Et dans le test au lieu d'utiliser cy.wait (['@ call01', ..., '@callN']); J'utilise cy.waitAll (); code>

Le problème avec cette implémentation est survenu lorsque des appels ont été imbriqués dans un intervalle de temps relativement séparé des appels d'origine. Dans ce cas, vous pouvez utiliser une attente récursive cy.waitAll (50000, {waitNested: true});


0 commentaires