mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
feat(types): add (and fix) evaluateHandle
types (#6130)
This change started as a small change to pull types from DefinitelyTyped over to Puppeteer for the `evaluateHandle` function but instead ended up also fixing what looks to be a long standing issue with our existing documentation. `evaluateHandle` can in fact return an `ElementHandle` rather than a `JSHandle`. Note that `ElementHandle` extends `JSHandle` so whilst the docs are technically correct (all ElementHandles are JSHandles) it's confusing because JSHandles don't have methods like `click` on them, but ElementHandles do. if you return something that is an HTML element: ``` const button = page.evaluateHandle(() => document.querySelector('button')); // this is an ElementHandle, not a JSHandle ``` Therefore I've updated the original docs and added a large explanation to the TSDoc for `page.evaluateHandle`. In TypeScript land we'll assume the function will return a `JSHandle` but you can tell TS otherwise via the generic argument, which can only be `JSHandle` (the default) or `ElementHandle`: ``` const button = page.evaluateHandle<ElementHandle>(() => document.querySelector('button')); ```
This commit is contained in:
parent
3c0dc45e47
commit
8370ec88ae
30
docs/api.md
30
docs/api.md
@ -1456,7 +1456,7 @@ Shortcut for [page.mainFrame().evaluate(pageFunction, ...args)](#frameevaluatepa
|
|||||||
#### page.evaluateHandle(pageFunction[, ...args])
|
#### page.evaluateHandle(pageFunction[, ...args])
|
||||||
- `pageFunction` <[function]|[string]> Function to be evaluated in the page context
|
- `pageFunction` <[function]|[string]> Function to be evaluated in the page context
|
||||||
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
||||||
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle)
|
- returns: <[Promise]<[JSHandle]|[ElementHandle]>> Promise which resolves to the return value of `pageFunction` as an in-page object.
|
||||||
|
|
||||||
The only difference between `page.evaluate` and `page.evaluateHandle` is that `page.evaluateHandle` returns in-page object (JSHandle).
|
The only difference between `page.evaluate` and `page.evaluateHandle` is that `page.evaluateHandle` returns in-page object (JSHandle).
|
||||||
|
|
||||||
@ -1475,6 +1475,14 @@ console.log(await resultHandle.jsonValue());
|
|||||||
await resultHandle.dispose();
|
await resultHandle.dispose();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This function will return a [JSHandle] by default, however if your `pageFunction` returns an HTML element you will get back an `ElementHandle`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const button = await page.evaluateHandle(() => document.querySelector('button'))
|
||||||
|
// button is an ElementHandle, so you can call methods such as click:
|
||||||
|
await button.click();
|
||||||
|
```
|
||||||
|
|
||||||
Shortcut for [page.mainFrame().executionContext().evaluateHandle(pageFunction, ...args)](#executioncontextevaluatehandlepagefunction-args).
|
Shortcut for [page.mainFrame().executionContext().evaluateHandle(pageFunction, ...args)](#executioncontextevaluatehandlepagefunction-args).
|
||||||
|
|
||||||
#### page.evaluateOnNewDocument(pageFunction[, ...args])
|
#### page.evaluateOnNewDocument(pageFunction[, ...args])
|
||||||
@ -2298,12 +2306,14 @@ Shortcut for [(await worker.executionContext()).evaluate(pageFunction, ...args)]
|
|||||||
#### webWorker.evaluateHandle(pageFunction[, ...args])
|
#### webWorker.evaluateHandle(pageFunction[, ...args])
|
||||||
- `pageFunction` <[function]|[string]> Function to be evaluated in the page context
|
- `pageFunction` <[function]|[string]> Function to be evaluated in the page context
|
||||||
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
||||||
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle)
|
- returns: <[Promise]<[JSHandle]|[ElementHandle]>> Promise which resolves to the return value of `pageFunction` as an in-page object.
|
||||||
|
|
||||||
The only difference between `worker.evaluate` and `worker.evaluateHandle` is that `worker.evaluateHandle` returns in-page object (JSHandle).
|
The only difference between `worker.evaluate` and `worker.evaluateHandle` is that `worker.evaluateHandle` returns in-page object (JSHandle).
|
||||||
|
|
||||||
If the function passed to the `worker.evaluateHandle` returns a [Promise], then `worker.evaluateHandle` would wait for the promise to resolve and return its value.
|
If the function passed to the `worker.evaluateHandle` returns a [Promise], then `worker.evaluateHandle` would wait for the promise to resolve and return its value.
|
||||||
|
|
||||||
|
If the function returns an element, the returned handle is an [ElementHandle].
|
||||||
|
|
||||||
Shortcut for [(await worker.executionContext()).evaluateHandle(pageFunction, ...args)](#executioncontextevaluatehandlepagefunction-args).
|
Shortcut for [(await worker.executionContext()).evaluateHandle(pageFunction, ...args)](#executioncontextevaluatehandlepagefunction-args).
|
||||||
|
|
||||||
#### webWorker.executionContext()
|
#### webWorker.executionContext()
|
||||||
@ -2855,12 +2865,14 @@ await bodyHandle.dispose();
|
|||||||
#### frame.evaluateHandle(pageFunction[, ...args])
|
#### frame.evaluateHandle(pageFunction[, ...args])
|
||||||
- `pageFunction` <[function]|[string]> Function to be evaluated in the page context
|
- `pageFunction` <[function]|[string]> Function to be evaluated in the page context
|
||||||
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
||||||
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle)
|
- returns: <[Promise]<[JSHandle]|[ElementHandle]>> Promise which resolves to the return value of `pageFunction` as an in-page object.
|
||||||
|
|
||||||
The only difference between `frame.evaluate` and `frame.evaluateHandle` is that `frame.evaluateHandle` returns in-page object (JSHandle).
|
The only difference between `frame.evaluate` and `frame.evaluateHandle` is that `frame.evaluateHandle` returns in-page object (JSHandle).
|
||||||
|
|
||||||
If the function, passed to the `frame.evaluateHandle`, returns a [Promise], then `frame.evaluateHandle` would wait for the promise to resolve and return its value.
|
If the function, passed to the `frame.evaluateHandle`, returns a [Promise], then `frame.evaluateHandle` would wait for the promise to resolve and return its value.
|
||||||
|
|
||||||
|
If the function returns an element, the returned handle is an [ElementHandle].
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const aWindowHandle = await frame.evaluateHandle(() => Promise.resolve(window));
|
const aWindowHandle = await frame.evaluateHandle(() => Promise.resolve(window));
|
||||||
aWindowHandle; // Handle for the window object.
|
aWindowHandle; // Handle for the window object.
|
||||||
@ -3184,10 +3196,12 @@ console.log(result); // prints '3'.
|
|||||||
#### executionContext.evaluateHandle(pageFunction[, ...args])
|
#### executionContext.evaluateHandle(pageFunction[, ...args])
|
||||||
- `pageFunction` <[function]|[string]> Function to be evaluated in the `executionContext`
|
- `pageFunction` <[function]|[string]> Function to be evaluated in the `executionContext`
|
||||||
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
||||||
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle)
|
- returns: <[Promise]<[JSHandle]|[ElementHandle]>> Promise which resolves to the return value of `pageFunction` as an in-page object.
|
||||||
|
|
||||||
The only difference between `executionContext.evaluate` and `executionContext.evaluateHandle` is that `executionContext.evaluateHandle` returns in-page object (JSHandle).
|
The only difference between `executionContext.evaluate` and `executionContext.evaluateHandle` is that `executionContext.evaluateHandle` returns in-page object (JSHandle).
|
||||||
|
|
||||||
|
If the function returns an element, the returned handle is an [ElementHandle].
|
||||||
|
|
||||||
If the function passed to the `executionContext.evaluateHandle` returns a [Promise], then `executionContext.evaluateHandle` would wait for the promise to resolve and return its value.
|
If the function passed to the `executionContext.evaluateHandle` returns a [Promise], then `executionContext.evaluateHandle` would wait for the promise to resolve and return its value.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
@ -3277,12 +3291,14 @@ expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10');
|
|||||||
#### jsHandle.evaluateHandle(pageFunction[, ...args])
|
#### jsHandle.evaluateHandle(pageFunction[, ...args])
|
||||||
- `pageFunction` <[function]|[string]> Function to be evaluated
|
- `pageFunction` <[function]|[string]> Function to be evaluated
|
||||||
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
||||||
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle)
|
- returns: <[Promise]<[JSHandle]|[ElementHandle]>> Promise which resolves to the return value of `pageFunction` as an in-page object.
|
||||||
|
|
||||||
This method passes this handle as the first argument to `pageFunction`.
|
This method passes this handle as the first argument to `pageFunction`.
|
||||||
|
|
||||||
The only difference between `jsHandle.evaluate` and `jsHandle.evaluateHandle` is that `executionContext.evaluateHandle` returns in-page object (JSHandle).
|
The only difference between `jsHandle.evaluate` and `jsHandle.evaluateHandle` is that `executionContext.evaluateHandle` returns in-page object (JSHandle).
|
||||||
|
|
||||||
|
If the function returns an element, the returned handle is an [ElementHandle].
|
||||||
|
|
||||||
If the function passed to the `jsHandle.evaluateHandle` returns a [Promise], then `jsHandle.evaluateHandle` would wait for the promise to resolve and return its value.
|
If the function passed to the `jsHandle.evaluateHandle` returns a [Promise], then `jsHandle.evaluateHandle` would wait for the promise to resolve and return its value.
|
||||||
|
|
||||||
See [Page.evaluateHandle](#pageevaluatehandlepagefunction-args) for more details.
|
See [Page.evaluateHandle](#pageevaluatehandlepagefunction-args) for more details.
|
||||||
@ -3466,12 +3482,14 @@ expect(await tweetHandle.evaluate(node => node.innerText)).toBe('10');
|
|||||||
#### elementHandle.evaluateHandle(pageFunction[, ...args])
|
#### elementHandle.evaluateHandle(pageFunction[, ...args])
|
||||||
- `pageFunction` <[function]|[string]> Function to be evaluated
|
- `pageFunction` <[function]|[string]> Function to be evaluated
|
||||||
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
- `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction`
|
||||||
- returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle)
|
- returns: <[Promise]<[JSHandle]|[ElementHandle]>> Promise which resolves to the return value of `pageFunction` as an in-page object.
|
||||||
|
|
||||||
This method passes this handle as the first argument to `pageFunction`.
|
This method passes this handle as the first argument to `pageFunction`.
|
||||||
|
|
||||||
The only difference between `evaluateHandle.evaluate` and `evaluateHandle.evaluateHandle` is that `executionContext.evaluateHandle` returns in-page object (JSHandle).
|
The only difference between `evaluateHandle.evaluate` and `evaluateHandle.evaluateHandle` is that `executionContext.evaluateHandle` returns in-page object (JSHandle).
|
||||||
|
|
||||||
|
If the function returns an element, the returned handle is an [ElementHandle].
|
||||||
|
|
||||||
If the function passed to the `evaluateHandle.evaluateHandle` returns a [Promise], then `evaluateHandle.evaluateHandle` would wait for the promise to resolve and return its value.
|
If the function passed to the `evaluateHandle.evaluateHandle` returns a [Promise], then `evaluateHandle.evaluateHandle` would wait for the promise to resolve and return its value.
|
||||||
|
|
||||||
See [Page.evaluateHandle](#pageevaluatehandlepagefunction-args) for more details.
|
See [Page.evaluateHandle](#pageevaluatehandlepagefunction-args) for more details.
|
||||||
|
12
new-docs/puppeteer.evaluatehandlefn.md
Normal file
12
new-docs/puppeteer.evaluatehandlefn.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
|
||||||
|
|
||||||
|
[Home](./index.md) > [puppeteer](./puppeteer.md) > [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md)
|
||||||
|
|
||||||
|
## EvaluateHandleFn type
|
||||||
|
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export declare type EvaluateHandleFn = string | ((...args: unknown[]) => unknown);
|
||||||
|
```
|
@ -7,19 +7,19 @@
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
evaluateHandle(pageFunction: Function | string, ...args: unknown[]): Promise<JSHandle>;
|
evaluateHandle<HandleType extends JSHandle | ElementHandle = JSHandle>(pageFunction: EvaluateHandleFn, ...args: SerializableOrJSHandle[]): Promise<HandleType>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
|
|
||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | a function to be evaluated in the <code>executionContext</code> |
|
| pageFunction | [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md) | a function to be evaluated in the <code>executionContext</code> |
|
||||||
| args | unknown\[\] | argument to pass to the page function |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | argument to pass to the page function |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
Promise<[JSHandle](./puppeteer.jshandle.md)<!-- -->>
|
Promise<HandleType>
|
||||||
|
|
||||||
A promise that resolves to the return value of the given function as an in-page object (a [JSHandle](./puppeteer.jshandle.md)<!-- -->).
|
A promise that resolves to the return value of the given function as an in-page object (a [JSHandle](./puppeteer.jshandle.md)<!-- -->).
|
||||||
|
|
||||||
|
@ -7,17 +7,17 @@
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
evaluateHandle(pageFunction: Function | string, ...args: unknown[]): Promise<JSHandle>;
|
evaluateHandle<HandlerType extends JSHandle = JSHandle>(pageFunction: EvaluateHandleFn, ...args: SerializableOrJSHandle[]): Promise<HandlerType>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
|
|
||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | |
|
| pageFunction | [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md) | |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
Promise<[JSHandle](./puppeteer.jshandle.md)<!-- -->>
|
Promise<HandlerType>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
waitFor(selectorOrFunctionOrTimeout: string | number | Function, options?: {}, ...args: unknown[]): Promise<JSHandle | null>;
|
waitFor(selectorOrFunctionOrTimeout: string | number | Function, options?: {}, ...args: SerializableOrJSHandle[]): Promise<JSHandle | null>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
@ -16,7 +16,7 @@ waitFor(selectorOrFunctionOrTimeout: string | number | Function, options?: {}, .
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| selectorOrFunctionOrTimeout | string \| number \| Function | |
|
| selectorOrFunctionOrTimeout | string \| number \| Function | |
|
||||||
| options | {} | |
|
| options | {} | |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
waitForFunction(pageFunction: Function | string, options?: {
|
waitForFunction(pageFunction: Function | string, options?: {
|
||||||
polling?: string | number;
|
polling?: string | number;
|
||||||
timeout?: number;
|
timeout?: number;
|
||||||
}, ...args: unknown[]): Promise<JSHandle>;
|
}, ...args: SerializableOrJSHandle[]): Promise<JSHandle>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
@ -19,7 +19,7 @@ waitForFunction(pageFunction: Function | string, options?: {
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | |
|
| pageFunction | Function \| string | |
|
||||||
| options | { polling?: string \| number; timeout?: number; } | |
|
| options | { polling?: string \| number; timeout?: number; } | |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
|
@ -9,19 +9,19 @@ This method passes this handle as the first argument to `pageFunction`<!-- -->.
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
evaluateHandle(pageFunction: Function | string, ...args: unknown[]): Promise<JSHandle>;
|
evaluateHandle<HandleType extends JSHandle | ElementHandle = JSHandle>(pageFunction: EvaluateHandleFn, ...args: SerializableOrJSHandle[]): Promise<HandleType>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
|
|
||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | |
|
| pageFunction | [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md) | |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
Promise<[JSHandle](./puppeteer.jshandle.md)<!-- -->>
|
Promise<HandleType>
|
||||||
|
|
||||||
## Remarks
|
## Remarks
|
||||||
|
|
||||||
|
@ -82,6 +82,7 @@
|
|||||||
| [ConsoleMessageType](./puppeteer.consolemessagetype.md) | The supported types for console messages. |
|
| [ConsoleMessageType](./puppeteer.consolemessagetype.md) | The supported types for console messages. |
|
||||||
| [EvaluateFn](./puppeteer.evaluatefn.md) | |
|
| [EvaluateFn](./puppeteer.evaluatefn.md) | |
|
||||||
| [EvaluateFnReturnType](./puppeteer.evaluatefnreturntype.md) | |
|
| [EvaluateFnReturnType](./puppeteer.evaluatefnreturntype.md) | |
|
||||||
|
| [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md) | |
|
||||||
| [JSONArray](./puppeteer.jsonarray.md) | |
|
| [JSONArray](./puppeteer.jsonarray.md) | |
|
||||||
| [KeyInput](./puppeteer.keyinput.md) | |
|
| [KeyInput](./puppeteer.keyinput.md) | |
|
||||||
| [MouseButtonInput](./puppeteer.mousebuttoninput.md) | |
|
| [MouseButtonInput](./puppeteer.mousebuttoninput.md) | |
|
||||||
|
@ -7,17 +7,62 @@
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
evaluateHandle(pageFunction: Function | string, ...args: unknown[]): Promise<JSHandle>;
|
evaluateHandle<HandlerType extends JSHandle = JSHandle>(pageFunction: EvaluateHandleFn, ...args: SerializableOrJSHandle[]): Promise<HandlerType>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
|
|
||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | |
|
| pageFunction | [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md) | a function that is run within the page |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | arguments to be passed to the pageFunction |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
Promise<[JSHandle](./puppeteer.jshandle.md)<!-- -->>
|
Promise<HandlerType>
|
||||||
|
|
||||||
|
## Remarks
|
||||||
|
|
||||||
|
The only difference between [page.evaluate](./puppeteer.page.evaluate.md) and `page.evaluateHandle` is that `evaluateHandle` will return the value wrapped in an in-page object.
|
||||||
|
|
||||||
|
If the function passed to `page.evaluteHandle` 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](./puppeteer.jshandle.md) 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](./puppeteer.jshandle.md)<!-- -->, but if `pageFunction` returns a reference to an element, you instead get an [ElementHandle](./puppeteer.elementhandle.md) back:
|
||||||
|
|
||||||
|
## Example 3
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
const button = await page.evaluateHandle(() => document.querySelector('button'));
|
||||||
|
// can call `click` because `button` is an `ElementHandle`
|
||||||
|
await button.click();
|
||||||
|
|
||||||
|
```
|
||||||
|
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>(...);
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ waitFor(selectorOrFunctionOrTimeout: string | number | Function, options?: {
|
|||||||
hidden?: boolean;
|
hidden?: boolean;
|
||||||
timeout?: number;
|
timeout?: number;
|
||||||
polling?: string | number;
|
polling?: string | number;
|
||||||
}, ...args: unknown[]): Promise<JSHandle>;
|
}, ...args: SerializableOrJSHandle[]): Promise<JSHandle>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
@ -21,7 +21,7 @@ waitFor(selectorOrFunctionOrTimeout: string | number | Function, options?: {
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| selectorOrFunctionOrTimeout | string \| number \| Function | |
|
| selectorOrFunctionOrTimeout | string \| number \| Function | |
|
||||||
| options | { visible?: boolean; hidden?: boolean; timeout?: number; polling?: string \| number; } | |
|
| options | { visible?: boolean; hidden?: boolean; timeout?: number; polling?: string \| number; } | |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
waitForFunction(pageFunction: Function | string, options?: {
|
waitForFunction(pageFunction: Function | string, options?: {
|
||||||
timeout?: number;
|
timeout?: number;
|
||||||
polling?: string | number;
|
polling?: string | number;
|
||||||
}, ...args: unknown[]): Promise<JSHandle>;
|
}, ...args: SerializableOrJSHandle[]): Promise<JSHandle>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
@ -19,7 +19,7 @@ waitForFunction(pageFunction: Function | string, options?: {
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | |
|
| pageFunction | Function \| string | |
|
||||||
| options | { timeout?: number; polling?: string \| number; } | |
|
| options | { timeout?: number; polling?: string \| number; } | |
|
||||||
| args | unknown\[\] | |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
|
@ -9,15 +9,15 @@ The only difference between `worker.evaluate` and `worker.evaluateHandle` is tha
|
|||||||
<b>Signature:</b>
|
<b>Signature:</b>
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
evaluateHandle(pageFunction: Function | string, ...args: any[]): Promise<JSHandle>;
|
evaluateHandle<HandlerType extends JSHandle = JSHandle>(pageFunction: EvaluateHandleFn, ...args: SerializableOrJSHandle[]): Promise<JSHandle>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Parameters
|
## Parameters
|
||||||
|
|
||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| pageFunction | Function \| string | Function to be evaluated in the page context. |
|
| pageFunction | [EvaluateHandleFn](./puppeteer.evaluatehandlefn.md) | Function to be evaluated in the page context. |
|
||||||
| args | any\[\] | Arguments to pass to <code>pageFunction</code>. |
|
| args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)<!-- -->\[\] | Arguments to pass to <code>pageFunction</code>. |
|
||||||
|
|
||||||
<b>Returns:</b>
|
<b>Returns:</b>
|
||||||
|
|
||||||
|
@ -24,7 +24,11 @@ import { TimeoutSettings } from './TimeoutSettings';
|
|||||||
import { MouseButtonInput } from './Input';
|
import { MouseButtonInput } from './Input';
|
||||||
import { FrameManager, Frame } from './FrameManager';
|
import { FrameManager, Frame } from './FrameManager';
|
||||||
import { getQueryHandlerAndSelector, QueryHandler } from './QueryHandler';
|
import { getQueryHandlerAndSelector, QueryHandler } from './QueryHandler';
|
||||||
import { EvaluateFn, SerializableOrJSHandle } from './EvalTypes';
|
import {
|
||||||
|
EvaluateFn,
|
||||||
|
SerializableOrJSHandle,
|
||||||
|
EvaluateHandleFn,
|
||||||
|
} from './EvalTypes';
|
||||||
import { isNode } from '../environment';
|
import { isNode } from '../environment';
|
||||||
|
|
||||||
// This predicateQueryHandler is declared here so that TypeScript knows about it
|
// This predicateQueryHandler is declared here so that TypeScript knows about it
|
||||||
@ -103,15 +107,10 @@ export class DOMWorld {
|
|||||||
return this._contextPromise;
|
return this._contextPromise;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
async evaluateHandle<HandlerType extends JSHandle = JSHandle>(
|
||||||
* @param {Function|string} pageFunction
|
pageFunction: EvaluateHandleFn,
|
||||||
* @param {!Array<*>} args
|
...args: SerializableOrJSHandle[]
|
||||||
* @returns {!Promise<!JSHandle>}
|
): Promise<HandlerType> {
|
||||||
*/
|
|
||||||
async evaluateHandle(
|
|
||||||
pageFunction: Function | string,
|
|
||||||
...args: unknown[]
|
|
||||||
): Promise<JSHandle> {
|
|
||||||
const context = await this.executionContext();
|
const context = await this.executionContext();
|
||||||
return context.evaluateHandle(pageFunction, ...args);
|
return context.evaluateHandle(pageFunction, ...args);
|
||||||
}
|
}
|
||||||
@ -470,7 +469,7 @@ export class DOMWorld {
|
|||||||
waitForFunction(
|
waitForFunction(
|
||||||
pageFunction: Function | string,
|
pageFunction: Function | string,
|
||||||
options: { polling?: string | number; timeout?: number } = {},
|
options: { polling?: string | number; timeout?: number } = {},
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<JSHandle> {
|
||||||
const {
|
const {
|
||||||
polling = 'raf',
|
polling = 'raf',
|
||||||
@ -581,7 +580,7 @@ class WaitTask {
|
|||||||
_polling: string | number;
|
_polling: string | number;
|
||||||
_timeout: number;
|
_timeout: number;
|
||||||
_predicateBody: string;
|
_predicateBody: string;
|
||||||
_args: unknown[];
|
_args: SerializableOrJSHandle[];
|
||||||
_runCount = 0;
|
_runCount = 0;
|
||||||
promise: Promise<JSHandle>;
|
promise: Promise<JSHandle>;
|
||||||
_resolve: (x: JSHandle) => void;
|
_resolve: (x: JSHandle) => void;
|
||||||
@ -596,7 +595,7 @@ class WaitTask {
|
|||||||
title: string,
|
title: string,
|
||||||
polling: string | number,
|
polling: string | number,
|
||||||
timeout: number,
|
timeout: number,
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
) {
|
) {
|
||||||
if (helper.isString(polling))
|
if (helper.isString(polling))
|
||||||
assert(
|
assert(
|
||||||
|
@ -29,6 +29,11 @@ export type EvaluateFnReturnType<T extends EvaluateFn> = T extends (
|
|||||||
? R
|
? R
|
||||||
: unknown;
|
: unknown;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
export type EvaluateHandleFn = string | ((...args: unknown[]) => unknown);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
|
@ -21,6 +21,7 @@ import { CDPSession } from './Connection';
|
|||||||
import { DOMWorld } from './DOMWorld';
|
import { DOMWorld } from './DOMWorld';
|
||||||
import { Frame } from './FrameManager';
|
import { Frame } from './FrameManager';
|
||||||
import Protocol from '../protocol';
|
import Protocol from '../protocol';
|
||||||
|
import { EvaluateHandleFn, SerializableOrJSHandle } from './EvalTypes';
|
||||||
|
|
||||||
export const EVALUATION_SCRIPT_URL = '__puppeteer_evaluation_script__';
|
export const EVALUATION_SCRIPT_URL = '__puppeteer_evaluation_script__';
|
||||||
const SOURCE_URL_REGEX = /^[\040\t]*\/\/[@#] sourceURL=\s*(\S*?)\s*$/m;
|
const SOURCE_URL_REGEX = /^[\040\t]*\/\/[@#] sourceURL=\s*(\S*?)\s*$/m;
|
||||||
@ -175,15 +176,15 @@ export class ExecutionContext {
|
|||||||
* @returns A promise that resolves to the return value of the given function
|
* @returns A promise that resolves to the return value of the given function
|
||||||
* as an in-page object (a {@link JSHandle}).
|
* as an in-page object (a {@link JSHandle}).
|
||||||
*/
|
*/
|
||||||
async evaluateHandle(
|
async evaluateHandle<HandleType extends JSHandle | ElementHandle = JSHandle>(
|
||||||
pageFunction: Function | string,
|
pageFunction: EvaluateHandleFn,
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<HandleType> {
|
||||||
return this._evaluateInternal<JSHandle>(false, pageFunction, ...args);
|
return this._evaluateInternal<HandleType>(false, pageFunction, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _evaluateInternal<ReturnType>(
|
private async _evaluateInternal<ReturnType>(
|
||||||
returnByValue,
|
returnByValue: boolean,
|
||||||
pageFunction: Function | string,
|
pageFunction: Function | string,
|
||||||
...args: unknown[]
|
...args: unknown[]
|
||||||
): Promise<ReturnType> {
|
): Promise<ReturnType> {
|
||||||
|
@ -29,7 +29,11 @@ import { MouseButtonInput } from './Input';
|
|||||||
import { Page } from './Page';
|
import { Page } from './Page';
|
||||||
import { HTTPResponse } from './HTTPResponse';
|
import { HTTPResponse } from './HTTPResponse';
|
||||||
import Protocol from '../protocol';
|
import Protocol from '../protocol';
|
||||||
import { EvaluateFn, SerializableOrJSHandle } from './EvalTypes';
|
import {
|
||||||
|
EvaluateFn,
|
||||||
|
SerializableOrJSHandle,
|
||||||
|
EvaluateHandleFn,
|
||||||
|
} from './EvalTypes';
|
||||||
|
|
||||||
const UTILITY_WORLD_NAME = '__puppeteer_utility_world__';
|
const UTILITY_WORLD_NAME = '__puppeteer_utility_world__';
|
||||||
|
|
||||||
@ -431,11 +435,11 @@ export class Frame {
|
|||||||
return this._mainWorld.executionContext();
|
return this._mainWorld.executionContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle(
|
async evaluateHandle<HandlerType extends JSHandle = JSHandle>(
|
||||||
pageFunction: Function | string,
|
pageFunction: EvaluateHandleFn,
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<HandlerType> {
|
||||||
return this._mainWorld.evaluateHandle(pageFunction, ...args);
|
return this._mainWorld.evaluateHandle<HandlerType>(pageFunction, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluate<ReturnType extends any>(
|
async evaluate<ReturnType extends any>(
|
||||||
@ -562,7 +566,7 @@ export class Frame {
|
|||||||
waitFor(
|
waitFor(
|
||||||
selectorOrFunctionOrTimeout: string | number | Function,
|
selectorOrFunctionOrTimeout: string | number | Function,
|
||||||
options: {} = {},
|
options: {} = {},
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle | null> {
|
): Promise<JSHandle | null> {
|
||||||
const xPathPattern = '//';
|
const xPathPattern = '//';
|
||||||
|
|
||||||
@ -619,7 +623,7 @@ export class Frame {
|
|||||||
waitForFunction(
|
waitForFunction(
|
||||||
pageFunction: Function | string,
|
pageFunction: Function | string,
|
||||||
options: { polling?: string | number; timeout?: number } = {},
|
options: { polling?: string | number; timeout?: number } = {},
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<JSHandle> {
|
||||||
return this._mainWorld.waitForFunction(pageFunction, options, ...args);
|
return this._mainWorld.waitForFunction(pageFunction, options, ...args);
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ import {
|
|||||||
EvaluateFn,
|
EvaluateFn,
|
||||||
SerializableOrJSHandle,
|
SerializableOrJSHandle,
|
||||||
EvaluateFnReturnType,
|
EvaluateFnReturnType,
|
||||||
|
EvaluateHandleFn,
|
||||||
} from './EvalTypes';
|
} from './EvalTypes';
|
||||||
|
|
||||||
export interface BoxModel {
|
export interface BoxModel {
|
||||||
@ -174,10 +175,10 @@ export class JSHandle {
|
|||||||
*
|
*
|
||||||
* See {@link Page.evaluateHandle} for more details.
|
* See {@link Page.evaluateHandle} for more details.
|
||||||
*/
|
*/
|
||||||
async evaluateHandle(
|
async evaluateHandle<HandleType extends JSHandle | ElementHandle = JSHandle>(
|
||||||
pageFunction: Function | string,
|
pageFunction: EvaluateHandleFn,
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<HandleType> {
|
||||||
return await this.executionContext().evaluateHandle(
|
return await this.executionContext().evaluateHandle(
|
||||||
pageFunction,
|
pageFunction,
|
||||||
this,
|
this,
|
||||||
@ -891,19 +892,22 @@ export class ElementHandle extends JSHandle {
|
|||||||
* @param expression - Expression to {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate | evaluate}
|
* @param expression - Expression to {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/evaluate | evaluate}
|
||||||
*/
|
*/
|
||||||
async $x(expression: string): Promise<ElementHandle[]> {
|
async $x(expression: string): Promise<ElementHandle[]> {
|
||||||
const arrayHandle = await this.evaluateHandle((element, expression) => {
|
const arrayHandle = await this.evaluateHandle(
|
||||||
const document = element.ownerDocument || element;
|
(element: Document, expression: string) => {
|
||||||
const iterator = document.evaluate(
|
const document = element.ownerDocument || element;
|
||||||
expression,
|
const iterator = document.evaluate(
|
||||||
element,
|
expression,
|
||||||
null,
|
element,
|
||||||
XPathResult.ORDERED_NODE_ITERATOR_TYPE
|
null,
|
||||||
);
|
XPathResult.ORDERED_NODE_ITERATOR_TYPE
|
||||||
const array = [];
|
);
|
||||||
let item;
|
const array = [];
|
||||||
while ((item = iterator.iterateNext())) array.push(item);
|
let item;
|
||||||
return array;
|
while ((item = iterator.iterateNext())) array.push(item);
|
||||||
}, expression);
|
return array;
|
||||||
|
},
|
||||||
|
expression
|
||||||
|
);
|
||||||
const properties = await arrayHandle.getProperties();
|
const properties = await arrayHandle.getProperties();
|
||||||
await arrayHandle.dispose();
|
await arrayHandle.dispose();
|
||||||
const result = [];
|
const result = [];
|
||||||
|
@ -42,7 +42,11 @@ import { FileChooser } from './FileChooser';
|
|||||||
import { ConsoleMessage, ConsoleMessageType } from './ConsoleMessage';
|
import { ConsoleMessage, ConsoleMessageType } from './ConsoleMessage';
|
||||||
import { PuppeteerLifeCycleEvent } from './LifecycleWatcher';
|
import { PuppeteerLifeCycleEvent } from './LifecycleWatcher';
|
||||||
import Protocol from '../protocol';
|
import Protocol from '../protocol';
|
||||||
import { EvaluateFn, SerializableOrJSHandle } from './EvalTypes';
|
import {
|
||||||
|
EvaluateFn,
|
||||||
|
SerializableOrJSHandle,
|
||||||
|
EvaluateHandleFn,
|
||||||
|
} from './EvalTypes';
|
||||||
|
|
||||||
const writeFileAsync = promisify(fs.writeFile);
|
const writeFileAsync = promisify(fs.writeFile);
|
||||||
|
|
||||||
@ -639,12 +643,61 @@ export class Page extends EventEmitter {
|
|||||||
return this.mainFrame().$(selector);
|
return this.mainFrame().$(selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
async evaluateHandle(
|
/**
|
||||||
pageFunction: Function | string,
|
* @remarks
|
||||||
...args: unknown[]
|
*
|
||||||
): Promise<JSHandle> {
|
* The only difference between {@link Page.evaluate | page.evaluate} and
|
||||||
|
* `page.evaluateHandle` is that `evaluateHandle` will return the value
|
||||||
|
* wrapped in an in-page object.
|
||||||
|
*
|
||||||
|
* If the function passed to `page.evaluteHandle` 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
|
||||||
|
* ```
|
||||||
|
* const aHandle = await page.evaluateHandle('document')
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* {@link 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 {@link JSHandle},
|
||||||
|
* but if `pageFunction` returns a reference to an element,
|
||||||
|
* you instead get an {@link ElementHandle} back:
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* ```
|
||||||
|
* const button = await page.evaluateHandle(() => document.querySelector('button'));
|
||||||
|
* // can call `click` because `button` is an `ElementHandle`
|
||||||
|
* await button.click();
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* 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>(...);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @param pageFunction - a function that is run within the page
|
||||||
|
* @param args - arguments to be passed to the pageFunction
|
||||||
|
*/
|
||||||
|
async evaluateHandle<HandlerType extends JSHandle = JSHandle>(
|
||||||
|
pageFunction: EvaluateHandleFn,
|
||||||
|
...args: SerializableOrJSHandle[]
|
||||||
|
): Promise<HandlerType> {
|
||||||
const context = await this.mainFrame().executionContext();
|
const context = await this.mainFrame().executionContext();
|
||||||
return context.evaluateHandle(pageFunction, ...args);
|
return context.evaluateHandle<HandlerType>(pageFunction, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
async queryObjects(prototypeHandle: JSHandle): Promise<JSHandle> {
|
async queryObjects(prototypeHandle: JSHandle): Promise<JSHandle> {
|
||||||
@ -1471,7 +1524,7 @@ export class Page extends EventEmitter {
|
|||||||
timeout?: number;
|
timeout?: number;
|
||||||
polling?: string | number;
|
polling?: string | number;
|
||||||
} = {},
|
} = {},
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<JSHandle> {
|
||||||
return this.mainFrame().waitFor(
|
return this.mainFrame().waitFor(
|
||||||
selectorOrFunctionOrTimeout,
|
selectorOrFunctionOrTimeout,
|
||||||
@ -1508,7 +1561,7 @@ export class Page extends EventEmitter {
|
|||||||
timeout?: number;
|
timeout?: number;
|
||||||
polling?: string | number;
|
polling?: string | number;
|
||||||
} = {},
|
} = {},
|
||||||
...args: unknown[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<JSHandle> {
|
||||||
return this.mainFrame().waitForFunction(pageFunction, options, ...args);
|
return this.mainFrame().waitForFunction(pageFunction, options, ...args);
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import { ExecutionContext } from './ExecutionContext';
|
|||||||
import { JSHandle } from './JSHandle';
|
import { JSHandle } from './JSHandle';
|
||||||
import { CDPSession } from './Connection';
|
import { CDPSession } from './Connection';
|
||||||
import Protocol from '../protocol';
|
import Protocol from '../protocol';
|
||||||
|
import { EvaluateHandleFn, SerializableOrJSHandle } from './EvalTypes';
|
||||||
|
|
||||||
type ConsoleAPICalledCallback = (
|
type ConsoleAPICalledCallback = (
|
||||||
eventType: string,
|
eventType: string,
|
||||||
@ -152,11 +153,11 @@ export class WebWorker extends EventEmitter {
|
|||||||
* @param args - Arguments to pass to `pageFunction`.
|
* @param args - Arguments to pass to `pageFunction`.
|
||||||
* @returns Promise which resolves to the return value of `pageFunction`.
|
* @returns Promise which resolves to the return value of `pageFunction`.
|
||||||
*/
|
*/
|
||||||
async evaluateHandle(
|
async evaluateHandle<HandlerType extends JSHandle = JSHandle>(
|
||||||
pageFunction: Function | string,
|
pageFunction: EvaluateHandleFn,
|
||||||
...args: any[]
|
...args: SerializableOrJSHandle[]
|
||||||
): Promise<JSHandle> {
|
): Promise<JSHandle> {
|
||||||
return (await this._executionContextPromise).evaluateHandle(
|
return (await this._executionContextPromise).evaluateHandle<HandlerType>(
|
||||||
pageFunction,
|
pageFunction,
|
||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
|
@ -182,17 +182,11 @@ describe('ElementHandle specs', function () {
|
|||||||
const { page, server } = getTestState();
|
const { page, server } = getTestState();
|
||||||
|
|
||||||
await page.goto(server.PREFIX + '/shadow.html');
|
await page.goto(server.PREFIX + '/shadow.html');
|
||||||
const buttonHandle = await page.evaluateHandle(
|
const buttonHandle = await page.evaluateHandle<ElementHandle>(
|
||||||
// @ts-expect-error button is expected to be in the page's scope.
|
// @ts-expect-error button is expected to be in the page's scope.
|
||||||
() => button
|
() => button
|
||||||
);
|
);
|
||||||
// TODO (@jackfranklin): TS types are off here. evaluateHandle returns a
|
await buttonHandle.click();
|
||||||
// JSHandle but that doesn't have a click() method. In this case it seems
|
|
||||||
// to return an ElementHandle. I'm not sure if the tests are wrong here
|
|
||||||
// and should use evaluate<ElementHandle> or if the type of evaluateHandle
|
|
||||||
// should change to enable the user to tell us they are expecting an
|
|
||||||
// ElementHandle rather than the default JSHandle.
|
|
||||||
await (buttonHandle as ElementHandle).click();
|
|
||||||
expect(
|
expect(
|
||||||
await page.evaluate(
|
await page.evaluate(
|
||||||
// @ts-expect-error clicked is expected to be in the page's scope.
|
// @ts-expect-error clicked is expected to be in the page's scope.
|
||||||
|
@ -53,6 +53,7 @@ describe('JSHandle', function () {
|
|||||||
const aHandle = await page.evaluateHandle(() => document.body);
|
const aHandle = await page.evaluateHandle(() => document.body);
|
||||||
let error = null;
|
let error = null;
|
||||||
await page
|
await page
|
||||||
|
// @ts-expect-error we are deliberately passing a bad type here (nested object)
|
||||||
.evaluateHandle((opts) => opts.elem.querySelector('p'), {
|
.evaluateHandle((opts) => opts.elem.querySelector('p'), {
|
||||||
elem: aHandle,
|
elem: aHandle,
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user