Puppeteer page.evaluate返回值与DevTools控制台结果不一致
问题结论
这不是Puppeteer的原生bug,属于代码写法错误。
错误原因
你传入page.evaluate的异步函数没有显式返回计算结果:函数内只写了await + Promise链式调用,但没有把Promise最终resolve的值return出去,函数默认返回undefined,因此外层拿到的结果永远是undefined。
你在DevTools控制台执行相同代码能看到正确结果,是因为浏览器控制台默认会输出顶层执行Promise的resolve值,这个行为和page.evaluate的返回规则不一致——page.evaluate只会序列化传入函数的显式返回值,没有return就只能拿到undefined。
修正代码
推荐两种可正常运行的写法,同时增加了边界判断,避免无SW注册、SW未进入active状态时抛出异常:
- async/await 写法:
const isCorrectSW = await page.evaluate(async () => { const registrations = await navigator.serviceWorker.getRegistrations(); // 兜底判断,避免访问undefined属性报错 return registrations[0]?.active?.scriptURL.endsWith('/target.js') ?? false; });
- Promise链写法:
const isCorrectSW = await page.evaluate(() => { // 直接return整个Promise链,evaluate会等待Promise resolve后返回结果 return navigator.serviceWorker.getRegistrations() .then(registrations => registrations[0]?.active?.scriptURL.endsWith('/target.js') ?? false); });
注意:原写法里硬等10秒的逻辑并不稳妥,如果要精准等待SW注册完成,也可以用
page.waitForFunction轮询判断结果,替代固定时长等待。
内容的提问来源于stack exchange,提问作者rschristian
相关产品推荐
相关产品推荐

