你不能直接使用electron可执行文件与Puppeteer一起使用,需要进行一些变通和标志更改。它们在API方面有很多差异。特别是electron没有所有的chrome.* API,这是chromium浏览器正常工作所需的,许多标志仍然没有适当的替代品,如
the headless flag。
下面将介绍两种方法。但是您需要确保两个要点:
- 在启动应用程序之前,请确保已连接到puppeteer。
- 确保您获取了正确版本的puppeteer或puppeteer-core,以适用于在Electron中运行的Chrome版本!
使用puppeteer-in-electron
有很多解决方法,但最近有一个
puppeteer-in-electron包,允许您使用electron在electron应用程序中运行puppeteer。
首先,安装依赖项,
npm install puppeteer-in-electron puppeteer-core electron
然后运行{{它}}。
import {BrowserWindow, app} from "electron";
import pie from "puppeteer-in-electron";
import puppeteer from "puppeteer-core";
const main = async () => {
const browser = await pie.connect(app, puppeteer);
const window = new BrowserWindow();
const url = "https://example.com/";
await window.loadURL(url);
const page = await pie.getPage(browser, window);
console.log(page.url());
window.destroy();
};
main();
获取调试端口并连接
另一种方法是获取 electron 应用的远程调试端口并连接。这个解决方案由 electron 论坛上的 trusktr 分享。
import {app, BrowserWindow, ...} from "electron"
import fetch from 'node-fetch'
import * as puppeteer from 'puppeteer'
app.commandLine.appendSwitch('remote-debugging-port', '8315')
async function test() {
const response = await fetch(`http://localhost:8315/json/versions/list?t=${Math.random()}`)
const debugEndpoints = await response.json()
let webSocketDebuggerUrl = debugEndpoints['webSocketDebuggerUrl ']
const browser = await puppeteer.connect({
browserWSEndpoint: webSocketDebuggerUrl
})
}
mainWindow.webContents.on("did-finish-load", () => {
test()
})
以上两种解决方案都使用webSocketDebuggerUrl来解决问题。
额外信息
添加此说明是因为大多数人使用electron来打包应用程序。
如果您想构建puppeteer-core和puppeteer-in-electron,则需要使用hazardous
和electron-builder
确保get-port-cli
正常工作。
在main.js顶部添加hazardous
// main.js
require ('hazardous');
请确保已解压get-port-cli脚本,并在package.json文件中添加以下内容
"build": {
"asarUnpack": "node_modules/get-port-cli"
}
构建后的结果: