如何用Java测试Electron 23.1.1应用?解决窗口已关闭异常
解决Electron 23.1.1 + Selenium Java启动应用时的NoSuchWindowException错误
问题概况
使用Electron 23.1.1版本(对应Chromium 110.0.5481.104),已下载匹配版本的ChromeDriver,通过Java结合Selenium编写测试代码启动应用后,控制台抛出org.openqa.selenium.NoSuchWindowException: no such window: target window already closed错误,需在不切换到JavaScript的前提下解决该问题。
可能原因
- Electron应用启动时初始窗口未完全加载,Selenium就尝试执行操作
- ChromeDriver启动参数配置不当,无法正确附着到Electron窗口
- Electron应用启动后存在窗口关闭/切换行为,Selenium未及时跟踪到有效窗口句柄
解决方案
1. 等待窗口句柄稳定后再操作
启动应用后,先等待窗口句柄列表非空且稳定,再切换到目标窗口:
// 初始化等待器,设置10秒超时 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 等待窗口句柄数量大于0 wait.until(driver -> !driver.getWindowHandles().isEmpty()); // 切换到第一个可用窗口 Set<String> windowHandles = driver.getWindowHandles(); driver.switchTo().window(windowHandles.iterator().next());
2. 优化ChromeDriver启动参数
确保参数正确指向Electron应用,并添加适配Electron的配置:
ChromeOptions options = new ChromeOptions(); // 替换为你的Electron应用可执行文件路径 options.setBinary("/path/to/your/electron/application"); // 添加必要参数避免沙箱和资源限制问题 options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); // 开启远程调试端口,帮助ChromeDriver连接Electron options.addArguments("--remote-debugging-port=9222"); // 初始化驱动 ChromeDriver driver = new ChromeDriver(options);
3. 添加异常重试机制
当遇到窗口不存在异常时,重新获取句柄并切换,重试几次:
int retryTimes = 3; while (retryTimes > 0) { try { // 执行你的测试操作,例如查找元素 driver.findElement(By.id("target-element-id")); break; } catch (NoSuchWindowException e) { retryTimes--; Set<String> currentHandles = driver.getWindowHandles(); if (!currentHandles.isEmpty()) { driver.switchTo().window(currentHandles.iterator().next()); } Thread.sleep(1000); // 等待1秒后重试 } }
4. 检查Electron应用启动逻辑
确认Electron主进程没有提前退出或立即关闭初始窗口的逻辑,若存在启动闪屏(splash screen),需等待闪屏关闭后主窗口加载完成再执行测试操作。
测试代码
import org.junit.After; // ... 完整代码保持原样
控制台日志
log4j:WARN No appenders could be found... // ... 完整日志保持原样
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

