Puppeteer 无法在 Arch 上运行 NodeJS 17 Linux

Puppeteer not working NodeJS 17 on Arch Linux

我已经开始使用 Puppeteer,但出于某种原因我无法在我的盒子上使用它。这个错误似乎是一个常见问题 (, ),但所有的解决方案都没有为我解决这个错误。我已经用一个干净的节点包对其进行了测试(参见复制),并且我已经从官方 Puppeteer 'Getting started' 网页中获取了示例。

我该如何解决这个错误?

版本和硬件

/tmp/so_example » uname -a
Linux tom.arch 5.15.2-arch1-1 #1 SMP PREEMPT Fri, 12 Nov 2021 19:22:10 +0000 x86_64 GNU/Linux
/tmp/so_example » node --version
v17.1.0
/tmp/so_example » npm list
so_example@1.0.0 /tmp/so_example
└── puppeteer@11.0.0
/tmp/so_example » cat /proc/meminfo
MemTotal:       32492764 kB
MemFree:          600032 kB
MemAvailable:   24446556 kB
Buffers:         7149964 kB
Cached:          9549048 kB
SwapCached:            0 kB
Active:          9843552 kB
Inactive:       10980476 kB
Active(anon):     462692 kB
Inactive(anon):  5481100 kB
Active(file):    9380860 kB
Inactive(file):  5499376 kB
Unevictable:      723108 kB
Mlocked:           17336 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:       4848276 kB
Mapped:           625156 kB
Shmem:           1816292 kB
KReclaimable:    9438608 kB
Slab:           10007568 kB
SReclaimable:    9438608 kB
SUnreclaim:       568960 kB
KernelStack:       26240 kB
PageTables:        63012 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16246380 kB
Committed_AS:   16256172 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      103964 kB
VmallocChunk:          0 kB
Percpu:            14592 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:     5072608 kB
DirectMap2M:    20758528 kB
DirectMap1G:     7340032 kB
/tmp/so_example » lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  16
  On-line CPU(s) list:   0-15
Vendor ID:               GenuineIntel
  Model name:            Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
    CPU family:          6
    Model:               165
    Thread(s) per core:  2
    Core(s) per socket:  8
    Socket(s):           1
    Stepping:            2
    CPU max MHz:         5100.0000
    CPU min MHz:         800.0000
    BogoMIPS:            4601.60
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology
                         nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnow
                         prefetch cpuid_fault epb invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt inte
                         l_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp pku ospke sgx_lc md_clear flush_l1d arch_capabilities
Virtualization features:
  Virtualization:        VT-x
Caches (sum of all):
  L1d:                   256 KiB (8 instances)
  L1i:                   256 KiB (8 instances)
  L2:                    2 MiB (8 instances)
  L3:                    16 MiB (1 instance)
NUMA:
  NUMA node(s):          1
  NUMA node0 CPU(s):     0-15
Vulnerabilities:
  Itlb multihit:         KVM: Mitigation: VMX disabled
  L1tf:                  Not affected
  Mds:                   Not affected
  Meltdown:              Not affected
  Spec store bypass:     Mitigation; Speculative Store Bypass disabled via prctl and seccomp
  Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:            Mitigation; Enhanced IBRS, IBPB conditional, RSB filling
  Srbds:                 Not affected
  Tsx async abort:       Not affected

复制

/tmp/so_example » npm init -y
Wrote to /tmp/so_example/package.json:

{
  "name": "so_example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
/tmp/so_example » npm i puppeteer
added 57 packages, and audited 58 packages in 11s

8 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
/tmp/so_example » npm list
so_example@1.0.0 /tmp/so_example
└── puppeteer@11.0.0
/tmp/so_example » echo "const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://google.com');
  await browser.close();
})();" > example.js
/tmp/so_example » nvm use 17
Now using node v17.1.0 (npm v8.1.2)

/tmp/so_example » node example.js
/tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/Connection.js:226
                error: new Errors_js_1.ProtocolError(),
                       ^

