Cypress无法弹出登录窗口直接返回401 Unauthorized问题求助
解决Cypress无法触发Windows集成认证窗口的问题
问题根源
Cypress默认会通过自身代理转发所有浏览器请求,所以你看到请求地址是127.0.0.1:49898(Cypress的代理端口),而手动启动的浏览器直接连接目标服务器10.20.120.40:443。这种代理机制会干扰Windows集成认证的触发逻辑,导致无法弹出登录窗口,直接返回401。
解决方案:让Cypress以手动浏览器的环境启动
通过修改Cypress配置,关闭代理并调整浏览器启动参数,让浏览器直接连接目标服务器,就能触发认证窗口,进而配合AutoIT脚本输入凭证。
1. 修改Cypress配置文件(cypress.config.js)
添加以下配置,禁用Cypress代理并配置浏览器允许集成认证:
const { defineConfig } = require('cypress'); module.exports = defineConfig({ e2e: { baseUrl: 'https://example.com', // 跳过Cypress对目标域名的代理注入,让浏览器直接发起请求 experimentalSkipDomainInjection: true, // 视情况关闭跨域安全限制(如果目标站点有跨域需求) chromeWebSecurity: false, setupNodeEvents(on, config) { // 自定义浏览器启动参数 on('before:browser:launch', (browser, launchOptions) => { if (browser.family === 'chromium' && browser.name !== 'electron') { // 禁用浏览器代理,直接连接目标服务器 launchOptions.args.push('--no-proxy-server'); // 允许对目标域名进行NTLM/Kerberos认证 launchOptions.args.push('--auth-server-whitelist=example.com'); launchOptions.args.push('--auth-negotiate-delegate-whitelist=example.com'); } return launchOptions; }); // 添加任务用于调用AutoIT脚本 const { exec } = require('child_process'); on('task', { runAutoIT() { return new Promise((resolve) => { // 替换为你的AutoIT脚本路径 exec('C:/path/to/your/login_script.exe', (error) => { resolve(!error); }); }); }, }); }, }, });
2. 调整测试脚本
在访问页面后调用AutoIT任务,自动处理登录窗口:
cy.visit('/Booking/lists'); // 等待登录窗口弹出(可根据实际情况调整等待时间) cy.wait(1000); // 执行AutoIT脚本输入凭证 cy.task('runAutoIT');
3. 验证效果
启动Cypress运行测试,查看浏览器的网络请求,确认请求已直接发送到10.20.120.40:443,此时Windows集成认证窗口会正常弹出,AutoIT脚本也能正常识别并输入凭证。
注意事项
- 不同版本的Chrome/Edge可能对认证参数有细微调整,若窗口仍不弹出,可查阅对应浏览器的官方文档调整参数。
- 若测试环境处于域内,需确保测试机器已加入正确的域,Kerberos认证才能正常触发。
- 关闭Cypress代理后,请求拦截、修改等依赖代理的特性会失效,需根据测试需求权衡使用。
内容的提问来源于stack exchange,提问作者Ujjawal K
相关产品推荐
相关产品推荐

