如何获取页面底部元素?Selenium+C#无法抓取全部元素求助
问题分析
该网站采用滚动懒加载机制:初始仅渲染前51个报纸元素,剩余元素需要滚动到视图范围内才会被动态加载到DOM中。你一开始就调用FindElements获取所有元素,此时后续元素还未被渲染,因此只能拿到前51个数据。
解决方案
以下两种方案可以解决动态加载元素的获取问题:
方案一:循环滚动+动态更新元素集合
通过反复滚动页面触发懒加载,每次滚动后重新获取已加载的元素,避免初始集合不完整的问题:
IWebDriver driver; new WebDriverManager.DriverManager().SetUpDriver(new ChromeConfig()); driver = new ChromeDriver(); driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5); driver.Manage().Window.Maximize(); driver.Url = "https://www.allbanglanewspaper.xyz/"; int targetCount = 150; List<string> newspaperNames = new List<string>(); IJavaScriptExecutor js = (IJavaScriptExecutor)driver; while (newspaperNames.Count < targetCount) { // 获取当前页面所有已加载的目标元素 var elements = driver.FindElements(By.ClassName("allbanglanewspaperslogo")); // 遍历新增元素(避免重复输出) for (int i = newspaperNames.Count; i < elements.Count; i++) { string name = elements[i].FindElement(By.ClassName("banglanewspaperlistname")).Text; newspaperNames.Add(name); Console.WriteLine(name); if (newspaperNames.Count >= targetCount) break; } // 判断是否还有新元素加载,没有则提前退出 if (elements.Count == newspaperNames.Count) { Console.WriteLine("已加载全部可用元素"); break; } // 滚动到页面底部触发懒加载 js.ExecuteScript("window.scrollTo(0, document.body.scrollHeight);"); // 等待新元素加载(建议替换为显式等待,更稳定) Thread.Sleep(1000); } driver.Quit();
方案二:滚动到目标元素位置再获取文本
逐个定位元素,滚动到元素可见位置确保其加载完成,适合需要精细控制元素加载的场景:
IWebDriver driver; new WebDriverManager.DriverManager().SetUpDriver(new ChromeConfig()); driver = new ChromeDriver(); driver.Manage().Window.Maximize(); driver.Url = "https://www.allbanglanewspaper.xyz/"; IJavaScriptExecutor js = (IJavaScriptExecutor)driver; WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); for (int i = 0; i < 150; i++) { try { // 等待第i个元素加载完成 IWebElement parentElement = wait.Until(d => d.FindElements(By.ClassName("allbanglanewspaperslogo"))[i]); // 滚动到元素可见位置 js.ExecuteScript("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", parentElement); // 等待文本元素加载并获取内容 string name = wait.Until(d => parentElement.FindElement(By.ClassName("banglanewspaperlistname")).Text); Console.WriteLine(name); } catch (NoSuchElementException) { Console.WriteLine("已无更多元素,提前退出"); break; } catch (WebDriverTimeoutException) { Console.WriteLine($"第{i+1}个元素加载超时,跳过"); continue; } } driver.Quit();
注意事项
- 优先使用显式等待替代
Thread.Sleep:可以通过等待元素数量增加、或等待特定元素出现来实现,避免固定等待时间的不确定性。 - 部分网站的懒加载触发条件可能是滚动到页面底部附近而非完全底部,可根据实际情况调整滚动脚本的参数。
内容的提问来源于stack exchange,提问作者Funny Boss
相关产品推荐
相关产品推荐