ProtocolError: Protocol error (Page.navigate): Target closed.
    at /tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/Connection.js:226:24
    at new Promise (<anonymous>)
    at CDPSession.send (/tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/Connection.js:222:16)
    at navigate (/tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/FrameManager.js:148:47)
    at FrameManager.navigateFrame (/tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/FrameManager.js:131:13)
    at Frame.goto (/tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/FrameManager.js:500:41)
    at Page.goto (/tmp/so_example/node_modules/puppeteer/lib/cjs/puppeteer/common/Page.js:1167:53)
    at /tmp/so_example/example.js:6:14
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  originalMessage: undefined
}

Node.js v17.1.0

我在以下版本中遇到同样的错误:

/tmp/so_example » nvm use 16
Now using node v16.13.0 (npm v8.1.0)
/tmp/so_example » nvm use 15
Now using node v15.14.0 (npm v7.7.6)
/tmp/so_example » nvm use 14
Now using node v14.18.1 (npm v6.14.15)

更新:Docker

我也在 this guide 之后在 Docker 上尝试了相同的安装。使用此设置,它似乎可以工作。这表明这是一个 OS/package 相关问题。

/tmp/so_example » echo "const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: [
        '--disable-gpu',
        '--disable-dev-shm-usage',
        '--disable-setuid-sandbox',
        '--no-sandbox',
    ]
  });
  const page = await browser.newPage();
  await page.goto('https://google.com');


  await browser.close();
  console.log('If I made it here there is no error');
})();" > example.js
/tmp/so_example » echo "FROM node:17-slim

# Chrome dependencies
RUN apt-get update && apt-get -f install -y \
    fonts-liberation \
    gconf-service \

    #libappindicator1 \

    libasound2 \
    libatk1.0-0 \
    libcairo2 \
    libcups2 \
    libfontconfig1 \
    libgbm-dev \
    libgdk-pixbuf2.0-0 \
    libgtk-3-0 \
    libicu-dev \
    libjpeg-dev \
    libnspr4 \
    libnss3 \
    libpango-1.0-0 \
    libpangocairo-1.0-0 \
    libpng-dev \
    libx11-6 \
    libx11-xcb1 \
    libxcb1 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxext6 \
    libxfixes3 \
    libxi6 \
    libxrandr2 \
    libxrender1 \
    libxss1 \
    libxtst6 \
    xdg-utils

COPY . ./
RUN npm install

# Make browser executable for puppeteer
RUN chmod -R o+rwx node_modules/puppeteer/.local-chromium

CMD [\"node\", \"example.js\"]" > Dockerfile
/tmp/so_example » docker run -it $(docker build -q .)
If I made it here there is no error

编辑:静态铬路径

正如对这个问题的评论,添加

executablePath: 'path/to/local/chromium'

对 puppeteer 配置进行复制 运行 在系统上。我仍然想知道为什么用 puppeteer 打包的 chromium 不起作用,因为在多开发环境中使用本地可执行文件的静态路径是一种非常糟糕的做法。

评论太多了,我就在这里总结一下吧。也许它会对您或其他人有所帮助。我还应该提到这是针对企业代理背后的 RHEL EC2 实例(不是 Arch Linux),但我仍然觉得它可能有所帮助。我必须执行以下操作才能让木偶操纵者工作。这是直接来自我的文档,但我不得不手动插入内容,因为我的文档位于内部网上。

我必须手动安装所有这些库。我也不知道 Arch Linux 等价物是什么。有些与您的问题重复,但我不认为它们都是:
pango libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr GConf2 alsa-lib atk gtk3 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc liberation-mono-fonts liberation-narrow-fonts liberation-narrow-fonts liberation-sans-fonts liberation-serif-fonts glib2

如果 Arch Linux 使用 SELinux,您可能还需要 运行 这个:
setsebool -P unconfirmed_chrome_sandbox_transition 0

还值得将 dumpio: true 添加到您的调试选项中。应该给你一个更详细的木偶输出,而不是一般的错误。正如我在评论中提到的。我有这个选项 ignoreDefaultArgs: ['--disable-extensions']。我不能告诉你为什么,因为我不记得了。我认为这与此问题有关,但也可能与我的公司代理有关。

令人惊讶的是,更新到 Puppeteer 版本 12.0.0 后,一切似乎都正常。到目前为止,我还不知道是什么导致了这个问题,又是什么让它消失了,但现在可以了。

编辑:可以找到变更日志 here,大概是对 Chromium 97.0.4692.0 的更新解决了这个问题。