javascript - 如何通过 Puppeteer 获取元素的子元素

标签 javascript node.js puppeteer webautomation

我知道 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);
}

最佳答案

问题

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

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

解决方案

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

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

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

关于javascript - 如何通过 Puppeteer 获取元素的子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659097/

相关文章:

javascript - 每次循环完成后 promise 履行

javascript - Javascript/Node.js 引擎如何将 JSON 存储在内存中?

node.js - 用户的Nodejs CSV数据导出系统

javascript - Puppeteer.js - 抓取域列表和存储数据

javascript - 用 DOMSubtreeModified 代替 MutationObserver 问题

javascript - "HTML FORM action=location.replace(' nextpage.html')"怎么办?

javascript - CSS代码/文件可以加载JS代码/文件吗?

javascript - 您见过的最令人印象深刻的 Javascript/Flash/Silverlight 示例是什么?

puppeteer - 如何在 puppeteer 中单击 id 包含冒号的元素?

javascript - Puppeteer - 如何删除脚本标签