Cypress执行点击事件时如何处理服务端身份认证?
问题根因
该报错由Cypress默认运行机制与IBM Navigator for i(AS/400)认证逻辑不兼容导致。UFT、Protractor直接驱动原生浏览器透传全量认证上下文,手动操作也不会修改原始请求,但Cypress内置的请求代理层会默认拦截、剥离三类AS/400后端强校验的认证信息:
- LTPA/LTPA2令牌、AS400专有认证Cookie
- NTLM/Kerberos集成认证的自动凭据
- 原生点击事件携带的隐式认证上下文
因此部分链接点击时会被后端判定为未授权请求抛出错误。
修复方案
1. 基础配置放行认证信息
修改Cypress配置文件,关闭默认安全拦截、配置认证凭据自动透传、保留全量认证Cookie。cypress.config.js配置示例:
const { defineConfig } = require("cypress"); module.exports = defineConfig({ e2e: { baseUrl: "替换为自身环境的IBM Navigator访问地址", chromeWebSecurity: false, experimentalSessionAndOrigin: true, setupNodeEvents(on, config) { on("before:browser:launch", (browser, launchOptions) => { if (browser.family === "chromium") { // 配置Chrome自动传递NTLM认证凭据,关闭SameSite Cookie拦截 launchOptions.args.push( "--auth-server-whitelist=*", "--auth-negotiate-delegate-whitelist=*", "--disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure" ); return launchOptions; } }); }, }, });
在测试用例全局前置钩子中添加Cookie保留逻辑,避免页面跳转时认证态被Cypress自动清除:
beforeEach(() => { Cypress.Cookies.preserveOnce( "LtpaToken", "LtpaToken2", "JSESSIONID", "PD-S-SESSION-ID" ); });
2. 替换点击逻辑为原生事件触发
Cypress默认的合成事件点击不会触发IBM Navigator绑定在原生鼠标事件上的认证参数拼接逻辑,替换点击代码如下:
// 替换原有 cy.get(元素选择器).click() 逻辑 cy.get("替换为5250 Emulation导航入口的元素选择器") .scrollIntoView() .should("be.visible") .click({ force: true, eventConstructor: "MouseEvent", waitForAnimations: true });
3. 预请求预埋认证态(兜底方案)
上述配置仍不生效时,在点击导航前先通过cy.request手动携带全量Cookie请求目标页面,提前在浏览器上下文中种下合法访问态,再执行导航操作:
cy.getCookies().then(cookies => { const cookieStr = cookies.map(c => `${c.name}=${c.value}`).join("; "); cy.request({ url: "替换为5250 Emulation页面对应的相对路径", headers: { Cookie: cookieStr }, failOnStatusCode: false }); }); // 预请求完成后再执行点击导航操作
注意事项
- 测试必须使用Chrome/Edge浏览器运行,不要用Cypress默认的Electron,Electron对IBM NTLM认证兼容性极差
- 登录步骤必须走页面输入账号密码的完整流程,不要用接口代登,否则会缺失后端校验的浏览器指纹类参数
- 环境开启双因子认证时,需要在Cypress请求拦截逻辑中添加对应认证头的白名单,避免被代理层篡改
内容的提问来源于stack exchange,提问作者BubbaDrew
相关产品推荐
相关产品推荐

