如何使用Selenium滚动到大小持续增加的动态列表的最后一个元素
Selenium模态框无限滚动列表加载全量元素解决方案
问题根因
- 你之前的滚动操作对象是全局页面
body,而模态窗口的滚动区域是独立的内部容器,全局滚动不会触发模态框内的列表加载 - 无限滚动列表需要持续滚动到当前已加载的最后一个元素,等待新元素加载后重复操作,直到连续多次滚动后列表元素数量不再变化,才代表全量加载完成
完整实现代码(Java)
// 1. 定位模态框内部的滚动容器,需替换为你实际的滚动容器选择器 // 可通过F12元素面板找到滚动时scrollTop属性变化的父元素,通常带有overflow: auto/scroll属性 WebElement modalScrollContainer = driver.findElement(By.cssSelector(".modal-scroll-area")); // 列表元素的选择器,复用你之前的.Abc类选择器 String listItemSelector = ".Abc"; int previousItemCount = 0; int noNewItemRetry = 0; // 最多5次无新元素就终止,避免无限循环 int maxRetry = 5; while (noNewItemRetry < maxRetry) { List<WebElement> currentItems = driver.findElements(By.cssSelector(listItemSelector)); int currentItemCount = currentItems.size(); // 无新元素加载时累加重试次数 if (currentItemCount == previousItemCount) { noNewItemRetry++; Thread.sleep(800); continue; } // 检测到新元素,重置重试计数 noNewItemRetry = 0; previousItemCount = currentItemCount; // 滚动到当前列表的最后一个元素 WebElement lastItem = currentItems.get(currentItemCount - 1); ((JavascriptExecutor) driver) .executeScript("arguments[0].scrollIntoView({block: 'end', behavior: 'smooth'});", lastItem); // 等待新元素加载完成,可根据页面响应速度调整 Thread.sleep(1000); } // 循环结束后即可获取全量列表元素 List<WebElement> allLoadedItems = driver.findElements(By.cssSelector(listItemSelector));
备选滚动方案
如果scrollIntoView不生效,可以直接操作滚动容器的滚动高度,替换上面的滚动逻辑即可:
((JavascriptExecutor) driver) .executeScript("arguments[0].scrollTop = arguments[0].scrollHeight;", modalScrollContainer);
内容的提问来源于stack exchange,提问作者Abdurehman Siddiqui
相关产品推荐
相关产品推荐

