Puppeteer - 如何使用 page.evaluateHandle
Puppeteer - how to use page.evaluateHandle
我在使用最新版本的 puppeteer 时遇到了一些问题。
我正在使用 puppeteer 版本 0.13.0。
我有一个包含此元素的网站:
<div class="header">hey there</div>
我正在尝试 运行 此代码:
const headerHandle = await page.evaluateHandle(() => {
const element = document.getElementsByClassName('header');
return element;
});
现在 headerHandle 是一个带有描述的 JSHandle:'HTMLCollection(0)'。
如果我尝试 运行
headerHandle.getProperties()
并尝试 console.log 我得到 Promise { <pending> }
.
如果我只是尝试获取这样的元素:
const result = await page.evaluate(() => {
const element = document.getElementsByClassName('header');
return Promise.resolve(element);
});
我得到一个空对象。
如何获取实际元素或元素的值?
Puppeteer 改变了 evaluate
的工作方式,检索 DOM 元素的最安全方法是创建 JSHandle,并将该句柄传递给评估函数:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
const jsHandle = await page.evaluateHandle(() => {
const elements = document.getElementsByTagName('h1');
return elements;
});
console.log(jsHandle); // JSHandle
const result = await page.evaluate(els => els[0].innerHTML, jsHandle);
console.log(result); // it will log the string 'Example Domain'
await browser.close();
})();
供参考:evalute docs, issue #1590, issue #1003 and PR #1098
我在使用最新版本的 puppeteer 时遇到了一些问题。
我正在使用 puppeteer 版本 0.13.0。
我有一个包含此元素的网站:
<div class="header">hey there</div>
我正在尝试 运行 此代码:
const headerHandle = await page.evaluateHandle(() => {
const element = document.getElementsByClassName('header');
return element;
});
现在 headerHandle 是一个带有描述的 JSHandle:'HTMLCollection(0)'。
如果我尝试 运行
headerHandle.getProperties()
并尝试 console.log 我得到 Promise { <pending> }
.
如果我只是尝试获取这样的元素:
const result = await page.evaluate(() => {
const element = document.getElementsByClassName('header');
return Promise.resolve(element);
});
我得到一个空对象。
如何获取实际元素或元素的值?
Puppeteer 改变了 evaluate
的工作方式,检索 DOM 元素的最安全方法是创建 JSHandle,并将该句柄传递给评估函数:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
const jsHandle = await page.evaluateHandle(() => {
const elements = document.getElementsByTagName('h1');
return elements;
});
console.log(jsHandle); // JSHandle
const result = await page.evaluate(els => els[0].innerHTML, jsHandle);
console.log(result); // it will log the string 'Example Domain'
await browser.close();
})();
供参考:evalute docs, issue #1590, issue #1003 and PR #1098