引入sikulixapi依赖后ChromeDriver实例化失败报错排查
- Chrome版本:102.0.5005.115
- ChromeDriver版本:102.0.5005.61(32位)
- 项目框架:Serenity BDD + Selenium 4.0.0 + Cucumber
在pom.xml中新增com.sikulix:sikulixapi:2.0.5依赖后,执行步骤定义文件login类中open()方法时抛出net.thucydides.core.webdriver.DriverConfigurationError异常,提示无法实例化org.openqa.selenium.chrome.ChromeDriver类型的WebDriver实例、无法启动新会话;移除sikulixapi依赖后代码可正常运行。
错误栈根因:抛出java.lang.ClassNotFoundException: io.netty.handler.codec.compression.Brotli,导致NettyHttpHandler请求执行失败,最终Chrome会话创建失败。
Selenium 4.0.0内置依赖的Netty版本为4.1.60+,该版本已内置Brotli压缩编解码器实现类io.netty.handler.codec.compression.Brotli,ChromeDriver与Chrome浏览器建立通信会话时,会通过Netty HTTP客户端调用该类完成数据压缩处理。
引入sikulixapi:2.0.5时,Maven依赖传递机制会拉取该依赖自带的低版本Netty(版本低于4.1.60.Final)。如果Maven依赖仲裁优先加载了sikulixapi传递的低版本Netty,会直接覆盖Selenium引入的符合版本要求的Netty包,运行时找不到Brotli对应类,直接导致Chrome会话创建失败,外层抛出Serenity封装的驱动配置错误异常。
- 排除sikulixapi传递的Netty依赖:引入sikulixapi时直接排除所有io.netty组下的传递依赖,强制项目全局使用Selenium自带的匹配版本Netty,配置示例如下:
<dependency> <groupId>com.sikulix</groupId> <artifactId>sikulixapi</artifactId> <version>2.0.5</version> <exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
- 显式声明Netty版本:在pom.xml中直接声明版本不低于4.1.60.Final的Netty全量依赖(推荐版本和Selenium 4.0.0内置的Netty版本完全一致,可通过
mvn dependency:tree命令查看Selenium依赖的Netty具体版本),通过Maven依赖仲裁的就近原则,强制全局使用指定版本的Netty,避免版本覆盖。 - 升级sikulixapi版本:如果排除Netty依赖后sikulixapi运行异常,可升级sikulixapi到更高迭代版本,新版本已调整Netty依赖的作用域,不会出现传递低版本Netty覆盖Selenium依赖的问题。
配置修改完成后,先执行
mvn clean compile刷新依赖,再执行mvn dependency:tree | grep netty校验项目实际引入的Netty版本,确认无低版本Netty残留后重新执行用例即可。
内容的提问来源于stack exchange,提问作者Learner

