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

Selenium切换第二个子窗口报java.util.NoSuchElementException如何解决

错误根因
  • 你获取窗口句柄迭代器it的时机是点击第一个链接(LinkedIn)之后,此时allwindows集合仅包含父窗口、LinkedIn子窗口两个句柄,该迭代器最多只能执行2次next()操作,遍历完两个元素后就已指向末尾
  • 点击第二个链接(Facebook)打开新子窗口后,没有重新获取最新的窗口句柄集合,直接复用已耗尽的旧迭代器调用next(),因此抛出NoSuchElementException异常
修复代码

你只需要在点击第二个链接后重新获取最新的窗口句柄集合和迭代器即可,修改后代码如下:

WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://opensource-demo.orangehrmlive.com/");

By linkedln = By.xpath("//img[@alt='LinkedIn OrangeHRM group']");
By facebook = By.xpath("//img[@alt='OrangeHRM on Facebook']");

// 处理第一个子窗口:LinkedIn
driver.findElement(linkedln).click();
Set<String> allwindows = driver.getWindowHandles();
Iterator<String> it = allwindows.iterator();
String parent_window = it.next();
String child_window1 = it.next();

driver.switchTo().window(child_window1);
Thread.sleep(5000);
System.out.println("child window1 title is " + driver.getTitle());
driver.close();

// 切回父窗口
driver.switchTo().window(parent_window);

// 处理第二个子窗口:Facebook
driver.findElement(facebook).click();
// 核心修改:重新获取最新的窗口句柄集合和迭代器
allwindows = driver.getWindowHandles();
it = allwindows.iterator();
// 跳过父窗口句柄,取第二个元素即为新开的Facebook子窗口
it.next();
String child_window2 = it.next();

driver.switchTo().window(child_window2);
Thread.sleep(5000);
System.out.println("child window2 title is " + driver.getTitle());
driver.close();

// 切回父窗口
driver.switchTo().window(parent_window);

driver.quit();
其他优化建议
  • 实际生产环境建议用显式等待替代Thread.sleep(),避免固定等待时间不够或过长的问题
  • 可以将窗口句柄集合转为List类型,通过索引直接获取对应窗口,逻辑更直观,不需要多次调用迭代器的next()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:54:03