代码之家  ›  专栏  ›  技术社区  ›  kuceb

在Cypress中跨测试保留cookies/localstorage会话

  •  5
  • kuceb  · 技术社区  · 6 年前

    我要保存/保留/保留由 cy.请求() ,这样我就不必使用自定义命令登录每个测试。这应该适用于像 JWT (JSON Web令牌)存储在客户机的本地存储中。

    3 回复  |  直到 6 年前
        1
  •  14
  •   kuceb    6 年前

    从柏树 docs

    用于保存cookie :默认情况下,Cypress会在每次测试前自动清除所有cookie,以防止状态累积。

    您可以使用Cypress将要在测试中保留的特定cookie列入白名单。cookies API:

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

    用于保持本地存储 :它不是内置的ATM,但您现在可以手动实现它,因为清除本地存储的方法公开为cypress.local storage.clear。

    您可以备份此方法,并根据发送的密钥重写它。

    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)
      }
    
    }
    
        2
  •  6
  •   Kondasamy Jayaraman lvnt    5 年前

    为了更新这个线程,已经有了一个更好的解决方案来保存cookie(由@bkucera提供);但是现在有了一个解决方案来保存和恢复测试之间的本地存储(如果需要的话)。我最近面对这个问题,发现这个解决方案是有效的。

    这个解决方案是使用helper命令并在测试中使用它们,

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

    然后在测试中,

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

    参考文献: https://github.com/cypress-io/cypress/issues/461#issuecomment-392070888

        3
  •  0
  •   li xin    6 年前

    下面是一个有用的链接,可以解决像您这样的问题: Preserve cookies through multiple tests

    我的代码如下:

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

    希望能帮助你。