Puppeteer报Cannot convert undefined or null to object错误如何解决
问题根因
- Puppeteer 的
page.evaluate()方法运行在浏览器沙箱环境中,返回值需要经过JSON序列化才能传递到Node.js执行上下文。document.querySelectorAll返回的是DOM类型的NodeList对象,不属于可序列化的纯数据类型,跨上下文传递后会被转为null,这就是你校验时拿到空值、抛出类型错误的核心原因。 - 你在浏览器控制台直接执行选择器能正常拿到结果,是因为控制台本身就运行在浏览器上下文,不需要跨环境序列化传输对象。
解决方案
你可以根据业务需求选择以下两种修复方案:
方案1:在page.evaluate内部完成节点处理,返回纯数据
如果你只需要提取节点的属性(比如图片链接、文本内容等),直接在浏览器上下文完成数据提取,返回普通数组即可:
await page.waitForSelector('.carousel .loaded', { timeout: 90000 }) const _img = await page.evaluate(() => { const liList = document.querySelectorAll('.carousel .loaded li'); // 转为普通数组,提取你需要的业务属性 return Array.from(liList).map(li => ({ text: li.textContent.trim(), imgSrc: li.querySelector('img')?.src })); }); // 此时返回的是普通对象数组,可直接校验长度 if (_img.length > 0) { // 执行业务逻辑 }
方案2:使用Puppeteer内置API获取可操作的DOM句柄
如果你后续需要对节点执行点击、输入等交互操作,使用page.$$方法直接获取ElementHandle数组即可,不需要手动调用page.evaluate:
await page.waitForSelector('.carousel .loaded', { timeout: 90000 }) // page.$$ 等价于浏览器环境的document.querySelectorAll,返回Node侧可操作的节点句柄数组 const _img = await page.$$('.carousel .loaded li'); if (_img.length > 0) { // 执行业务逻辑,比如提取第一个节点的文本 const firstText = await _img[0].evaluate(node => node.textContent); }
内容的提问来源于stack exchange,提问作者Juan Pablo Bidabehere
相关产品推荐
相关产品推荐

