跳到主要内容
版本:23.11.1

在 Chrome 扩展程序中运行 Puppeteer

注意

Chrome 扩展程序环境与通常的 Node.JS 环境有很大不同,因此,目前在 chrome.debugger 中运行 Puppeteer 的支持是实验性的。如果您遇到错误,请提交问题 https://github.com/puppeteer/puppeteer/issues/new/choose

Chrome 扩展程序允许通过 chrome.debugger 访问 Chrome DevTools 协议。chrome.debugger 提供对 CDP 的受限访问,并且一次只允许附加到一个页面。因此,Puppeteer 需要使用不同的传输方式,并且 Puppeteer 的视图仅限于单个页面。这意味着您可以与单个页面及其框架和 worker 进行交互,但不能使用 Puppeteer 创建新页面。要创建新页面,您需要使用 chrome.tabs API 并建立新的 Puppeteer 连接。

如何在 Chrome 扩展程序中运行 Puppeteer

要在扩展程序中运行 Puppeteer,首先需要使用 bundler(如 rollup 或 webpack)生成一个与浏览器兼容的版本

  1. 导入 Puppeteer 时,请使用 puppeteer-core 中的特定于浏览器的入口点 puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js
import {
connect,
ExtensionTransport,
} from 'puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js';

// Create a tab or find a tab to attach to.
const tab = await chrome.tabs.create({
url,
});
// Connect Puppeteer using the ExtensionTransport.connectTab.
const browser = await connect({
transport: await ExtensionTransport.connectTab(tab.id),
});
// You will have a single page on the browser object, which corresponds
// to the tab you connected the transport to.
const [page] = await browser.pages();
// Perform the usual operations with Puppeteer page.
console.log(await page.evaluate('document.title'));
browser.disconnect();
  1. 使用 bundler 构建您的扩展程序。例如,以下配置可以与 rollup 一起使用
import {nodeResolve} from '@rollup/plugin-node-resolve';

export default {
input: 'main.mjs',
output: {
format: 'esm',
dir: 'out',
},
// If you do not need to use WebDriver BiDi protocol,
// exclude chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js to minimize the bundle size.
external: ['chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js'],
plugins: [
nodeResolve({
// Indicate that we target a browser environment.
browser: true,
// Exclude any dependencies except for puppeteer-core.
// `npm install puppeteer-core` # To install puppeteer-core if needed.
resolveOnly: ['puppeteer-core'],
}),
],
};