Node.JS + Puppeteer:browser.close 冻结进程

Dal*_*eri 5 node.js puppeteer

我正在运行一个非常简单的函数。

module.exports.test = async () => {
    const browser = await puppeteer.launch(puppetOptions);
    try {
        const page = await browser.newPage();
        await page.goto('https://google.com');
        // helper function that pauses for five seconds before moving on
        await pause(5000);
        await browser.close();
        console.log('browser closed');
    } catch (err) {
        console.log(err);
        await browser.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我从我的文件中运行它index.js

const server = app.listen(process.env.PORT || 5000, () => {
    test();    
});
Run Code Online (Sandbox Code Playgroud)

现在我在终端中运行它node index.js。它会打开一个浏览器。它会打开一个新页面并导航到 Google。它等待五秒钟。它关闭浏览器。一切看起来都很棒。我敲击ctrl + c终端来停止该过程,但没有任何反应。通常这是有效的。如果我删除该browser.close功能,ctrl + c则返回到按预期工作,并结束该过程。我正在运行的这个函数是我分解一个似乎存在内存泄漏的更复杂函数的结果,所以看起来这确实browser.close是罪魁祸首。但就我的一生而言,我无法弄清楚为什么在简化得如此之多时会引起问题。headless这在、 和两种模式下都会发生headfull。以下是 puppeteer 启动选项:

puppetOptions = {
    defaultViewport: null,
    args: [
        "--incognito",
        "--no-sandbox",
        "--single-process",
        "--no-zygote"
    ],
}

puppetOptionsHeadfull = {
    headless: false,
    executablePath: 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe',
}
Run Code Online (Sandbox Code Playgroud)

编辑:我也在我的 bash 终端中尝试过这个,并且遇到了同样的问题。当我尝试手动关闭终端以中止它时,会弹出错误。

Processes are running in session:
| WPID PID COMMAND
| 10900 1122 winpty node.exe index.js
Close anyway?
Run Code Online (Sandbox Code Playgroud)

编辑2:将其范围缩小到最有可能的问题puppeteer-extra,但是,它似乎是核心包中的一个错误。他们的存储库上最近的开放问题反映了在这里发现的这个错误:https ://github.com/berstend/puppeteer-extra/issues/421

我将保留这个问题,以防万一其他人偶然发现同样的问题,他们不会费尽心思调试它。

小智 1

我也一直遇到这个问题。在我看来,“--no-sandbox”和“--disable-setuid-sandbox”这两个参数是罪魁祸首,尽管为什么会出现这种情况并不直观。尝试删除无沙箱参数