Selenium翻页到末页时initNextPageButton返回false,如何修正该方法逻辑?
问题原因
现有代码的核心问题有两个:
- 点击下一页按钮后没有等待页面加载完成,就直接执行新页面内容采集、下一页按钮检测逻辑,可能会因为页面未渲染完成提前捕获到
NoSuchElementException,误判为已经到最后一页 collectResults方法当前是无返回值类型,你需要调整返回值类型,在全量采集完成后返回true
修复后的代码
// 按需引入对应依赖包 import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public List<String> collectResultsFromPage() { WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='_8v6CF']"))); List<WebElement> resultsNameWebElement = driver.findElements(By.xpath("//article//h3[@data-zone-name = 'title']//span")); return resultsNameWebElement.stream() .map(WebElement::getText) .collect(Collectors.toList()); } private boolean initNextPageButton() { try { WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3)); goNextPageButton = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(@class, '_3OFYT')]"))); return true; } catch (TimeoutException | NoSuchElementException e) { return false; } } // 调整返回值类型为boolean public boolean collectResults() { findResults = collectResultsFromPage(); while (initNextPageButton()) { goNextPageButton.click(); // 等待旧按钮失效,确认页面完成跳转再采集内容 new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.stalenessOf(goNextPageButton)); findResults.addAll(collectResultsFromPage()); } // 全量采集完成后返回true return true; }
补充说明
- 上述
Duration类型的入参适配Selenium 4+版本,如果使用旧版本Selenium,直接替换为毫秒数格式的整数入参即可 - 新增的超时异常捕获、旧按钮过期判断逻辑,可以避免页面加载慢导致的误判无下一页、重复采集上一页内容的问题
- 如果不需要方法返回状态,仅需要确认逻辑执行完成,也可以在循环结束位置增加自定义日志标记即可。
内容的提问来源于stack exchange,提问作者Otto Rahn
相关产品推荐
相关产品推荐

