解决Playwright在Jenkins中“networkidle”事件无限循环问题
问题原因分析
- 网络环境差异:Jenkins服务器与目标站点的网络链路可能存在延迟、丢包或带宽限制,导致部分请求长时间未完成,甚至触发重试逻辑,始终无法满足
networkidle0(0个活跃网络连接)的条件。 - 页面持续网络请求:目标页面可能存在WebSocket、Server-Sent Events(SSE)或定时轮询的API请求,这类长连接/周期性请求会持续占用网络连接,永远无法触发
networkidle0事件。 - 无头模式行为差异:无头浏览器模式下,部分页面的JavaScript逻辑可能触发与本地有头模式不同的网络请求(比如某些仅在无头环境下加载的统计脚本),或者资源加载策略、缓存机制存在差异,导致请求无法正常完成。
- 请求阻塞/重试:部分请求可能因Jenkins环境的网络限制、证书问题(即使开启
ignoreHTTPSErrors仍可能存在异常)卡住,不断重试却无法完成,导致网络连接一直处于活跃状态。
调试与解决方法
临时绕过networkidle限制
调整waitUntil参数,降低对网络空闲的要求,优先保证测试流程推进:
await page.goto('url', { // 允许最多2个活跃网络连接,比networkidle0更宽松 waitUntil: 'networkidle2', timeout: 60000 }); // 或者直接等待DOM加载完成,不依赖网络状态 await page.goto('url', { waitUntil: 'domcontentloaded', timeout: 60000 });
捕获网络请求日志定位问题
在测试代码中添加网络请求监听,打印所有请求的URL和状态,找出卡住的请求:
// 监听所有请求 page.on('request', request => { console.log(`[REQUEST] ${request.method()} ${request.url()}`); }); // 监听所有响应 page.on('response', response => { console.log(`[RESPONSE] ${response.status()} ${response.url()}`); }); // 监听请求失败/中止事件 page.on('requestfailed', request => { console.log(`[REQUEST FAILED] ${request.url()} - ${request.failure().errorText}`); }); // 原有goto逻辑 await page.goto('url', { waitUntil: 'networkidle0', timeout: 500000 });
将这些日志输出到Jenkins控制台,就能看到哪些请求一直未完成或反复失败,针对性处理。
拦截不必要的持续请求
如果日志显示是统计、广告或其他非核心业务的持续请求,可直接拦截这些请求:
// 拦截所有统计类请求 await page.route('**/*analytics*', route => route.abort()); // 拦截WebSocket连接 await page.route('wss://**/*', route => route.abort()); await page.goto('url', { waitUntil: 'networkidle0', timeout: 60000 });
等待目标元素而非网络状态
跳过网络空闲等待,直接等待测试需要操作的元素出现,确保业务流程能继续:
await page.goto('url', { waitUntil: 'domcontentloaded', timeout: 60000 }); // 等待用户名输入框出现后再执行填充操作 await page.getByPlaceholder('Username').waitFor({ timeout: 60000 }); await page.getByPlaceholder('Username').fill('user');
调整无头模式配置
禁用缓存或调整上下文参数,消除无头模式与本地环境的差异:
test.use({ headless: true, ignoreHTTPSErrors: true, // 禁用缓存,避免环境差异导致的加载问题 context: { cache: 'no-store', // 禁用本地存储状态 storageState: null } });
内容的提问来源于stack exchange,提问作者Carabes
相关产品推荐
相关产品推荐

