如何通过 Puppeteer 获取元素的孩子

Goo*_*bot 7 javascript webautomation node.js puppeteer

我知道puppeteer得到它自己的句柄而不是标准DOM元素,但我不明白为什么我不能通过找到的元素继续相同的查询作为

const els = await page.$$('div.parent');

for (let i = 0; i < els.length; i++) {
    const img = await els[i].$('img').getAttribute('src');
    console.log(img);
    const link = await els[i].$('a').getAttribute('href');
    console.log(link);
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*orf 11

问题

元素句柄作为 Node.js 和浏览器运行时之间的抽象层是必要的。实际的 DOM 元素不会发送到 Node.js 环境。

这意味着当您想从元素获取属性时,必须将数据传输到浏览器(要使用哪个 DOM 元素)并返回(结果)。

解决方案

因此,结果 fromawait els[i].$('img')并不是真正的 DOM 元素,而只是一个链接到浏览器环境中元素的包装器。要获取该属性,您必须使用如下函数elementHandle.$eval

const imgSrc = await els[i].$eval('img', el => el.getAttribute('src'));
Run Code Online (Sandbox Code Playgroud)

这会querySelector在给定元素上运行该函数并执行给定函数以返回其属性。


har*_*ded 7

您可以使用 $eval

onst els = await page.$$('div.parent');

for (let i = 0; i < els.length; i++) {
    const img = await els[i].$eval('img', i => i.getAttribute('src'));
    console.log(img);
    const link = await els[i].$eval('a', a => a.getAttribute('href'));
    console.log(link);
}
Run Code Online (Sandbox Code Playgroud)