在运行测试之前如何登录和注销用户

时间:2020-08-02 18:39:35

标签: javascript cypress

在赛普拉斯中,我正在尝试在后端进行测试。我真的很难控制用户是否已登录。

在开发功能时,我正在尝试自动化我所做的所有测试。我花了很多时间和精力来控制用户是否登录。

我正在寻找执行此操作的命令

  1. 在开始任何测试时注销任何用户(如果已登录)。
  2. 一种执行类似cy.loginUser( 'foo@example.org', 'password' )的快速方法吗?

因为这必须在许多测试之前进行,所以如果可以简化它会很好。

它正在Laravel / Vue应用程序上使用(因此使用CSRF令牌)。

我当前的尝试:

Cypress.Commands.add( "loginUser", ( email, password ) => {
  cy.server();
  
  // Source: https://github.com/cypress-io/cypress/issues/413
  sessionStorage.clear();
  cy.clearCookies();
  cy.clearLocalStorage();
  cy.window().then((win) => {
  win.sessionStorage.clear()
  });
  
  cy.visit( Cypress.env( 'baseUrl' ) + "/login");
  
  cy.location().should((loc) => {
    expect(loc.pathname).to.eq('/login')
  });
  
  cy.get("head meta[name=csrf-token]")
    .then((meta) => {
    const csrf = meta[0].content;
  
    cy.request({
      method: 'POST',
      url: '/login',
      body: {
        _token: csrf,
        email: email,
        password: password
      }
    });
  });
  
  cy.visit( Cypress.env( 'baseUrl' ) + "/login");
});

问题所在:

  • 出于某种奇怪的原因...每隔第二次,该用户将保持从上一个会话的登录状态。但是,如果发生这种情况,那么我只需要再次运行它-然后用户将注销。它在驱赶我香蕉。
  • 这并不慢,但是也不快(考虑到我做了无数次)。因此,如果可以更快地完成操作(页面加载较少),那么它将是粉碎。

1 个答案:

答案 0 :(得分:0)

尝试使用另一种方式清除localStorage。例如,我正在使用这些命令来保存,还原和清除存储,并且运行良好。我将这些用于登录/注销。

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

Cypress.Commands.add("clearLocalStorageCache", () => {
  localStorage.clear();
  LOCAL_STORAGE_MEMORY = {};
});
相关问题