-
Notifications
You must be signed in to change notification settings - Fork 9.3k
Add more explanation for page.evaluateHandle() #1867
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ge.evaluateHandle
|
Thanks for your pull request. It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). 📝 Please visit https://cla.developers.google.com/ to sign. Once you've signed, please reply here (e.g.
|
|
I signed it! |
|
CLAs look good, thanks! |
docs/api.md
Outdated
| - `pageFunction` <[function]|[string]> Function to be evaluated in the page context | ||
| - `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction` | ||
| - returns: <[Promise]<[Serializable]>> Resolves to the return value of `pageFunction` | ||
| - returns: <[Promise]<[Serializable]>> Promise which resolves to the return value of `pageFunction` as a javascript-object |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JavaScript object.
examples/element-html.js
Outdated
|
|
||
| // to show the difference between two methods | ||
| console.log(`jsObject is NOT equal to jsHandle: ${jsObject !== jsHandle}`); // prints true | ||
| console.log(`jsObject is equal to jsHandle.jsonValue(): ${jsObject === (await jsHandle.jsonValue())}`); // prints true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if this is the best result to show int the demo, but I can't think of anything better.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alternatively, this example might just be part of the docs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yea. I'm also thinking we should just have these snippets and explanation as part of the docs. It's a less compelling standalone demo.
Droped element-html.js file from examples.
|
@ebidel please take a look now: I've removed the example file and moved it to the api.md. |
docs/api.md
Outdated
| If the function, passed to the `page.evaluateHandle`, returns a [Promise], then `page.evaluateHandle` would wait for the promise to resolve and return its value. | ||
| If the function passed to the `page.evaluateHandle` returns a [Promise], then `page.evaluateHandle` would wait for the promise to resolve and return its value. | ||
|
|
||
| The only difference between `page.evaluate` and `page.evaluateHandler` is that `page.evaluate` returns JSON representation of the object and `page.evaluateHandler` returns in-page object (JSHandle): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
evaluateHandler -> evaluateHandle on both of these.
docs/api.md
Outdated
| const aWindowHandle = await page.evaluateHandle(() => Promise.resolve(window)); | ||
| aWindowHandle; // Handle for the window object. | ||
| ``` | ||
| // returns JavaScript object |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"returns a JSON object" to be consistent with your description.
docs/api.md
Outdated
| If the function, passed to the `page.evaluateHandle`, returns a [Promise], then `page.evaluateHandle` would wait for the promise to resolve and return its value. | ||
| If the function passed to the `page.evaluateHandle` returns a [Promise], then `page.evaluateHandle` would wait for the promise to resolve and return its value. | ||
|
|
||
| The only difference between `page.evaluate` and `page.evaluateHandler` is that `page.evaluate` returns JSON representation of the object and `page.evaluateHandler` returns in-page object (JSHandle): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
returns JSON representation -> returns a JSON representation
|
@ebidel I've updated the PR, please take a look. Thanks! |
|
Hi @ebidel @JoelEinbinder this PR is ready to be reviewed again, very quick one. Thanks. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for working on this.
| - `pageFunction` <[function]|[string]> Function to be evaluated in the page context | ||
| - `...args` <...[Serializable]|[JSHandle]> Arguments to pass to `pageFunction` | ||
| - returns: <[Promise]<[JSHandle]>> Resolves to the return value of `pageFunction` | ||
| - returns: <[Promise]<[JSHandle]>> Promise which resolves to the return value of `pageFunction` as in-page object (JSHandle) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are many evaluateHandle calls: page.evaluateHandle, frame.evaluateHandle and elementHandle.evaluateHandle. We try to keep documentation consistent between them all; so all the changes has to be mirrored there as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool, I will update there as well.
docs/api.md
Outdated
|
|
||
| // both lines below print true | ||
| console.log(`jsObject is NOT equal to jsHandle: ${jsObject !== jsHandle}`); | ||
| console.log(`jsObject is equal to jsHandle.jsonValue(): ${jsObject === (await jsHandle.jsonValue())}`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is actually the case: triple-equals checks for identity equality, which is not the case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But identity equality (aka strict equality) means that type and values are the same. In this case it shows that jsObject is the same type and value as jsHandle.jsonValue().
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@yelisaveta in case of non-primitives, it means that two objects are the same by identity, not by value.
e.g.:
console.log({} === {}); // false
let a = {};
let b = a;
let c = a;
console.log(b === c); // trueThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry for a delay - I've now understood why I used strict equality check - initially I've created an example to demonstrate the difference between these two methods, see here: 53ae964
Examples were using pageFunction which returned element.innterHTML - which is a String. That's why strict equality worked correctly for me.
I see that having these snippets in the docs without the pageFunction definition looks confusing.
docs/api.md
Outdated
| const jsHandle = await page.evaluateHandle(pageFunction, elementHandle); | ||
|
|
||
| // both lines below print true | ||
| console.log(`jsObject is NOT equal to jsHandle: ${jsObject !== jsHandle}`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd drop this console.log – even two consecutive page.evaluate will result in strict equality failing as well:
const jsObject1 = await page.evaluate(pageFunction, elementHandle);
const jsObject2 = await page.evaluate(pageFunction, elementHandle);
console.log(jsObject1 === jsObject2); // false, unless pageFunction returns primitivesThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point, agree.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same as my comment above - it was working for me since I was using the pageFunction that returns element.innterHTML.
…eHandle. Synced updates for page, frame and context
|
@aslushnikov PR has been updated, please take a look. Thank you. |
No description provided.