在 Puppeteer 中从 page.evaluate 获取元素?
Get elements from page.evaluate in Puppeteer?
我是第一次使用 Node.js 和 Puppeteer,找不到输出方式从 page.evaluate
到外部范围的值。
我的算法:
- 登录
- 打开URL
- 获取
ul
- 遍历每个
li
并单击它
- 等待设置
innetHTML
并将其 src
内容添加到数组。
如何 return 来自 page.evaluate()
的数据?
const puppeteer = require('puppeteer');
const CREDENTIALS = require(`./env.js`).credentials;
const SELECTORS = require(`./env.js`).selectors;
const URLS = require(`./env.js`).urls;
async function run() {
try {
const urls = [];
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto(URLS.login, {waitUntil: 'networkidle0'});
await page.type(SELECTORS.username, CREDENTIALS.username);
await page.type(SELECTORS.password, CREDENTIALS.password);
await page.click(SELECTORS.submit);
await page.waitForNavigation({waitUntil: 'networkidle0'});
await page.goto(URLS.course, {waitUntil: 'networkidle0'});
const nodes = await page.evaluate(selector => {
let elements = document.querySelector(selector).childNodes;
console.log('elements', elements);
return Promise.resolve(elements ? elements : null);
}, SELECTORS.list);
const links = await page.evaluate((urls, nodes, VIDEO) => {
return Array.from(nodes).forEach((node) => {
node.click();
return Promise.resolve(urls.push(document.querySelector(VIDEO).getAttribute('src')));
})
}, urls, nodes, SELECTORS.video);
const output = await links;
} catch (err) {
console.error('err:', err);
}
}
run();
函数 page.evaluate()
can only return a serializable 值,因此无法使用此方法 return 元素或 NodeList
从页面环境返回。
您可以使用 page.$$()
instead to obtain an ElementHandle
数组:
const nodes = await page.$$(`${selector} > *`); // selector children
如果常量nodes
的length
是0
,那么确定你是在等待选择器指定的元素被添加到DOM page.waitForSelector()
:
await page.waitForSelector(selector);
使用page.evaluateHandle()
一个API是:here
let elementsHendles = await page.evaluateHandle(() => document.querySelectorAll('a'));
let elements = await elementsHendles.getProperties();
let elements_arr = Array.from(elements.values());
我是第一次使用 Node.js 和 Puppeteer,找不到输出方式从 page.evaluate
到外部范围的值。
我的算法:
- 登录
- 打开URL
- 获取
ul
- 遍历每个
li
并单击它 - 等待设置
innetHTML
并将其src
内容添加到数组。
如何 return 来自 page.evaluate()
的数据?
const puppeteer = require('puppeteer');
const CREDENTIALS = require(`./env.js`).credentials;
const SELECTORS = require(`./env.js`).selectors;
const URLS = require(`./env.js`).urls;
async function run() {
try {
const urls = [];
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto(URLS.login, {waitUntil: 'networkidle0'});
await page.type(SELECTORS.username, CREDENTIALS.username);
await page.type(SELECTORS.password, CREDENTIALS.password);
await page.click(SELECTORS.submit);
await page.waitForNavigation({waitUntil: 'networkidle0'});
await page.goto(URLS.course, {waitUntil: 'networkidle0'});
const nodes = await page.evaluate(selector => {
let elements = document.querySelector(selector).childNodes;
console.log('elements', elements);
return Promise.resolve(elements ? elements : null);
}, SELECTORS.list);
const links = await page.evaluate((urls, nodes, VIDEO) => {
return Array.from(nodes).forEach((node) => {
node.click();
return Promise.resolve(urls.push(document.querySelector(VIDEO).getAttribute('src')));
})
}, urls, nodes, SELECTORS.video);
const output = await links;
} catch (err) {
console.error('err:', err);
}
}
run();
函数 page.evaluate()
can only return a serializable 值,因此无法使用此方法 return 元素或 NodeList
从页面环境返回。
您可以使用 page.$$()
instead to obtain an ElementHandle
数组:
const nodes = await page.$$(`${selector} > *`); // selector children
如果常量nodes
的length
是0
,那么确定你是在等待选择器指定的元素被添加到DOM page.waitForSelector()
:
await page.waitForSelector(selector);
使用page.evaluateHandle()
一个API是:here
let elementsHendles = await page.evaluateHandle(() => document.querySelectorAll('a'));
let elements = await elementsHendles.getProperties();
let elements_arr = Array.from(elements.values());