如何获取Selenium中aria-rowcount标注的完整表格行数?
解决Selenium获取表格行数与aria-rowcount不一致的问题
问题分析
你通过统计tbody下的<tr>元素数量得到29行,但表格标签的aria-rowcount="93"明确标注总行数为93,且页面无可见分页。这种情况通常是因为表格采用虚拟滚动(懒加载)仅渲染当前视口内的行,或是你的统计逻辑未覆盖所有行结构。
具体解决建议
1. 直接读取aria-rowcount属性(最快捷方案)
既然表格已通过aria-rowcount属性标注总行数,直接读取该属性即可,无需遍历DOM元素:
// 修改或新增方法获取总行数 public int getTotalRowCountFromAria() { WebElement table = driver.findElement(By.id("MyTable")); String ariaRowCount = table.getAttribute("aria-rowcount"); return Integer.parseInt(ariaRowCount); }
2. 处理虚拟滚动(懒加载)表格
如果表格是虚拟滚动实现,只会渲染可见区域的行,需要通过滚动触发所有行加载完成后再统计:
public int getFullRowCount() { WebElement tableBody = driver.findElement(By.xpath("//*[@id='MyTable']//tbody")); JavascriptExecutor js = (JavascriptExecutor) driver; long lastRowCount = 0; while (true) { // 滚动到表格底部 js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", tableBody); // 等待行加载(可根据页面速度调整等待时长) try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } // 统计当前已渲染的行数量 long currentRowCount = tableBody.findElements(By.tagName("tr")).size(); if (currentRowCount == lastRowCount) { // 行数量不再变化,说明全部加载完成 break; } lastRowCount = currentRowCount; } return (int) lastRowCount; }
优化提示:可以将
Thread.sleep()替换为Selenium的显式等待(如等待行数量变化),提升稳定性。
3. 检查是否存在多个<tbody>或隐藏行
部分表格会将行拆分到多个<tbody>中,或是存在CSS隐藏的行,统计时需要覆盖所有行结构:
public int getTotalRowCountFromAllTbody() { List<WebElement> allTbodies = driver.findElements(By.xpath("//*[@id='MyTable']//tbody")); int totalRows = 0; for (WebElement tbody : allTbodies) { totalRows += tbody.findElements(By.tagName("tr")).size(); } return totalRows; }
4. 确认表格定位的准确性
确保你定位的是目标表格:
- 检查页面是否存在重复
id的元素(尽管id应唯一,但部分页面可能存在例外) - 如果表格嵌套在
<iframe>内,需要先切换到iframe再执行定位:
driver.switchTo().frame("iframeIdOrName"); // 之后再执行表格相关操作
内容的提问来源于stack exchange,提问作者Latest
相关产品推荐
相关产品推荐

