Puppeteer常见问题排查与解决方案指南

Puppeteer常见问题排查与解决方案指南

puppeteer Puppeteer是Google开发的自动化操控Chrome浏览器的API,通过它可以实现网页抓取、自动化测试、生成预渲染内容等功能,尤其在Web应用的端到端测试和爬虫领域有广泛应用。 puppeteer 项目地址: https://gitcode.com/gh_mirrors/pu/puppeteer

前言

Puppeteer作为一款强大的Node.js库,为开发者提供了控制Chrome/Chromium浏览器的高级API。但在实际使用过程中,开发者可能会遇到各种环境配置和运行问题。本文将系统梳理Puppeteer使用中的常见问题及其解决方案,帮助开发者快速定位和解决问题。

模块加载问题

找不到内部模块错误

问题现象:出现Cannot find module 'puppeteer-core/internal/...'错误。

原因分析

  1. Node.js版本低于14
  2. 使用了自定义模块解析器(如jest-resolve)

解决方案

  1. 升级Node.js到14或更高版本
  2. 如果是自定义解析器问题,升级相关依赖(如jest及其解析器)

浏览器下载与缓存问题

本地找不到浏览器

问题现象Could not find expected browser locally错误。

背景说明:从v19.0.0开始,Puppeteer默认将浏览器下载到~/.cache/puppeteer目录。

解决方案

  1. 环境变量方式

    PUPPETEER_CACHE_DIR=$(pwd) npm install puppeteer
    PUPPETEER_CACHE_DIR=$(pwd) node <脚本路径>
    
  2. 配置文件方式: 在项目根目录创建.puppeteerrc.cjs文件:

    const {join} = require('path');
    
    module.exports = {
      cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    };
    

    然后重新安装Puppeteer使配置生效。

HTTP导航问题

ERR_BLOCKED_BY_CLIENT错误

问题现象:导航到HTTP网址时出现net::ERR_BLOCKED_BY_CLIENT错误。

原因:Chrome的HttpsFirstBalancedModeAutoEnable功能会阻止HTTP网站访问。

解决方案

  1. 通过启动参数禁用该功能:
    const browser = await puppeteer.launch({
      args: ['--disable-features=HttpsFirstBalancedModeAutoEnable'],
    });
    
  2. 或者点击警告页面上的继续按钮(可通过Puppeteer自动化)

Windows系统问题

Chrome无法启动

问题现象:Chrome因策略限制无法启动。

原因:某些Chrome策略强制要求启用扩展,而Puppeteer默认禁用扩展。

解决方案

const browser = await puppeteer.launch({
  enableExtensions: true,
});

沙盒错误

问题现象:出现sandbox_win.cc相关错误。

解决方案

  1. 自动方案(Puppeteer v22.14.0+): Puppeteer会自动配置权限。

  2. 手动方案

    icacls "%USERPROFILE%/.cache/puppeteer/chrome" /grant *S-1-15-2-1:(OI)(CI)(RX)
    

Linux系统问题

依赖缺失

通用检查方法

ldd chrome | grep not

Debian/Ubuntu依赖

sudo apt install ca-certificates fonts-liberation libasound2 libatk-bridge2.0-0 \
libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 \
libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 \
libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \
libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 \
libxss1 libxtst6 lsb-release wget xdg-utils

CentOS依赖

sudo yum install alsa-lib.x86_64 atk.x86_64 cups-libs.x86_64 gtk3.x86_64 \
ipa-gothic-fonts libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 \
libXext.x86_64 libXi.x86_64 libXrandr.x86_64 libXScrnSaver.x86_64 \
libXtst.x86_64 pango.x86_64 xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi \
xorg-x11-fonts-cyrillic xorg-x11-fonts-misc xorg-x11-fonts-Type1 \
xorg-x11-utils

sudo yum update nss -y

ARM64架构问题

注意:Chrome目前不提供Linux ARM64二进制文件,只有Mac ARM64版本。

沙盒配置

禁用沙盒(不推荐)

const browser = await puppeteer.launch({
  args: ['--no-sandbox'],
});

AppArmor问题(Ubuntu 23.10+)

问题现象No usable sandbox!错误。

解决方案:参考Chrome官方文档解决AppArmor限制。

CI环境配置

Travis CI配置示例

language: node_js
node_js: node
services: xvfb
script:
  - npm test

CircleCI配置要点

  1. 使用Node.js镜像
  2. 安装必要依赖(如libXtst6)
  3. 对于Jest用户,设置合理的maxWorkers

Docker配置

基础Dockerfile示例

FROM node:14-slim

RUN apt-get update && apt-get install -y wget gnupg \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
    && apt-get update \
    && apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
      --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

RUN npm init -y && \
    npm i puppeteer \
    && groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
    && mkdir -p /home/pptruser/Downloads \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /node_modules

USER pptruser

Alpine Linux特殊说明

Chrome官方不支持Alpine,需要手动安装兼容版本:

FROM alpine

RUN apk add --no-cache \
      chromium \
      nss \
      freetype \
      harfbuzz \
      ca-certificates \
      ttf-freefont \
      nodejs \
      yarn

ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

RUN yarn add puppeteer@13.5.0  # 与Chromium 100兼容的版本

RUN addgroup -S pptruser && adduser -S -G pptruser pptruser \
    && mkdir -p /home/pptruser/Downloads /app \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /app

USER pptruser

最佳实践建议

  1. 保持环境更新:定期更新Node.js、Puppeteer和系统依赖
  2. 优先使用沙盒:除非绝对必要,不要禁用沙盒
  3. 合理配置缓存:大型项目应考虑集中管理浏览器缓存
  4. CI环境优化:根据CI平台特性调整配置
  5. 错误处理:对常见错误添加适当的捕获和处理逻辑

通过以上解决方案,开发者应该能够解决Puppeteer使用过程中遇到的大部分环境配置和运行问题。如遇特殊问题,建议查阅Puppeteer官方文档和issue跟踪系统获取最新解决方案。

puppeteer Puppeteer是Google开发的自动化操控Chrome浏览器的API,通过它可以实现网页抓取、自动化测试、生成预渲染内容等功能,尤其在Web应用的端到端测试和爬虫领域有广泛应用。 puppeteer 项目地址: https://gitcode.com/gh_mirrors/pu/puppeteer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苗韵列Ivan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值