Puppeteer循环查询匹配规则类名的表格行每次运行结果不一致是何原因
问题原因
- 缺少元素等待逻辑:Puppeteer执行
page.$$时不会主动等待元素动态渲染完成,绝大多数表格数据都是异步加载渲染的,你执行查询时前几行的DOM还没有插入到页面中,自然匹配不到。每次页面接口响应速度、DOM渲染速度都有波动,就会出现每次匹配到的起始行不一致的问题。 - 循环逻辑存在缺陷:你定义的
tableRowsExists变量全程没有被修改,整个循环属于死循环,会一直递增计数器查询不存在的元素,属于严重的逻辑隐患。 - 逐行查询的方式稳定性差:逐次拼接类名调用
page.$$会频繁在Node环境和浏览器环境之间通信,每次通信都有延迟,进一步放大了渲染时序带来的结果不一致问题。
修复方案
// 先等待首个目标行渲染完成,最多等待10秒,可根据实际情况调整超时时间 await page.waitForSelector('tr.oddsRow111-0.sprmr.tr-hover', { timeout: 10000 }); // 可选优化:增加短延时确保所有表格行都渲染完成,延时时长可根据页面性能调整 await page.waitForTimeout(200); // 用CSS属性匹配选择器一次性查询所有符合命名规则的行,无需逐行查询 const tableRows = await page.$$('tr[class*="oddsRow111-"][class*="sprmr"][class*="tr-hover"]'); // 验证匹配结果 console.log(`共匹配到${tableRows.length}行表格数据`); // 后续可遍历tableRows处理每行逻辑
优化后可以彻底解决匹配结果不稳定的问题,同时代码更简洁,执行效率也更高。
内容的提问来源于stack exchange,提问作者Emanuele Bertuol
相关产品推荐
相关产品推荐

