You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium遍历打开网站列表失败,触发NoSuchElementException异常

问题分析

你遇到的NoSuchElementException本质原因是:调用driver.navigate().back()回到原页面后,页面DOM会重新渲染,初始页面获取的元素引用已失效;同时循环中直接通过XPath索引定位元素时,可能页面还未完全加载完成,导致元素无法被找到。

解决方案

有两种可靠的解决思路:

思路1:提前收集所有链接地址,直接遍历访问

一次性获取所有链接的href属性值,循环访问每个链接,无需返回原页面,彻底规避DOM重新加载的问题。

修改后的代码:

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.List;
import java.util.ArrayList;

public class demo {
    public static void main(String[] args) throws InterruptedException {
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriver();
        driver.get("https://omayo.blogspot.com/");
        driver.manage().window().maximize();
        
        // 提前收集所有链接的href地址
        List<WebElement> linkElements = driver.findElements(By.xpath("//*[@id=\"LinkList1\"]/div/ul/li/a"));
        List<String> linkUrls = new ArrayList<>();
        for (WebElement element : linkElements) {
            linkUrls.add(element.getAttribute("href"));
        }
        
        // 遍历访问每个链接
        for (String url : linkUrls) {
            driver.get(url);
            Thread.sleep(1000); // 可选:等待页面加载,建议替换为显式等待
        }
        
        driver.quit();
    }
}

思路2:返回原页面后重新获取元素列表并等待加载

如果必须保留返回原页面的逻辑,每次返回后需重新查找元素列表,并使用显式等待确保元素加载完成,避免因页面未加载完全导致的定位失败。

修改后的代码(使用显式等待):

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;

import java.time.Duration;
import java.util.List;

public class demo {
    public static void main(String[] args) throws InterruptedException {
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriver();
        driver.get("https://omayo.blogspot.com/");
        driver.manage().window().maximize();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        
        // 先获取初始链接数量
        int no_of_link = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//*[@id=\"LinkList1\"]/div/ul/li"))).size();
        
        for (int i = 1; i <= no_of_link; i++) {
            // 每次循环都重新等待元素加载完成后再定位
            WebElement link = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"LinkList1\"]/div/ul/li[" + i + "]/a")));
            link.click();
            Thread.sleep(1000); // 可选等待,建议替换为显式等待页面加载完成
            driver.navigate().back();
            // 返回后等待原页面的链接列表重新加载完成
            wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//*[@id=\"LinkList1\"]/div/ul/li")));
        }
        
        driver.quit();
    }
}
关键注意点
  • 避免复用页面刷新/跳转前的元素引用:Selenium的元素引用绑定当前DOM,页面刷新或跳转后旧引用会失效。
  • 优先使用显式等待而非Thread.sleep():显式等待会根据元素状态动态等待,比固定时长休眠更可靠,也能提升执行效率。

内容的提问来源于stack exchange,提问作者Prabhakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:35:01