Selenium 3.141.59下FirefoxOptions.merge抛NoSuchMethodError如何排查
问题根因判定
- 不兼容的Guava版本通常不会直接引发该
NoSuchMethodError异常。该异常的本质是运行时加载的org.openqa.selenium.firefox.FirefoxOptions类不存在签名为merge(Lorg/openqa/selenium/Capabilities;)Lorg/openqa/selenium/firefox/FirefoxOptions的方法,90%以上的场景是运行时存在低于3.7.0版本的Selenium核心组件,类加载器优先加载了低版本的FirefoxOptions类导致。仅在Guava冲突引发Selenium类初始化失败的极端场景下才会间接导致该问题,排查优先级低于Selenium自身版本冲突。
排查步骤
1. 确认运行时实际加载的类来源
在报错代码前加入以下代码,输出类对应的jar包路径,确认是否为3.141.59版本的Selenium包:
// 输出FirefoxOptions类的实际来源 System.out.println(FirefoxOptions.class.getProtectionDomain().getCodeSource().getLocation()); // 输出Guava核心类的实际来源,排查Guava冲突 System.out.println(com.google.common.base.Joiner.class.getProtectionDomain().getCodeSource().getLocation());
如果输出的Selenium包版本低于3.7.0,即可确认是运行时Selenium版本冲突导致。
2. 全量排查Maven依赖冲突
不要仅依赖Eclipse的依赖层级视图,执行以下Maven命令输出所有Selenium相关依赖,排查是否有传递依赖引入的低版本Selenium组件:
mvn dependency:tree -Dverbose -Dincludes=org.seleniumhq.selenium:*
如果发现低版本的selenium-api、selenium-firefox-driver等组件,在对应依赖的声明中加入<exclusion>标签排除低版本Selenium组件即可。
如果需要排查Guava冲突,执行以下命令:
mvn dependency:tree -Dverbose -Dincludes=com.google.guava:guava
如果存在低于25.0-jre的Guava版本,可在pom.xml中显式声明固定Guava版本:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>25.0-jre</version> </dependency>
3. 临时规避方案
可以直接弃用DesiredCapabilities + merge的写法,直接将代理配置写入FirefoxOptions,绕开merge方法的问题:
FirefoxOptions firefoxOptions = new FirefoxOptions(); firefoxOptions.addPreference("dom.popup_maximum", 100); firefoxOptions.addPreference("dom.webnotifications.enabled", false); firefoxOptions.addPreference("media.peerconnection.enabled", false); // 直接设置代理,无需通过DesiredCapabilities Proxy proxy = new Proxy(); // ... 代理配置逻辑 firefoxOptions.setCapability(CapabilityType.PROXY, proxy);
4. 打包运行场景排查
如果是打包后在服务器运行报错,解压打包好的jar/war包,检查WEB-INF/lib目录下是否存在多个版本的Selenium相关jar包或Guava包,删除低版本包即可。
内容的提问来源于stack exchange,提问作者Bradford Griggs
相关产品推荐
相关产品推荐

