关于浏览器:在 Cypress 中,在测试前在 localStorage 中设置一个令牌

In Cypress, set a token in localStorage before test

我想登录并在客户端上设置一个 localStorage 令牌(特别是 jwt)

按照赛普拉斯文档中的建议,我如何使用 cy.request 完成此操作?


这是一个添加命令 cy.login() 的示例,您可以在任何 Cypress 测试中使用该命令,或者放入 beforeEach 挂钩。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cypress.Commands.add('login', () => {
  cy.request({
    method: 'POST',
    url: 'http://localhost:3000/api/users/login',
    body: {
      user: {
        email: '[email protected]',
        password: 'jakejake',
      }
    }
  })
  .then((resp) => {
    window.localStorage.setItem('jwt', resp.body.user.token)
  })

})

那么在你的测试中:

1
2
3
beforeEach(() => {
  cy.login()
})


另外,您还可以使用 cypress-localstorage-commands 包在测试之间持久化 localStorage,因此登录请求只会发出一次:

在 support/commands.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import"cypress-localstorage-commands";

Cypress.Commands.add('login', () => {
  cy.request({
    method: 'POST',
    url: 'http://localhost:3000/api/users/login',
    body: {
      user: {
        email: '[email protected]',
        password: 'jakejake',
      }
    }
  })
  .its('body')
  .then(body => {
    cy.setLocalStorage("jwt", body.user.token);
  })
});

然后,在你的测试中:

1
2
3
4
5
6
7
8
before(() => {
  cy.login();
  cy.saveLocalStorage();
});

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


我已经使用了一些类似 bkuceras answer 的东西有一段时间了。最近,我在整个测试过程中测试多个角色/登录时遇到了一个问题。基本上发生的事情是我以管理员身份登录并进行一次测试,然后我以非管理员身份登录并进行第二次测试。第一个测试运行良好并结束(cypress 清除本地存储),但是当第二个测试开始时,仍然有一些 xhr 请求从第一个测试运行。这些 xhr 请求不再看到触发我的应用程序看到 401 未授权错误并清除本地存储(包括我设置的非管理员令牌)的令牌。现在第二次测试失败了,因为该非管理员令牌在本地存储中不可用。

最终我的解决方案是在测试前预取token,然后在访问的onBeforeLoad函数中设置token。这可确保令牌在您的访问命令之前不会被任何竞争条件清除。

1
2
3
4
5
cy.visit('/app', {
    onBeforeLoad: function (window) {
        window.localStorage.setItem('token', myToken);
    }
})

确实这是一个非常独特的边缘案例,但希望它可以帮助某人,因为我已经花了很多时间来寻找这个解决方案。


我认为应该为这个主题更新标题。 JWT 令牌是本次讨论的主要内容!

主要问题是关于 JWT 令牌,但总的来说,所有现代应用程序都在使用 OIDC Microsoft 文章 - v2-protocols-oidc / ADAL,这是一个非常棘手的情况,仅使用通过 API 调用生成令牌来获取访问权限。
我在这里发现
enter