升级WebDriverManager至5.2.1后getChromeDriverVersion返回空值问题
问题根因
WebDriverManager 5.x 相比 4.x 做了核心逻辑重构,存在两处不兼容变更直接导致原有代码失效:
- 4.x 版本中
WebDriverManager.chromedriver()返回全局单例对象,任意位置调用配置方法修改的是同一个实例的属性;5.x 版本该方法每次调用都会生成全新的独立管理器实例,你第一次调用setChromeDriverVersion是在第一个实例上写入配置,第二次调用getChromeDriverVersion是在无任何配置的新实例上读取,自然返回空值。 - 5.x 版本将配置拆分为全局配置、管理器实例配置两层,已经不推荐通过
config()对象操作单种驱动的版本参数,原有配置读写链路的逻辑做了调整。
适配方案
根据你的代码场景,二选一即可:
方案1:最小改动适配
持有同一个WebDriverManager实例做配置读写,不要每次链式调用都重新生成实例,同时修正Java字符串中Windows路径的转义问题:
// 初始化唯一的Chrome驱动管理器实例 WebDriverManager chromeManager = WebDriverManager.chromedriver(); // 同实例写入版本配置 chromeManager.config().setChromeDriverVersion(driverVersion); // 同实例读取配置,不会返回空 driverFile = new File(Global.WINDOWS_USER_HOME + "\\.cache\\selenium\\chromedriver\\win32\\" + chromeManager.config().getChromeDriverVersion() + "\\chromedriver.exe");
方案2:官方推荐写法(兼容性更好)
使用5.x新增的实例级API设置版本,不要硬编码拼接缓存路径,避免后续版本调整缓存结构再次失效:
WebDriverManager chromeManager = WebDriverManager.chromedriver() .driverVersion(driverVersion) // 官方指定的版本设置方法 .setup(); // 显式触发驱动校验、下载流程,5.x必须调用该方法才会完成驱动准备 // 直接获取实际使用的驱动版本,比读配置更准确 String usedDriverVersion = chromeManager.getDownloadedDriverVersion(); // 不需要自己拼路径,直接拿框架定位好的驱动文件对象,适配全系统、全版本 driverFile = new File(chromeManager.getDownloadedDriverPath());
注意:硬编码拼接缓存路径的写法在5.x多个小版本中已经出现过目录结构调整的情况,比如Chrome 115+之后驱动目录按平台分类的规则就有变动,优先调用框架提供的
getDownloadedDriverPath()方法拿路径,不需要自己维护路径拼接逻辑。
内容的提问来源于stack exchange,提问作者ashok varma
相关产品推荐
相关产品推荐

