将 Puppeteer 页面作为函数中的参数传递未按预期工作

Passing Puppeteer page as params in a function is not working as expected

简介

loginLinkedin 将我带到登录页面,然后 return 为我打开 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) 它 return 未定义时,我意识到添加 root s 参数实际上并没有按照我应该做的方式工作。

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

请注意,我实际上已经尝试 root.evaluate 而不添加函数并将根作为参数添加,它实际上 return 为我编辑了 maxpage

问题出在 你 return 来自 page.evaluate():

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

这是一个DOM节点,是一个复杂对象,不能serialized,return值必须可序列化为了从 Chromium returned 回到节点。

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

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