web-dev-qa-db-fra.com

Préserver les cookies / session localStorage à travers les tests dans Cypress

Je souhaite enregistrer/conserver/conserver un cookie ou un jeton localStorage défini par cy.request (), afin de ne pas avoir à utiliser de commande personnalisée pour vous connecter à chaque test. Cela devrait fonctionner pour les jetons comme jwt (jetons Web json) qui sont stockés dans le localStorage du client.

12
bkucera

Du cyprès docs

Pour les cookies persistants : Par défaut, Cypress efface automatiquement tous les cookies avant chaque test pour empêcher la création d'un état.

Vous pouvez ajouter des cookies spécifiques à la liste blanche à conserver entre les tests à l'aide de l'API Cypress.Cookies:

// now any cookie with the name 'session_id' will
// not be cleared before each test runs
Cypress.Cookies.defaults({
  whitelist: "session_id"
})

Pour un stockage local persistant : Il n'est pas intégré à ATM, mais vous pouvez le faire manuellement maintenant car la méthode qui supprime le stockage local est exposée publiquement comme Cypress.LocalStorage .clair.

Vous pouvez sauvegarder cette méthode et la remplacer en fonction des clés envoyées.

const clear = Cypress.LocalStorage.clear

Cypress.LocalStorage.clear = function (keys, ls, rs) {
  // do something with the keys here
  if (keys) {
    return clear.apply(this, arguments)
  }

}
15
bkucera

Pour mettre à jour ce fil, il existe déjà une meilleure solution disponible pour conserver les cookies (par @bkucera); mais il existe maintenant une solution de contournement disponible pour enregistrer et restaurer le stockage local entre les tests (au cas où cela serait nécessaire). J'ai récemment fait face à ce problème; et a trouvé que cette solution fonctionnait.

Cette solution consiste à utiliser des commandes d'assistance et à les consommer dans les tests,

À l'intérieur - cypress/support/<some_command>.js

let LOCAL_STORAGE_MEMORY = {};

Cypress.Commands.add("saveLocalStorage", () => {
  Object.keys(localStorage).forEach(key => {
    LOCAL_STORAGE_MEMORY[key] = localStorage[key];
  });
});

Cypress.Commands.add("restoreLocalStorage", () => {
  Object.keys(LOCAL_STORAGE_MEMORY).forEach(key => {
    localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]);
  });
});

Puis en test,

beforeEach(() => {
  cy.restoreLocalStorage();
});

afterEach(() => {
  cy.saveLocalStorage();
});

Référence: https://github.com/cypress-io/cypress/issues/461#issuecomment-392070888

11

Voici la solution qui a fonctionné pour moi:

 Cypress.LocalStorage.clear = function (keys, ls, rs) {
    return;
 before(() => {
    LocalStorage.clear();
    Login();
  })

Le contrôle de la suppression des cookies est pris en charge par Cypress: https://docs.cypress.io/api/cypress-api/cookies.html

0
Leo Davtyan

Voici le lien utile qui résout mon problème comme le vôtre: Préserver les cookies à travers plusieurs tests

mon code comme:

const login = () => {
    cy.visit('http://0.0.0.0:8080/#/login');
    cy.get('#username').type('username');
    cy.get('#password').type('1234password$');
    cy.get('#login-button').click();
}

describe('UI', () => {
  // beforeEach(login);
    beforeEach(() => {
        login();
        Cypress.Cookies.preserveOnce('session_id', 'remember_token');
  });

});

l'espoir peut vous aider.

0
li xin

Vous pouvez ajouter votre propre commande de connexion à Cypress et utiliser le package cypress-localstorage-commands pour conserver localStorage entre les tests.

Dans support/commands:

import "cypress-localstorage-commands";

Cypress.Commands.add('loginAs', (UserEmail, UserPwd) => {
  cy.request({
    method: 'POST',
    url: "/loginWithToken",
    body: {
      user: {
        email: UserEmail,
        password: UserPwd,
      }
    }
  })
    .its('body')
    .then((body) => {
      cy.setLocalStorage("accessToken", body.accessToken);
      cy.setLocalStorage("refreshToken", body.refreshToken);
    });
});

A l'intérieur de vos tests:

describe("when user FOO is logged in", ()=> {
  before(() => {
    cy.loginAs("[email protected]", "fooPassword");
    cy.saveLocalStorage();
  });

  beforeEach(() => {
    cy.visit("/your-private-page");
    cy.restoreLocalStorage();
  });

  it('should exist accessToken in localStorage', () => {
    cy.getLocalStorage("accessToken").should("exist");
  });

  it('should exist refreshToken in localStorage', () => {
    cy.getLocalStorage("refreshToken").should("exist");
  });
});
0
Javier Brea

Pour conserver un cookie de jeton Google, il existe une bibliothèque appelée cypress-social-login .
Il semble que d'autres fournisseurs OAuth servent de jalon).
Il est recommandé par l'équipe de Cypress et se trouve sur la page du plugin Cypress.

https://github.com/lirantal/cypress-social-logins

Cette bibliothèque Cypress permet d'effectuer des connexions tierces (pensez oauth) pour des services tels que GitHub, Google ou Facebook.

Pour ce faire, il délègue le processus de connexion à un flux de marionnettistes qui effectue la connexion et renvoie les cookies pour l'application en cours de test afin qu'ils puissent être définis par le flux Cypress appelant pendant la durée du test.

0
Gal Margalit