Edge 106-108及最新版本调用driver.switchTo().alert()报空指针异常求助
问题描述
使用Selenium 3.4.0开展自动化测试时,仅在Edge浏览器106、107、108及最新版本中,调用driver.switchTo().alert()会间歇性抛出NullPointerException,其余浏览器无此问题。
异常堆栈信息:
java.lang.NullPointerException at org.openqa.selenium.remote.RemoteWebDriver.getWindowHandle(RemoteWebDriver.java:554)
at org.openqa.selenium.edge.EdgeDriver$$EnhancerByCGLIB$$2174fa6c.CGLIB$getWindowHandle$63()
at org.openqa.selenium.edge.EdgeDriver$$EnhancerByCGLIB$$2174fa6c$$FastClassByCGLIB$$d8f722da.invoke()
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at ***************************************
at org.openqa.selenium.edge.EdgeDriver$$EnhancerByCGLIB$$2174fa6c.getWindowHandle()
该问题自Edge 106版本发布后出现。
原因分析与解决办法
1. 版本兼容性断层
Selenium 3.4.0发布于2017年,与Edge 106+版本存在严重的适配差异。Edge浏览器更新后,EdgeDriver的接口逻辑发生改变,旧版Selenium无法正确处理新浏览器的状态回调,导致获取窗口句柄时出现空指针。
- 解决:升级Selenium至3.141.59(Selenium 3系列最终稳定版),或直接迁移到Selenium 4.x版本;同时确保EdgeDriver版本与当前Edge浏览器版本完全匹配。
2. alert弹出时机未同步
间歇性异常多与元素加载时机有关,可能alert尚未完全渲染完成就执行了切换操作,导致底层获取窗口句柄时返回空值。
- 解决:添加显式等待,确保alert出现后再执行切换逻辑:
WebDriverWait wait = new WebDriverWait(driver, 10); Alert alert = wait.until(ExpectedConditions.alertIsPresent()); alert.accept(); // 按需替换为dismiss()或其他操作
3. CGLIB代理类状态异常
堆栈信息显示异常来自CGLIB增强的EdgeDriver类,旧版Selenium对EdgeDriver的代理逻辑在新浏览器环境下可能出现状态不一致。
- 解决:若自定义了Driver代理逻辑,直接使用原生EdgeDriver实例,避免代理类的干扰;或检查代理配置中是否存在状态未同步的问题。
4. 浏览器安全设置干扰
Edge的部分隐私/安全设置可能阻止alert正常弹出,或导致浏览器内部状态异常。
- 解决:初始化EdgeDriver时添加配置,禁用相关安全限制:
EdgeOptions options = new EdgeOptions(); options.addArguments("--disable-web-security"); options.addArguments("--allow-running-insecure-content"); EdgeDriver driver = new EdgeDriver(options);
内容的提问来源于stack exchange,提问作者Durgesh patidar

