Puppeteer 中文文档v25.8.0

Page.evaluateHandle() 方法

签名

class Page {
  evaluateHandle<
    Params extends unknown[],
    Func extends EvaluateFunc<Params> = EvaluateFunc<Params>,
  >(
    pageFunction: Func | string,
    ...args: Params
  ): Promise<HandleFor<Awaited<ReturnType<Func>>>>;
}

参数

参数

类型

说明

pageFunction

Func | string

在页面内运行的函数

args

Params

要传递给 pageFunction 的参数

返回值:

Promise<HandleFor<Awaited<ReturnType<Func>>>>

备注

page.evaluatepage.evaluateHandle 的唯一区别在于,evaluateHandle 返回的值会包装在页面内对象中。

如果传递给 page.evaluateHandle 的函数返回 Promise,该方法会等待该 Promise 兑现并返回其值。

你可以传入字符串来代替函数(不过推荐使用函数,因为函数更易于调试,也便于与 TypeScript 搭配使用):

示例 1

const aHandle = await page.evaluateHandle('document');

示例 2

可以将 JSHandle 实例作为参数传递给 pageFunction

const aHandle = await page.evaluateHandle(() => document.body);
const resultHandle = await page.evaluateHandle(body => body.innerHTML, aHandle);
console.log(await resultHandle.jsonValue());
await resultHandle.dispose();

大多数情况下,此函数返回 JSHandle,但如果 pageFunction 返回对元素的引用,你得到的将是 ElementHandle

示例 3

const button = await page.evaluateHandle(() =>
  document.querySelector('button'),
);
// can call `click` because `button` is an `ElementHandle`
await button.click();

TypeScript 定义假定 evaluateHandle 返回 JSHandle,但如果你知道它将要返回 ElementHandle,可以将其作为泛型参数传入:

const button = await page.evaluateHandle<ElementHandle>(...);