typescript 在Cypress中通过JWT令牌登录用户

edqdpe6u  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(177)

我有一个场景,我需要调用多个API来获取访问密钥和密钥以获取AWS Secret Manager密钥。然后我使用这些密钥生成JWT令牌并登录用户。虽然我可以成功登录,但在此之后编写的任何命令都会导致抛出异常。
CypressError:Cypress检测到您从一个命令返回了一个promise,同时还调用了该promise中的一个或多个cy命令。
code:helper类:

generateTokenAndLogin(email: string) {
    cy.request({
      url: "https://xxx/get-access-key",
    }).then((access) => {
      this.accessKey = access.body.value;
      cy.request({
        url: "https://xxx/get-secret-key",
      }).then((secret) => {
        this.secretKey = secret.body.value;
        //this is returning secret key correctly
        this.getSecretKey().then((response) => {
          //fetch secret from aws
          cy.task("jwt", {
            payload: {
              email: email,
            },
            privateKey: response.SecretString as string,
          }).then((token) => {
            cy.visit(`myweb.com/login?id_token=${token}`);
          });
        });
      });
    });
  }

inside module.exports

on('task', {
    jwt(data: any) {
        const token = jwt.sign(data.payload, data.privateKey, { algorithm: 'RS256', expiresIn: '1h'});
        return token;
    }
});

柏树试验:

describe('Testing', () => {
  const jwtHelper = new JWTHelper();
  before(()=> {
    jwtHelper.generateToken();
  })
  it('JWT', () => {
    cy.get('left-nav').should('be.visible'); //failing on all subsequent commands
  });
});

Cypress登录功能在之后没有命令时成功,所有后续命令都失败。

rt4zxlrg

rt4zxlrg1#

可能是嵌套很深的cy.visit()导致了这个问题,您可以检查错误消息的正文。
如果是,请尝试将令牌保存为环境变量。

generateTokenAndLogin(email: string) {
  cy.request('https://xxx/get-access-key').then((access) => {
      this.accessKey = access.body.value;
      cy.request('https://xxx/get-secret-key').then((secret) => {
        this.secretKey = secret.body.value;
        //this is returning secret key correctly
        this.getSecretKey().then((response) => {
          //fetch secret from aws
          cy.task("jwt", {
            payload: {
              email: email,
            },
            privateKey: response.SecretString as string,
          })
          .then(token => Cypress.env('token', token))
        });
      });
    });
  }
const jwtHelper = new JWTHelper();

before(() => {
  jwtHelper.generateToken();
})

beforeEach(() => {
  cy.visit(`myweb.com/login?id_token=${Cypress.env('token')}`)
})

it('JWT', () => {
  cy.get('left-nav').should('be.visible'); 
})

相关问题