Selenium Java+TestNG启动Chrome报NoSuchMethodError,加Guava依赖无效求助
编写了如下Selenium测试方法,使用TestNG运行时无法启动Chrome浏览器,报错java.lang.NoSuchMethodError: 'java.util.stream.Collector com.google.common.collect.ImmutableList.toImmutableList()'。已在pom.xml中添加Guava 31.1-jre依赖,但问题仍未解决。
测试代码
@Test public void test1() { WebDriverManager.chromedriver().setup(); WebDriver driver = new ChromeDriver(); driver.get("https://www.google.com/"); driver.findElement(By.name("q")).sendKeys("Automation", Keys.ENTER); driver.quit(); }
pom.xml依赖配置
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency>
错误堆栈
java.lang.NoSuchMethodError: 'java.util.stream.Collector com.google.common.collect.ImmutableList.toImmutableList()' at org.openqa.selenium.remote.CapabilitiesUtils.makeW3CSafe(CapabilitiesUtils.java:98) at org.openqa.selenium.remote.CapabilitiesUtils.makeW3CSafe(CapabilitiesUtils.java:70) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271) at java.base/java.util.Collections$2.tryAdvance(Collections.java:4747) at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4755) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at org.openqa.selenium.remote.DriverCommand.NEW_SESSION(DriverCommand.java:65) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:230) at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:151) at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:108) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:104) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:91) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:46) at com.qa.tests.LoginPageTests.test1(LoginPageTests.java:20) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132) at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:599) at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174) at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46) at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822) at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.testng.TestRunner.privateRun(TestRunner.java:764) at org.testng.TestRunner.run(TestRunner.java:585) at org.testng.SuiteRunner.runTest(SuiteRunner.java:384) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337) at org.testng.SuiteRunner.run(SuiteRunner.java:286) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218) at org.testng.TestNG.runSuitesLocally(TestNG.java:1140) at org.testng.TestNG.runSuites(TestNG.java:1069) at org.testng.TestNG.run(TestNG.java:1037) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
解决方法
这个错误是Guava依赖版本冲突导致的——你手动添加的Guava 31.1-jre没有被优先加载,项目实际使用的是其他依赖(比如Selenium、TestNG或者WebDriverManager)引入的低版本Guava,而ImmutableList.toImmutableList()方法是在Guava 21.0及以上版本才有的。
按以下步骤排查解决:
查看依赖树,定位冲突版本
执行Maven命令查看项目依赖树,找出哪个依赖引入了低版本Guava:mvn dependency:tree | findstr "guava"(Linux/macOS系统用
grep替代findstr)强制指定Guava版本
在pom.xml中添加<dependencyManagement>节点,强制所有依赖使用你指定的Guava版本:<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency> </dependencies> </dependencyManagement>这样Maven会优先使用这个版本,覆盖其他依赖引入的低版本。
排除冲突的低版本Guava
如果你不想用dependencyManagement,也可以在引入冲突依赖时直接排除低版本Guava。比如如果是Selenium引入的,就在Selenium依赖里加排除:<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>你的Selenium版本</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>清理并重新构建项目
执行Maven命令清理缓存,重新下载依赖:mvn clean install -U
内容的提问来源于stack exchange,提问作者user8971

