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

Puppeteer执行evaluate时报page未定义错误如何解决

错误根因说明

Puppeteer 的 page.evaluate() 方法内的代码运行在浏览器沙箱环境中,仅能访问浏览器端的全局对象(比如 document、window),而 page 是 Node.js 运行环境下的实例对象,无法直接传递到浏览器上下文,因此才会报 page is not defined 的错误。

你不需要也无法将 page 实例传入 evaluate 函数,正确解法是拆分逻辑:DOM 读取操作放在 evaluate 内执行,页面交互、元素等待等操作放在 Node.js 侧通过 page 实例执行。


修复后的完整代码
const variations = [];
// 第一步:在浏览器侧拿到所有下拉选项的值,跳过第一个默认选项
const optionValues = await page.evaluate(() => {
  const selectEl = document.getElementById('variante');
  return Array.from(selectEl.options).slice(1).map(opt => opt.value);
});

product['Variations'] = optionValues.length || 1;

// 第二步:在Node.js侧循环操作页面,逐个选择选项读取变体信息
for (const optionValue of optionValues) {
  // 若必须点击按钮才会触发下拉展开,可放开下一行注释
  // await page.click('.flaticon-bottom4');

  // 选择当前变体选项
  const selectEl = await page.waitForSelector('#variante');
  await selectEl.select(optionValue);
  
  // 等待动态加载的变体信息渲染完成,避免拿到旧数据
  await page.waitForSelector('.woocommerce-variation-description p', { timeout: 3000 });
  await page.waitForSelector('.woocommerce-variation-price', { timeout: 3000 });
  
  // 读取当前渲染的变体信息
  const variantInfo = await page.evaluate((currentOptName) => {
    const description = document.querySelector('.woocommerce-variation-description p')?.innerText || 'N/A';
    const price = document.querySelector('.woocommerce-variation-price')?.innerText || 'N/A';
    return {
      'Variation name': currentOptName,
      'Variation price': price,
      'Variation description': description
    };
  }, optionValue); // 浏览器侧需要的参数可通过evaluate的入参传递
  
  variations.push(variantInfo);
}

其他注意事项
  • 你原有代码存在变量名拼写错误:声明的变量是variationtName,赋值时误用为variantName,会导致变体名称永远返回N/A,上述代码已修复该问题
  • 下拉框选择器优先用ID #variante,比class选择器更稳定,不会因为元素新增其他class导致匹配失败

内容的提问来源于stack exchange,提问作者Vincenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:45:02