Playwright使用$$eval读取表格td子元素返回null问题排查
问题根源
你的代码选择器写错了:#gvContents > tbody选中的是表格的tbody容器,不是数据行。tbody的直接子元素是tr不是td,你直接在tbody上查询td,DOM层级不匹配,加上没有做元素存在性判断、没有等待动态内容加载,最终就会拿到null返回值。
修复代码
// 等待表格数据行渲染完成,避免DOM未加载就执行查询 await page2.waitForSelector('#gvContents tbody tr'); const detalleDatos = await page2.$$eval('#gvContents > tbody > tr', (rows) => { return rows // 过滤掉表头、空行这类单元格数量不足的无效行 .filter(row => row.querySelectorAll('td').length >= 13) .map(row => { // 封装单元格取值方法,做空兼容避免报错 const getCellText = (cellIndex) => { const cell = row.querySelector(`td:nth-child(${cellIndex})`); return cell ? cell.textContent.trim() : ''; }; return { orden: getCellText(1), pedido: getCellText(2), factura: getCellText(3), artículo: getCellText(4), sku: getCellText(5), unidadesContenedores: getCellText(6), unidadesContenedoresCargados: getCellText(7), PesoLb: getCellText(8), PesoKg: getCellText(9), CubosFt: getCellText(10), CubosM: getCellText(11), PrecioUd: getCellText(12), PrecioExt: getCellText(13) }; }); });
关键调整点
- 选择器从选中tbody改为选中tbody下的所有
tr数据行,遍历对象从tbody容器改为实际存放单元格的行元素 - 增加元素加载等待逻辑,适配动态渲染页面的渲染时机,避免DOM未生成就执行查询
- 增加空值兼容,某行单元格缺失时不会因为访问null的textContent属性抛出错误,导致整个求值失败返回null
- 增加无效行过滤,自动跳过表头、空分隔行这类不需要采集的内容
内容的提问来源于stack exchange,提问作者Matias Guzman
相关产品推荐
相关产品推荐

