我正在使用 Puppeteer 从包含订单数据的文件模板中抓取网页。
为此,我使用了 puppeteer 评估函数,该函数在文件位于 .js 中时正常工作
但是,当使用“pkg”包编译 .exe 文件或评估执行并启动返回或错误时:“传递的函数不是完全可序列化的! ”
下面是代码:
const dados = {name: 'foo', year: 1}
await page.evaluate(dados => {
let dom = document.querySelector('body');
const tags = Object.keys(dados);
for (let i = 0; i < tags.length; i++) {
const tag = tags[i];
dom.innerHTML = dom.innerHTML.split(`{{${tag}}}`).join(dados[tag]);
}
}, dados);
Run Code Online (Sandbox Code Playgroud)
我尝试--public用pkg.
喜欢: pkg start.js -t node14-win-x64 --public
然后我可以自由使用 ElementHandle.evaluate( (elem)=> elem.textContent );
用pkg的手册,--public意味着:加快和公开顶级项目的来源。
修复找不到 chrome 二进制文件
browser = await puppeteer.launch({
executablePath: "node_modules/puppeteer/.local-chromium/win64-782078/chrome-win/chrome.exe"
});
Run Code Online (Sandbox Code Playgroud)
(上面的路径可以随意设置。)
修复start.exe无法运行
有时输出的二进制 exe 无法执行。当我们输入时,它总是弹出一个新的 cmd 提示窗口start.exe。(或只需双击。)
node start.js或不对我来说最简单的解决方案是用 eval() 包装它:
async getText(selector: string) {
await this.page.waitForSelector(selector);
let text = await eval(`this.page.$eval('${selector}', el => el.textContent)`)
return text;
}
Run Code Online (Sandbox Code Playgroud)
或这个:
await eval(`this.page.evaluate(
(selector) => { (document.querySelector(selector).value = ''); },
selector);`);
Run Code Online (Sandbox Code Playgroud)
我有这个与puppeteer和相关的确切问题pkg。出于某种原因, pkg 不能正确解释回调的内容。对我evaluate有用的解决方案是将字符串传递给而不是函数:
改变:
const dados = {name: 'foo', year: 1}
await page.evaluate(dados => {
let dom = document.querySelector('body');
const tags = Object.keys(dados);
for (let i = 0; i < tags.length; i++) {
const tag = tags[i];
dom.innerHTML = dom.innerHTML.split(`{{${tag}}}`).join(dados[tag]);
}
}, dados);
Run Code Online (Sandbox Code Playgroud)
到
await page.evaluate(`
(() => {
const dados = {name: 'foo', year: 1};
let dom = document.querySelector('body');
const tags = Object.keys(dados);
for (let i = 0; i < tags.length; i++) {
const tag = tags[i];
dom.innerHTML = dom.innerHTML.split(`{{${tag}}}`).join(dados[tag]);
}
// return dom to do something with the data in node
return dom.innerHTML
})()`);
Run Code Online (Sandbox Code Playgroud)
github 上的这个答案提出了一个替代解决方案 -pkg在编译时使用api 注入回调,但是它对我不起作用。
| 归档时间: |
|
| 查看次数: |
2460 次 |
| 最近记录: |