我试图使用puppeteer与electron.js,但没有功能相关的等待和点击做工作。
它总是给出:
Error: Passed function is not well-serializable!
at ExecutionContext._ExecutionContext_evaluate
示例函数:
// url: https://example.com/
async function scraper(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url);
const element = await page.waitForSelector("h1");
console.log('element: ', element)
await browser.close();
}
这些线程中提到的解决方案都不起作用。(用evals / rewriting wait函数 Package )Puppeteer in Electron: Error: Passed function is not well-serializable
Uncaught (in promise) Error: Passed function is not well-serializable
有什么想法吗?
1条答案
按热度按时间qacovj5a1#
好的,我解决了这个问题。首先,上下文:一般来说,正如在注解中所写的,你不能在浏览器环境中运行puppeteer,它只能在odejs中运行。电子提供了2个进程renderer和main。无论何时你想使用节点,你都必须在main中运行。关于这两个进程之间的通信,你可以在docs中阅读,有很多方法可以处理它。2据我所知,最好的做法是在preload中声明它并使用ipc桥。3其他的解决方案违反了contextIsolation规则。
我从一个问题徘徊到另一个问题:比如不可序列化的函数,不需要定义,还有很多其他的。最后,我从头开始重写了所有的东西,它工作了,下面是我的解决方案:
main.js
preload.js
renderer.js
对不起,有点混乱,我希望它会帮助某人,也许找到解决其他一些问题的办法