Cypress:登录身份验证重定向到另一个域:解决方案



我知道Cypress不允许从一个域切换到另一个域,因为它会出现以下错误:

chrome-error://chromewebdata/

不过,我需要一个变通办法。我正在为多种环境提供测试集:STAGE、DEMO、PROD.

使用DEMOPROD,在身份验证阶段(用户名/密码(,保持在同一域内:

  • 访问:https://[demo|www].foo.com
  • AUTHhttps://account.foo.com/auth>gt;用户名>gt;密码
  • 同意https://[demo|www].foo.com/action...

使用STAGE,身份验证阶段切换到另一个域:

  • 访问:https://[stage].foo.com
  • AUTHhttps://account.bar.com/auth>gt;用户名>gt;密码
  • 同意https://[stage].foo.com/action...

因此,由于域翻转,Cypress无法从VISIT重定向到AUTH。这是STAGE的阻塞测试。

建议采用哪些变通方法?

  • 木偶
  • 使用cy.request()的原生柏树

参考:

  • 处理Cypress url重定向
  • 使用cypr:chrome的e2e测试中的身份验证错误-error://chromewebdata

谢谢您,非常感谢您的帮助。

我采用的方法类似于使用CSRF令牌登录Cypress Recipe

如前所述,每个部署都有自己的网站URL,然后是

帐户登录URL首先需要的是帐户登录页面中的CSRF令牌,其URL在此处称为$baseUrl:

Cypress.Commands.add('cmdGetCSRF', ($baseUrl) => {
cy.log('COMMAND cmdGetCSRF');
expect($baseUrl)
.to.be.a('string')
.not.empty
cy.request($baseUrl)
.its('body')
.then(($body) => {
const $html = Cypress.$($body)
cy.log('html', $html)
const csrf = $html.find('input[name="__RequestVerificationToken"]').val()
expect(csrf)
.to.be.a('string')
.not.empty
return cy.wrap(csrf)
})
})

然后在提供给将执行登录的cy.request()requestOptionsbody内,提供一次性CSRF令牌:

const body: { [key: string]: string } = {
email: $envCypress.account_username,
password: $envCypress.account_password,
__RequestVerificationToken: $csrfToken
};

Cypress最近添加了一个新的实验功能,用于在多个源上运行测试。也有跨来源登录的例子。关于experimentalSessionAndOrigin功能的更多信息:

  • https://docs.cypress.io/api/commands/origin
  • https://docs.cypress.io/api/commands/session

最新更新