我从另一个Stackoverflow问题中得到了这个代码:
import electron from "electron";
import puppeteer from "puppeteer-core";
const delay = (ms: number) =>
new Promise(resolve => {
setTimeout(() => {
resolve();
}, ms);
});
(async () => {
try {
const app = await puppeteer.launch({
executablePath: electron,
args: ["."],
headless: false,
});
const pages = await app.pages();
const [page] = pages;
await page.setViewport({ width: 1200, height: 700 });
await delay(5000);
const image = await page.screenshot();
console.log(image);
await page.close();
await delay(2000);
await app.close();
} catch (error) {
console.error(error);
}
})();
类型脚本编译器抱怨launch
方法选项对象的executablePath
属性,因为它需要string
类型,而不是Electron
类型。那么如何将电子 chrome 可执行路径传递给puppeteer呢?
4条答案
按热度按时间ig9co6j11#
你不能直接使用电子可执行文件与Puppeteer没有一些变通办法和标志的变化。他们有吨的API差异。特别是电子没有所有的**chrome.***API这是 chrome 浏览器正常工作所需的,许多标志仍然没有适当的替代品,如the headless flag。
下面你会看到两种方法。但是你需要确定两点,
使用
puppeteer-in-electron
有很多变通方法,但最近有一个puppeteer-in-electron包,允许您使用electron在电子应用程序中运行puppeteer。
首先,安装依赖项,
那就运行它。
获取调试端口并连接到它
另一种方法是获取电子应用程序的远程调试端口并连接到它,这个解决方案是由trusktr on electron forum共享的。
上述两种解决方案均使用webSocketDebuggerUrl来解决问题。
额外
添加此注解是因为大多数人使用电子产品捆绑应用程序。
如果你想构建puppeteer-core和puppeteer-in-electron,你需要使用
hazardous
和electron-builder
来确保get-port-cli
工作。在main.js顶部添加危险
确保get-port-cli脚本已解压缩,并在package.json上添加以下内容
构建后结果:
6tr1vspr2#
最上面的答案对我不起作用使用electron 11和puppeteer-core 8。但是在main进程中启动puppeteer,然后在renderer进程中启动me.you可以使用ipcMain和ipcRenderer相互通信。下面的代码
main.ts(主进程代码)
home.ts(渲染器进程代码)
f87krz0w3#
还有另一个选项,适用于electron 5.x.y及以上版本(目前最高可达7.x.y,我还没有在8.x.y测试版上测试过):
获取
pid
和使用kill
是可选的。对于在一些CI平台上运行脚本来说,这并不重要,但对于本地环境,您必须在每次尝试失败后手动关闭电子应用程序。请看这个sample repo。
t3psigkw4#
根据此文档puppeteer-in-electron,它工作正常。但请注意,对于与ipcMain一起工作,您应该在调用main函数之前初始化应用程序。
主文件.js
预加载.js
渲染器(vue3)
我的软件包版本