将参数传递给与 Playwright 的 evaluate 一起使用的内部箭头函数

Pass parameters to inner arrow function used with Playwright's evaluate

我现在正在使用 playwright,想写一个包含内部箭头函数的函数,类似于

 async function setSearchDate(startDate='2021-12-07') {
    ....do something...

    const startDateAttribute = await page.$(searchStartDate);
    await startDateAttribute.evaluate(node => node.setAttribute('value', startDate));

但不知何故,内部箭头函数看不到 startDate 值。 我得到的错误是“elementHandle.evaluate: ReferenceError: startDate is not defined”。

如果我在箭头函数中硬编码 startDate 值,代码运行良好。 我如何传递该值?

await startDateAttribute.evaluate(function(node) { node.setAttribute('value', startDate) });

evaluate 在页面 中计算您的函数 ,而不是在代码的上下文中。您可以访问页面执行环境中存在的所有内容(例如 windowdocument 等),但不能访问 您的 执行环境中存在的所有内容(例如 startDate).那是因为在页面的上下文中,没有变量 startDate(除非页面定义了自己的 window.startDate...)。

要传递参数,您必须使用 ...args - evaluate 接受额外的参数,这些参数全部传递给您的函数:

await startDateAttribute.evaluate(
  (node, startDate) => node.setAttribute('value', startDate),
//       ^^^^^^^^^  2) extra argument(s) arrive here
//vvvvvvvvv         1) extra argument(s) getting passed in here
  startDate
)

查看文档:Evaluating JavaScript (explaining this exact pitfall) and ElementHandle#evaluate.