如何使用Selenium Java点击下一页按钮抓取所有页面的公司名称
Selenium 全分页抓取公司名称逻辑完善方案
你现有代码的核心问题是仅能抓取第一页数据,点击下一页后没有循环执行后续页面的抓取逻辑,同时缺少页面加载等待、异常兼容处理,运行时容易出现各类元素定位报错。
以下是完善后的可运行代码:
@Test(priority=2) public void fetchdata() { // 建议把抓取到的公司名统一存储,方便后续处理 java.util.List<String> allCompanyNames = new java.util.ArrayList<>(); // 显式等待实例,全局通用,超时时间可根据页面加载速度调整 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); while(true) { // 等待当前页公司名元素加载完成,建议替换为带类名/属性的相对路径XPath,稳定性更高 By companyLocator = By.xpath("/html/body/div[3]/div[2]/div/div/div/div[1]/div[1]/h3/a/div"); wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(companyLocator)); java.util.List<WebElement> companyNameList = driver.findElements(companyLocator); // 遍历提取公司名 for (WebElement company : companyNameList) { String name = company.getText().trim(); System.out.println(name); allCompanyNames.add(name); } // 判断是否存在可点击的下一页按钮 try { WebElement nextBtn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Next']"))); // 点击下一页前先记录当前页的任意一个元素,用于判断页面是否跳转完成 WebElement pageFlag = companyNameList.get(0); nextBtn.click(); // 等待旧页面元素失效,确认页面已经跳转到下一页 wait.until(ExpectedConditions.stalenessOf(pageFlag)); } catch (TimeoutException | NoSuchElementException e) { // 下一页按钮不存在/不可点击,说明已经到最后一页,终止循环 break; } } // 所有页面抓取完成后可以在这里统一处理收集到的allCompanyNames System.out.println("共抓取到公司数量:" + allCompanyNames.size()); }
核心优化说明
- 新增
while循环持续执行「抓取当前页数据→判断下一页状态→跳转下一页」的流程,直到没有可点击的下一页按钮时自动终止,实现全量分页数据抓取 - 加入显式等待逻辑,覆盖元素加载、下一页可点击、页面跳转完成三个核心等待节点,完全避免页面未加载完成导致的各类元素异常
- 建议将原有的绝对路径XPath替换为带类名、属性的相对路径XPath,页面结构小幅度变动时不会定位失败
- 增加异常捕获兼容逻辑,到最后一页没有下一页按钮时会自动结束抓取,不会抛出异常中断用例
- 新增统一存储容器保存所有抓取到的公司名称,方便后续的导出、校验等操作
内容的提问来源于stack exchange,提问作者shona
相关产品推荐
相关产品推荐

