Quiero guardar / persistir / preservar una cookie o token localStorage que se establece mediante un cy.request () , para que no tenga que usar un comando personalizado para iniciar sesión en cada prueba. Esto debería funcionar para tokens como jwt (json web tokens) que se almacenan en el localStorage del cliente.

15
bkucera 22 may. 2018 a las 18:09

5 respuestas

La mejor respuesta

Desde el Cypress documentos

Para cookies persistentes : de forma predeterminada, Cypress borra automáticamente todas las cookies antes de cada prueba para evitar que se acumule el estado.

Puede incluir en la lista blanca cookies específicas para que se conserven en las pruebas con la API de Cypress.

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

Para localStorage persistente : no está integrado en cajeros automáticos, pero puede lograrlo manualmente ahora porque el método que limpia el almacenamiento local está expuesto públicamente como Cypress.LocalStorage.clear.

Puede hacer una copia de seguridad de este método y anularlo según las claves enviadas.

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)
  }

}
21
bkucera 22 may. 2018 a las 15:09

Para mantener una cookie de token de Google, hay una biblioteca llamada cypress-social-login .
Parece tener otros proveedores de OAuth como un hito.
Es recomendado por el equipo de cipreses y se puede encontrar en la página del complemento de cipreses.

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

Esta biblioteca de Cypress permite realizar inicios de sesión de terceros (piense oauth) para servicios como GitHub, Google o Facebook.

Lo hace delegando el proceso de inicio de sesión en un flujo de titiriteros que realiza el inicio de sesión y devuelve las cookies para la aplicación bajo prueba para que puedan configurarse mediante el flujo de Cypress llamante durante la duración de la prueba.

0
Gal Margalit 28 feb. 2020 a las 14:02

Aquí está la solución que funcionó para mí:

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

Cypress admite el control de la eliminación de cookies: https://docs.cypress.io /api/cypress-api/cookies.html

1
Leo Davtyan 17 oct. 2019 a las 21:54

Para actualizar este hilo, ya hay una mejor solución disponible para preservar las cookies (por @bkucera); pero ahora hay una solución disponible ahora para guardar y restaurar el almacenamiento local entre las pruebas (en caso de que sea necesario). Recientemente me enfrenté a este problema; y encontré esta solución funcionando.

Esta solución es mediante el uso de comandos de ayuda y consumiéndolos dentro de las pruebas,

Dentro - 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]);
  });
});

Luego en prueba,

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

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

Referencia: https://github.com/cypress-io/cypress/issues / 461 # issuecomment-392070888

22
Kondasamy Jayaraman 19 mar. 2019 a las 05:28

Puede agregar su propio comando de inicio de sesión a Cypress y usar los cypress-localstorage-command paquete para persistir localStorage entre pruebas.

En 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);
    });
});

Dentro de tus pruebas:

describe("when user FOO is logged in", ()=> {
  before(() => {
    cy.loginAs("foo@foo.com", "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");
  });
});
1
Javier Brea 22 nov. 2019 a las 07:13