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

如何在Protractor中滚动网格并获取所有动态加载行的文本?

解决Protractor中AG Grid动态滚动获取所有元素文本的问题

嘿,我来帮你搞定这个动态网格滚动的问题!你之前的代码只做了单次滚动,但AG Grid是滚动后才会动态生成新行,所以得循环滚动直到所有行都加载出来才行。下面是完整的实现方案:

核心思路

因为网格行是随滚动动态加载的,我们需要:

  • 重复滚动到网格底部
  • 等待新行加载完成
  • 检查行数量是否还在增加,直到数量不再变化(说明所有行都加载完了)
  • 最后一次性获取所有行的文本

完整代码实现

// 定位AG Grid的滚动容器
const gridScrollContainer = element(by.css('.ag-scrolls'));
// 定位网格行的选择器(根据你的实际情况调整,比如你之前用的行定位器)
const gridRowSelector = by.css('.ag-row');

// 递归函数:滚动并收集所有行文本
async function getAllGridRowTexts() {
  // 获取当前已加载的所有行
  let currentRows = await element.all(gridRowSelector);
  let initialRowCount = currentRows.length;

  // 滚动到容器最底部,触发新行加载
  await browser.executeScript(
    'arguments[0].scrollTop = arguments[0].scrollHeight',
    gridScrollContainer.getWebElement()
  );

  // 智能等待新行加载(比固定sleep更可靠)
  await browser.wait(
    protractor.ExpectedConditions.numberOfElementsToBeMoreThan(gridRowSelector, initialRowCount),
    5000, // 超时时间5秒,可根据网格加载速度调整
    '等待新行加载超时'
  );

  // 获取滚动后的行数量
  let updatedRows = await element.all(gridRowSelector);
  let updatedRowCount = updatedRows.length;

  // 如果行数量还在增加,继续递归滚动
  if (updatedRowCount > initialRowCount) {
    return getAllGridRowTexts();
  } else {
    // 所有行加载完成,提取所有行的文本
    let allRowTexts = await Promise.all(updatedRows.map(row => row.getText()));
    return allRowTexts;
  }
}

// 调用函数并处理结果
getAllGridRowTexts().then(allTexts => {
  console.log('所有网格行的文本:', allTexts);
  // 这里可以进行后续的处理、断言等操作
});

关键细节说明

  • 递归滚动:通过递归重复执行滚动+检查的逻辑,确保不会漏掉任何动态加载的行
  • 智能等待:用ExpectedConditions.numberOfElementsToBeMoreThan替代固定的browser.sleep(),只有当行数量真的增加了才继续,避免不必要的等待,也更稳定
  • 滚动到底部:直接滚动到容器的scrollHeight(容器的总高度),比滚动到某一行的offset更可靠,因为每次滚动到底部都会触发AG Grid的新行加载机制
  • 行选择器调整:如果你的网格行不是用.ag-row标识的,记得把gridRowSelector换成你实际使用的定位器(比如你之前提到的特定行的CSS值)

替代方案(循环实现,非递归)

如果你不习惯递归,也可以用循环来实现:

async function getAllGridRowTextsLoop() {
  let previousRowCount = 0;
  let currentRowCount = -1;

  while (currentRowCount !== previousRowCount) {
    previousRowCount = currentRowCount;
    // 获取当前行数量
    currentRowCount = await element.all(gridRowSelector).count();
    // 滚动到底部
    await browser.executeScript(
      'arguments[0].scrollTop = arguments[0].scrollHeight',
      gridScrollContainer.getWebElement()
    );
    // 等待加载(也可以换成智能等待)
    await browser.sleep(800);
  }

  // 所有行加载完成,获取文本
  let allRows = await element.all(gridRowSelector);
  return Promise.all(allRows.map(row => row.getText()));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:29