Puppeteer 脚本在 NodeJS 中不执行任何操作

问题描述 投票:0回答:1

我尝试在新的 NodeJS 项目中安装 Puppeteer。当我尝试启动浏览器并截取屏幕截图时,它不起作用。

我做到了:

  1. 创建新目录
  2. 在航站楼
    npm init -y
  3. 创建文件
    index.js
  4. 安装 puppeteer
    npm i puppeteer
  5. index.js
    中写入以下代码:
    import * as puppeteer from 'puppeteer';
    
    (async ()=> {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto('https://github.com/puppeteer/puppeteer');
        await page.screenshot({path: 'my.png'});
        // await browser.close();
    });
    
  6. node index.js
  7. 一起奔跑

它既不打开浏览器也不创建屏幕截图。

javascript puppeteer iife
1个回答
0
投票

您在

IIFE
之后需要 ()
});
应该是
})();
。否则,该函数已定义但从未执行。

调试此问题的一个好方法是在 IIFE 顶部添加健全性检查

console.log("running")
。如果它没有运行,但 IIFE 之外的另一个健全性检查
console.log("running")
运行了,那么您就会发现该函数从未被调用过。

请注意,您正在无头运行,因此在修复 IIFE 问题后,不会打开任何可见浏览器仍然是预期行为。脚本的预期行为是它将运行、创建屏幕截图,然后永远挂起,因为

browser.close()
已被注释掉,需要您按 Ctrl+c 来终止它。如果您想看到浏览器打开,请使用
browser.launch({headless: false})

我建议使用以下 Puppeteer 样板:

const puppeteer = require("puppeteer"); // module import is fine too

let browser;
(async () => {
  browser = await puppeteer.launch({headless: "new"});
  const [page] = await browser.pages();

  // your page code

})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

出于多种主要和次要原因,这是最佳的:

  1. 如果脚本在处理页面时抛出错误,浏览器将关闭,以便脚本可以干净地退出。否则,它将永远挂起,泄漏进程。
  2. 所有错误都会被捕获并记录,避免出现未捕获的承诺拒绝警告。
  3. 启动浏览器时遇到的错误也会被捕获。
  4. 不会创建不必要的页面,因为 Puppeteer 从已打开的页面开始。
  5. 它是平坦的,因此大多数脚本不需要
    try
    /
    catch
    层。
© www.soinside.com 2019 - 2024. All rights reserved.