Selenium翻页循环判断下页XPath是否显示 元素不存在报错如何解决?
问题原因
Selenium 中的 isDisplayed() 方法仅适用于已成功定位到DOM中的元素,若元素本身不存在于DOM树中,调用该方法会直接抛出NoSuchElementException异常,而非返回false,因此原代码的循环判断条件本身就会在最后一页直接报错,无法正常终止循环。
如果你的try catch仅包裹了循环内部的点击逻辑,没有覆盖循环判断条件的元素查找逻辑,判断条件抛出的异常不会被捕获,自然会直接报错终止程序。
修正方案
改用findElements()方法查找下一页按钮,该方法找不到元素时会返回空列表,不会抛出异常,先通过列表长度判断元素是否存在,存在时再判断是否可见,再执行翻页逻辑。
修正后代码如下:
List<WebElement> rows = new ArrayList<>(); // 先添加第一页的数据 rows.addAll(driver.findElements(By.xpath("//*[@class='sortable-row']"))); while (true) { // 查找下一页按钮,findElements找不到元素时返回空列表不会抛异常 List<WebElement> nextPageBtns = driver.findElements(By.xpath("替换为你的下一页按钮XPath")); // 元素不存在,或者元素存在但不可见,都终止循环 if (nextPageBtns.isEmpty() || !nextPageBtns.get(0).isDisplayed()) { break; } // 下一页按钮存在且可点击,执行翻页 nextPageBtns.get(0).click(); Thread.sleep(3000); rows.addAll(driver.findElements(By.xpath("//*[@class='sortable-row']"))); }
可选优化
可以将固定等待Thread.sleep(3000)替换为Selenium的显式等待,等待页面列表更新后再继续执行,避免网络波动导致的元素未加载完成报错:
// 点击下一页后等待旧列表元素失效,确认新列表加载完成 new WebDriverWait(driver, Duration.ofSeconds(5)) .until(ExpectedConditions.stalenessOf(rows.get(rows.size() - 1)));
内容的提问来源于stack exchange,提问作者Abdurehman Siddiqui
相关产品推荐
相关产品推荐

