【问题标题】:Passing Puppeteer page as params in a function is not working as expected在函数中将 Puppeteer 页面作为参数传递未按预期工作
【发布时间】:2026-01-19 10:20:04
【问题描述】:

简介

loginLinkedin 将我带到登录页面,然后为我返回 puppeteer 页面,该页面随后被分配给 root,因此我仍然可以使用更多选项。

const root = await loginToLInkined("https://www.linkedin.com/login");

    await root.goto(url);
    max_page = await getMaxPage(root);
    console.log("max page",max_page)

然后我goto(url)

url 是我需要访问的另一个页面。

之后我以 root 作为参数调用 getMaxPage(root),这样我就可以在该函数中使用 evaluate()

问题

const getMaxPage = async root => {
  const maxPage = await root.evaluate(()=> {
    return document.querySelector(
      "li.artdeco-pagination__indicator:nth-last-Child(1)"
    );
  });
  console.log(maxPage)
  return parseInt(maxPage.innerText);
};

问题是,当我 console.log(maxPage) 它返回 undefined 时,我意识到添加 root s 参数实际上并没有按照我应该做的方式工作。

我做错了什么以及如何正确完成。

注意我实际上已经尝试在不添加函数并将根作为参数添加的情况下进行 root.evaluate,它实际上为我返回了 maxpage

【问题讨论】:

  • 尝试在evaluate()中移动innerText

标签: javascript web-scraping jquery-selectors puppeteer


【解决方案1】:

问题在于您从page.evaluate() 返回的内容

const maxPage = await root.evaluate(()=> {
    return document.querySelector(
      "li.artdeco-pagination__indicator:nth-last-Child(1)"
    );
});

这是一个DOM节点,它是一个复杂的对象,不能serialized,返回值必须是可序列化的,才能从Chromium返回给节点。

因此,为了解决这个问题,所有未来的脚本只返回需要的内容和可以JSON.stringifyed 没有错误的内容。正如 pguardiario 在评论中正确指出的那样,在这种情况下,从该节点返回 innerText 就足够了:

const maxPage = await root.evaluate(()=> {
  return document.querySelector("li.artdeco-pagination__indicator:nth-last-Child(1)").innerText;
});

【讨论】:

  • 我喜欢称它们为“节点上下文”和“浏览器上下文”,以便更好地解释。 :D
  • 我也是!但是对于这个问题,我觉得更重要的是……比如说,可视化数据从哪里到哪里去。