Skip to main content
Version: Next

Page.evaluateHandle() method


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


pageFunctionFunc | stringa function that is run within the page
argsParamsarguments to be passed to the pageFunction




The only difference between page.evaluate and page.evaluateHandle is that evaluateHandle will return the value wrapped in an in-page object.

If the function passed to page.evaluateHandle returns a Promise, the function will wait for the promise to resolve and return its value.

You can pass a string instead of a function (although functions are recommended as they are easier to debug and use with TypeScript):

Example 1

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

Example 2

JSHandle instances can be passed as arguments to the 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();

Most of the time this function returns a JSHandle, but if pageFunction returns a reference to an element, you instead get an ElementHandle back:

Example 3

const button = await page.evaluateHandle(() =>
// can call `click` because `button` is an `ElementHandle`

The TypeScript definitions assume that evaluateHandle returns a JSHandle, but if you know it's going to return an ElementHandle, pass it as the generic argument:

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