如何在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
相关产品推荐
相关产品推荐

