1

我正在我的应用程序上使用 cypress 进行 e2e 测试。在我的情况下,登录是由外部服务管理的。
当我想进入我的应用程序主页 (https://myApplication/home) 时,系统会将我重定向到不同的超级域以登录。
一开始cypress好像可以改超级域名,但是一到外部服务页面进行认证,系统就进入登录错误(好像我们已经登录了,但是不正确)。这种行为不会发生在柏树之外。

是否有替代解决方案来管理赛普拉斯测试中的外部访问,或者是否可以直接从赛普拉斯管理它?

我在 cypress.json 中添加了 chromeWebSecurity:false,当我调用登录链接时,我添加了 failOnStatusCode:false,但它仍然不起作用。

4

3 回答 3

1

假设这是由 SameSite cookie blocking 引起的,那么我一直在解决同样的问题。我通过拦截所有请求、检查它们是否具有 set-cookie 标头并重写 SameSite 属性来解决它。可能有一种更简洁的方法可以做到这一点,因为这确实会使柏树仪表板有点混乱。

SameSiteByDefaultCookies可悲的是,随着 Chrome 94 删除了标志,Zachary Costa 的回答不再有效。

您可以将其添加为命令以便于重用:

在您的命令文件中:

declare namespace Cypress {
  interface Chainable<Subject> {
    disableSameSiteCookieRestrictions(): void;
  }
}

Cypress.Commands.add('disableSameSiteCookieRestrictions', () => {
  cy.intercept('*', (req) => {
    req.on('response', (res) => {
      if (!res.headers['set-cookie']) {
        return;
      }

      const disableSameSite = (headerContent: string): string => {
        return headerContent.replace(/samesite=(lax|strict)/ig, 'samesite=none');
      }

      if (Array.isArray(res.headers['set-cookie'])) {
        res.headers['set-cookie'] = res.headers['set-cookie'].map(disableSameSite);
      } else {
        res.headers['set-cookie'] = disableSameSite(res.headers['set-cookie']);
      }
    })
  });
});

用法:

  it('should login using third party idp', () => {
    cy.disableSameSiteCookieRestrictions();
    //add test body here
  });

或者,在每次测试之前运行它:

  beforeEach(() => cy.disableSameSiteCookieRestrictions());
于 2022-01-13T14:38:45.077 回答
1

在当前版本的 cypress 中,您不能在同一个测试中转到另一个域。这是因为 cypress 将其测试注入浏览器(他们正在解决这个问题)。

因此,今天的一种解决方案是,您需要使用 cy.request 以编程方式执行登录,并自己将身份验证密钥(jwt、cookie、localstorage、令牌或您拥有的)注入浏览器上下文(对于 cookie,这将是 cy.setcookie )。

如果您的登录已经有抽象,请务必检查插件。这通常是 openId 或 ntlm。

于 2021-07-29T18:04:55.213 回答
1

我们遇到了类似的问题,赛普拉斯在完成登录过程后将我们重定向到默认的“您未登录”页面。我不确定这是否正是您遇到的问题,但以防万一,这是我们的解决方案。在我们的案例中,问题是由 Chrome 的“Same Site Cookies”功能与 Cypress 的交互不佳引起的,因此我们需要禁用它。在您的plugins/index.js文件中,您将添加以下代码:

module.exports = (on, config) => {
  on('before:browser:launch', (browser, launchOptions) => {
    if (browser.name === 'chrome') {
      launchOptions.args.push('--disable-features=SameSiteByDefaultCookies');
    }
    return launchOptions;
  });
};

请注意,如果您已经设置了 launchOptions,则只需将此代码添加到其中,这样就不会发生冲突。

希望这也适用于您!

于 2021-07-28T16:56:53.473 回答