You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Puppeteer中通过getProperty()获取dataset成员值

Puppeteer 获取元素dataset属性值的问题解决

问题背景

现有DOM元素:

<div class="myClass" data-val1="A" data-val2="B" data-val3="C" someid="1"></div>

通过Puppeteer可以正常获取className属性:

let myselector = await page.waitForSelector('div[class="myClass"]');
let myid = await (await myselector.getProperty('className')).jsonValue();

但尝试获取dataset时触发错误:

let myid = await myselector.getProperty('dataset');

错误信息:

Protocol error (DOM.describeNode): Object id doesn't reference a Node

补充细节:获取到的元素为CdpElementHandle类型,调用getProperties()也会出现相同错误,但可通过多层调用获取单个普通属性。

可行解决方法

1. 直接用getAttribute获取单个data属性

跳过dataset,直接获取目标data属性:

const element = await page.waitForSelector('div.myClass');
const val2 = await element.getAttribute('data-val2');
console.log(val2); // 输出 "B"

2. 通过evaluate在浏览器上下文处理dataset

利用evaluate在浏览器环境内直接访问dataset,可一次性获取所有data属性或单个值:

// 获取全部dataset属性
const element = await page.waitForSelector('div.myClass');
const allData = await element.evaluate(el => ({...el.dataset}));
console.log(allData.val2); // 输出 "B"

// 直接获取单个值
const val2 = await element.evaluate(el => el.dataset.val2);

3. 适配getProperty的写法

如果需要保留getProperty的调用方式,可结合evaluate处理返回的对象:

const elementHandle = await page.waitForSelector('div.myClass');
const val2 = await (await elementHandle.getProperty('dataset')).evaluate(ds => ds.val2);

错误原因

直接调用getProperty('dataset')报错,是因为dataset是浏览器端的DOMStringMap复杂对象,Puppeteer无法直接跨上下文序列化这类对象,必须通过evaluate在浏览器内部处理后,返回字符串、普通对象等可序列化的简单类型。

内容的提问来源于stack exchange,提问作者user1337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:27:34