You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:24:02