传递的函数不能很好地序列化

Ped*_*her 3 node.js puppeteer

我正在使用 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)

vrq*_*rqq 6

我尝试--publicpkg.

喜欢: 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。(或只需双击。)

  • 只需删除输出exe然后重新运行pkg
  • 检查代码是否可运行与node start.js或不


Har*_*wal 5

对我来说最简单的解决方案是用 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)


Kes*_*e K 5

我有这个与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 注入回调,但是它对我不起作用。