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
相关产品推荐
相关产品推荐

