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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:09:25