傀儡师:如何将参数传递给页面评估?

Puppeteer : how to pass argument to page evaluate?

提问人:jgran 提问时间:7/23/2023 更新时间:7/23/2023 访问量:33

问:

我想将参数传递给 Puppeteer 方法。page evaluate

我可能还在为我不掌握的异步/等待而苦苦挣扎,所以我的知识问题可能更普遍。无论如何,Puppeteer 是当前需要解决的问题。

我有这个用于更新元素的片段。效果很好:

await page.evaluate(
    () =>
      (document.querySelector(
        "selector"
      ).innerHTML = "WHATEVER")
  );

“WHATEVER”值来自外部变量。我需要传递它进行评估。

我试过:

const value = "WHATEVER"
async function setValue(val) {
    console.log(val) //OK
    await page.evaluate(
      () =>{
        console.log(val) // KO  Error [ReferenceError]: val is not defined
        document.querySelector(
          "selector"
        ).innerHTML = val
      }
    );
  }
  await setValue(value) // KO

为什么没有定义 val? 在这种情况下,如何将参数传递给页面评估?有没有其他选择?

javascript async-await 参数传递 傀儡师

评论


答:

1赞 Edoardo Balducci 7/23/2023 #1

page.evaluate()与 Node.js 环境隔离,这意味着它无权访问 Node.js 脚本作用域中的变量。 若要将参数传递给提供给 的函数,应将其作为附加参数包含在内。 实际上,这是方法签名:page.evaluate()

page.evaluate(pageFunction, ...args);

所以你需要这样做,就像这样:

const value = "WHATEVER"
async function setValue(val) {
    console.log(val) //OK
    await page.evaluate(
      (val) => {
        console.log(val) // Should be OK now
        document.querySelector("selector").innerHTML = val
      },
      val // This is where you're passing the argument 'val' to the function in page.evaluate()
    );
}
await setValue(value)

评论

0赞 jgran 7/23/2023
谢谢。我阅读了页面评估签名,但没有理解。