执行Appium框架时抛出java.lang.NoSuchMethodError问题求助
上周(昨日)Appium测试框架运行完全正常,代码未做修改,Eclipse也未更新,但今日运行测试时抛出如下错误:
java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.(java.net.URI, java.time.Duration, java.time.Duration, org.openqa.selenium.remote.http.Filter, java.net.Proxy, org.openqa.selenium.Credentials)' at io.appium.java_client.AppiumClientConfig.(AppiumClientConfig.java:62) at io.appium.java_client.AppiumClientConfig.defaultConfig(AppiumClientConfig.java:79) at io.appium.java_client.remote.AppiumCommandExecutor.(AppiumCommandExecutor.java:109) at io.appium.java_client.AppiumDriver.(AppiumDriver.java:92) at io.appium.java_client.android.AndroidDriver.(AndroidDriver.java:117) at common.BaseConfigs.getDriver(BaseConfigs.java:38) at com.netflix.XXXTests.setUp(XXXTests.java:93) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:62) at org.testng.internal.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:385) at org.testng.internal.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:321) at org.testng.TestRunner.invokeTestConfigurations(TestRunner.java:637) at org.testng.TestRunner.beforeRun(TestRunner.java:627) at org.testng.TestRunner.run(TestRunner.java:589) at org.testng.SuiteRunner.runTest(SuiteRunner.java:377) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332) at org.testng.SuiteRunner.run(SuiteRunner.java:276) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212) at org.testng.TestNG.runSuitesLocally(TestNG.java:1134) at org.testng.TestNG.runSuites(TestNG.java:1063) at org.testng.TestNG.run(TestNG.java:1031) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
getDriver方法代码如下:
public static AndroidDriver getDriver() throws IOException{ //read data from data.properties file to get device name, app package name and app activity name Properties prop = new Properties(); FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + "\\src\\resources\\data.properties"); prop.load(fis); String deviceName = prop.getProperty("deviceName"); String appPackage = prop.getProperty("appPackage"); String appActivity = prop.getProperty("appActivity"); UiAutomator2Options options = new UiAutomator2Options(); options.setDeviceName(deviceName); options.setAutomationName("uiautomator2"); options.setAppPackage(appPackage); options.setAppActivity(appActivity); options.setPlatformName("Android"); options.disableWindowAnimation(); options.setNewCommandTimeout(Duration.ofSeconds(180)); AndroidDriver driver = null; try { driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), options); } catch (Exception e) { System.err.println("Appium session could not be started. Please check if Appium server is running."); e.printStackTrace(); } return driver; }
已尝试的操作:
- 在pom.xml中配置最新的Appium和Selenium版本
- 尝试不同的Appium与Selenium版本组合
- 更新OpenJDK至jdk-21并修改环境变量
- 在Eclipse中设置JRE系统库执行环境为JavaSE-18(jdk-10-0.1.1)
- 将Eclipse更新至2023-09(4.29.0)
目前陷入困境,请问下一步该如何处理?删除整个.m2目录重新下载依赖是否有效?
这个错误核心是依赖版本冲突:Appium Java Client依赖的Selenium版本与项目实际加载的Selenium版本不匹配,导致找不到指定的ClientConfig构造方法。针对问题给出以下步骤:
清理Maven仓库并重新拉取依赖
删除本地Maven仓库(默认路径为用户目录下的.m2/repository),执行mvn clean install -U强制更新依赖。这个操作能解决依赖缓存损坏、版本混乱的问题,是你提到的方案的核心,大概率有效。排查依赖树,解决隐式版本冲突
执行mvn dependency:tree命令,搜索org.seleniumhq.selenium相关依赖,检查是否有间接引入的低版本Selenium。如果存在,在对应的依赖中添加<exclusions>排除旧版Selenium,确保项目中只有一个统一版本的Selenium依赖。统一JDK版本
你当前混用了JDK 21和JavaSE-18执行环境,版本混乱可能导致类加载异常。建议统一使用JDK 11或17(这两个LTS版本与Appium、Selenium的兼容性最佳),在Eclipse中设置JRE系统库为对应版本的JDK。匹配Appium Server与Java Client版本
确保本地Appium Server版本和Java Client版本兼容:比如Appium Server 2.x需搭配Appium Java Client 8.x,避免旧版Server搭配新版Client的情况。清理Eclipse缓存并同步依赖
在Eclipse中执行Project -> Clean,右键项目选择Maven -> Update Project,勾选Force Update of Snapshots/Releases,强制同步依赖配置。
内容的提问来源于stack exchange,提问作者Kamil

