Puppeteer 的 chromium 打开时出现错误并停止 puppeteer 脚本

Posted

技术标签:

【中文标题】Puppeteer 的 chromium 打开时出现错误并停止 puppeteer 脚本【英文标题】:Puppeteer's chromium opens with error and halts puppeteer script 【发布时间】:2019-12-29 01:08:17 【问题描述】:

我正在尝试在我的系统上设置 puppeteer。我遵循了许多不同的教程和指南,但我一直遇到这个问题。 Chromium 似乎无法正确打开。以下内容基于我遵循的指南之一的示例测试。

我从铬得到的错误:

CLI 上的错误消息:

(node:17168) UnhandledPromiseRejectionWarning: Error: Page crashed!
    at Page._onTargetCrashed (C:\Users\dgros\Documents\Git\test\pup\node_modules\puppeteer\lib\Page.js:215:24)
    at CDPSession.Page.client.on.event (C:\Users\dgros\Documents\Git\test\pup\node_modules\puppeteer\lib\Page.js:123:56)
    at CDPSession.emit (events.js:198:13)
    at CDPSession._onMessage (C:\Users\dgros\Documents\Git\test\pup\node_modules\puppeteer\lib\Connection.js:200:12)
    at Connection._onMessage (C:\Users\dgros\Documents\Git\test\pup\node_modules\puppeteer\lib\Connection.js:112:17)
    at WebSocketTransport._ws.addEventListener.event (C:\Users\dgros\Documents\Git\test\pup\node_modules\puppeteer\lib\WebSocketTransport.js:44:24)
    at WebSocket.onMessage (C:\Users\dgros\Documents\Git\test\pup\node_modules\ws\lib\event-target.js:120:16)
    at WebSocket.emit (events.js:198:13)
    at Receiver.receiverOnMessage (C:\Users\dgros\Documents\Git\test\pup\node_modules\ws\lib\websocket.js:789:20)
    at Receiver.emit (events.js:198:13)
(node:17168) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function wit
hout a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:17168) [DEP0018] DeprecationWarning: Unhandled promise 

我跟随的指南来自:https://www.youtube.com/watch?v=IvaJ5n5xFqU

我已经安装了 node.js 的 10.16.0 版本和 puppeteer 的 1.19.0 版本

我安装了 puppeteer:

npm i puppeteer

我使用以下命令从 Git Bash 运行的示例测试:“node index.js”:

const puppeteer = require('puppeteer');

(async function main() 
    try 

        const browser = await puppeteer.launch( headless: false, ignoreDefaultArgs: ['--disable-extensions'], devtools: true);
        const page = await browser.newPage();

        page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/76.0.3809.100 Safari/537.36')

        await page.goto('https://experts.shopify.com');

        await page.waitForNavigation();

        console.log('its showing');

     catch (e) 
        console.log('our error', e);
    
)();

同样的错误产生于:

const puppeteer = require('puppeteer');

(async function main() 
    try 
        const browser = await puppeteer.launch( headless: false, ignoreDefaultArgs: ['--disable-extensions'], devtools: true);
        const page = await browser.newPage();

     catch (e) 
        console.log('our error', e);
    
)();

当我省略带有“browser.newPage()”的行时,铬“Aw,Snap!”错误仍然存​​在,但 UnhandledPromiseRejectionWarning 错误消息消失。

预期:chromium 打开,导航到“https://experts.shopify.com”,等待它加载,然后将“它的显示”打印到 Git Bash CLI。

实际情况:chromium 打开时出现错误,并向 Git Bash CLI 输出一条错误消息,没有其他任何反应。

为什么 Chromium 打开时出错?如何让脚本运行并按预期运行?

【问题讨论】:

一些事情。您是否按照视频中的方式安装了 puppeteer(推荐的方式是使用 npm i puppeteeryarn add puppeteer 安装)?您使用的是哪个版本的 Node (node -v),您是否还可以在打开 puppeteer 时将 devtools 选项设置为 true? @NickClark 我已经编辑了帖子并包含了信息。将 devtools 选项设置为 true 并没有改变行为。 查看错误本身(puppeteer protocol error (page.enable) target closed),例如:***.com/a/51989560/451969 @JaredFarrish 发生错误是因为我关闭了脚本中间的选项卡,因为它显示错误。据我了解,上面的错误消息并没有描述我在使用 chromium 时遇到的错误,这是我停止脚本的结果,因为它不起作用。 @DanielGros,安装了哪个版本的 puppeteer? chrome 打开时看到的错误是什么(据我所知,您只添加了关闭 chromium 时出现的错误)? 【参考方案1】:

您的问题似乎是由异步编排问题引起的(请参阅issue 和issue)。

为了解决这个问题,您可以尝试使用以下两种解决方案之一:

解决方案 1

await Promise.all([
    page.goto('https://experts.shopify.com'),
    page.waitForNavigation()
]);

解决方案 2

const waitForNavigation = page.waitForNavigation();
await page.goto('https://experts.shopify.com');
await waitForNavigation;

希望对你有帮助!

【讨论】:

感谢您的回复!问题似乎与“browser.newPage()”有关,因为在该行之后注释所有内容仍然会产生相同的错误。并评论包括“browser.newPage()”在内的所有内容可以消除错误。我尝试了您推荐的两种解决方案,但似乎都没有改变行为。 如果问题出在browser.newPage() 语句上,也许值得尝试删除node_modules 文件夹并重新安装项目依赖项,以防安装出现问题。 我已经做到了,但它似乎不起作用。我让它在虚拟机中工作。在虚拟机中完成了完全相同的设置过程,并且可以正常工作。不知道我的主系统出了什么问题。所以我只是在 vm 中使用 puppeteer。

以上是关于Puppeteer 的 chromium 打开时出现错误并停止 puppeteer 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Puppeteer 错误:未下载 Chromium 修订版

Mac上的Puppeteer / chromium长期提示“接受传入的网络连接?”

puppeteer 无法安装:错误:无法设置 Chromium r782078!设置“PUPPETEER_SKIP_DOWNLOAD”环境变量以跳过下载

使用特定配置打开 Puppeteer(下载 PDF 而不是 PDF 查看器)

如何使用Puppeteer拍摄包含视频的页面的屏幕截图

无法在 Ubuntu 16.04 AWS EC2 实例上使用 puppeteer 启动 chromium headless