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

Ubuntu 20.04 VPS上Puppeteer无沙箱启动及页面报错求助

Puppeteer 在 Ubuntu 20.04 VPS 上的启动与页面报错解决方案

一、无沙箱启动的正确配置与替代方案

1. Root 用户下的无沙箱启动配置

Root 用户运行 Puppeteer 必须同时添加 --no-sandbox 和 --disable-setuid-sandbox 参数,仅加前者可能仍存在启动异常,完整启动配置示例:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
  });
  // 后续页面操作逻辑
  await browser.close();
})();

2. 更安全的非 Root 用户运行方式

为规避无沙箱模式的安全风险,建议创建非 Root 用户运行 Puppeteer:

  • 创建专用用户:sudo useradd -m puppeteer-runner
  • 切换至该用户:su - puppeteer-runner
  • 在该用户环境下重新安装 Puppeteer 并运行,无需添加无沙箱参数即可正常启动。

二、页面查询报错的解决方法

报错 TypeError: Cannot read properties of null (reading 'querySelectorAll') 是因为调用 querySelectorAll 的前置元素为 null(即前置选择器未匹配到任何元素),可通过以下方式修复:

1. 确保页面完全加载

在执行查询前等待页面加载完成,可使用 waitForNavigation 或 waitForSelector:

const page = await browser.newPage();
await page.goto('目标页面URL');
// 等待页面网络请求基本完成
await page.waitForNavigation({ waitUntil: 'networkidle2' });
// 或直接等待前置元素出现
await page.waitForSelector('你的前置元素选择器');

2. 优化查询逻辑,增加空值判断

在查询时先判断前置元素是否存在,再执行后续操作:

// 方式一:使用 Puppeteer 内置方法
const parentEl = await page.$('前置元素选择器');
if (parentEl) {
  const childEls = await parentEl.$$('子元素选择器');
  // 处理获取到的子元素
} else {
  console.log('前置元素未找到');
}

// 方式二:在页面上下文内完成判断
const result = await page.evaluate(() => {
  const parent = document.querySelector('前置元素选择器');
  return parent ? Array.from(parent.querySelectorAll('子元素选择器')).map(el => el.innerText) : [];
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:10