Cypress.io 中是否有编程方式来更改用户代理?

Is there a programmatic way to change user agent in Cypress.io?

我有一些广告调用仅在移动设备上进行。在 Chrome 中,我可以使用设备模式并模拟移动设备,并且从服务器生成的广告调用是针对移动设备正确定制的。我不确定 Chrome 是如何做到这一点的,除了可能通过发送不同的用户代理。

在Cypress.io文档中,它说可以在配置文件中更改用户代理(Cypress.json)。但是,我需要 运行 测试桌面视口,然后是带有移动用户代理的移动视口。有没有办法以编程方式更改用户代理?

更新:根据https://github.com/cypress-io/cypress/issues/3873,Cypress 3.3.0 在cy.request() 中使用user-agent 属性 是可能的和 cy.visit().

如果您需要,例如,将 userAgent 设置为 Googlebot:

cy.visit(url, {
    headers: {
        'user-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
    }
});

赛普拉斯 3.3.0 之前的原始答案

before(() => {
    cy.visit(url, {
        onBeforeLoad: win => {
            Object.defineProperty(win.navigator, 'userAgent', {
                value: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
            });
        },
    });
});

其他答案没有设置底层 HTTP 请求的 User-Agent header,只是 win.navigatoruserAgent 属性。要将 User-Agent header 设置为所有 HTTP 请求的自定义值,您可以设置 userAgent configuration option:

{
  // rest of your cypress.json...
  "userAgent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
}

现在 cypress 支持在 header 中为 cy.visit 以及 cy.request 传递用户代理:

it('Verify Social Sharing Meta Tags', () => {
  cy.visit(portalURL + '/whats_new/140', {
    headers: {
      'user-agent': 'LinkedInBot/1.0 (compatible; Mozilla/5.0; Apache-HttpClient +http://www.linkedin.com)',
    }
  });

  cy.document().get('head meta[name="og:type"]')
    .should('have.attr', 'content', 'website');
});

https://on.cypress.io/changelog#3-3-0

2021 年 8 月 12 日更新: