Android Java项目Appium测试遇NoClassDefFoundError问题求助
解决Android Appium自动化测试中java.net.http.HttpClassNotFoundError问题
问题简述
按照《Automation Testing with Appium》指南配置后,已完成:
- 基于Java的Android项目搭建
- 引入Appium框架及TestNG、Espresso、UiAutomator2测试依赖
- 启动Appium Server并编写测试用例
运行测试时出现错误:
NoClassDefFoundError: Failed resolution of: Ljava/net/http/HttpClient
测试代码
package ex.jvautotest; import android.util.Log; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.openqa.selenium.By; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.remote.options.BaseOptions; public class FirstTest { static AndroidDriver driver; @BeforeClass public static void setUp() throws MalformedURLException { Log.d("", "SETUP ..."); var options = new BaseOptions() .amend("appium:automationName", "UiAutomator2") .amend("appium:deviceName", "emulator-5554") .amend("appium:platformName", "Android") .amend("appium:app", "/Users/.../Desktop/app-debug.apk") .amend("appium:newCommandTimeout", 3600) .amend("appium:connectHardwareKeyboard", true); /// ERROR IN THIS LINE driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), options); Log.d("", "SETUP SUCCESS"); } @Test public void sampleTest() throws Exception { try { Duration d = Duration.ofSeconds(10); // 1 - get Email, then input text // By usernameId = By.id("com.example.autotestsample:id/username"); By usernameId = By.xpath( "//android.widget.EditText[@resource-id=\"com.example.autotestsample:id/username\"]"); driver.findElement(usernameId).sendKeys("user@email.com"); } catch (Exception e) { Log.d("", "Login failed"); throw e; } } @AfterClass public static void tearDown() { driver.quit(); } }
build.gradle配置
plugins { alias(libs.plugins.android.application) } android { namespace = "ex.jvautotest" compileSdk = 35 defaultConfig { applicationId = "ex.jvautotest" minSdk = 33 targetSdk = 35 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } packaging { resources { excludes.add("META-INF/LICENSE.md") excludes.add("META-INF/LICENSE-notice.md") excludes.add("META-INF/INDEX.LIST") excludes.add("META-INF/io.netty.versions.properties") excludes.add("META-INF/DEPENDENCIES") } } } dependencies { // implementation("org.openjdk:java.net:21") implementation(libs.appcompat) implementation(libs.material) implementation(libs.activity) implementation(libs.constraintlayout) implementation(libs.androidx.room.rxjava2) implementation(libs.androidx.room.rxjava3) implementation(libs.androidx.room.guava) testImplementation(libs.androidx.room.testing) implementation(libs.androidx.room.paging) implementation(libs.ext.appiumJavaClient) testImplementation(libs.ext.appiumJavaClient) implementation(libs.ext.appiumSeleniumClient) testImplementation(libs.ext.appiumSeleniumClient) implementation(libs.ext.appiumSeleniumHttp) testImplementation(libs.ext.appiumSeleniumHttp) testImplementation(libs.junit) androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.junit.jupiter) androidTestImplementation(libs.testng) }
libs.versions.toml配置
[versions] agp = "8.7.2" appiumJavaClient = "9.3.0" #appiumSeleniumClient = "4.26.0" junit = "4.13.2" junitVersion = "1.2.1" junitJupiter = "5.11.3" roomRuntime = "2.6.1" testng = "7.10.2" espressoCore = "3.6.1" appcompat = "1.7.0" material = "1.12.0" activity = "1.9.3" constraintlayout = "2.2.0" [libraries] androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomRuntime" } androidx-room-guava = { module = "androidx.room:room-guava", version.ref = "roomRuntime" } androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomRuntime" } androidx-room-paging = { module = "androidx.room:room-paging", version.ref = "roomRuntime" } androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" } androidx-room-rxjava2 = { module = "androidx.room:room-rxjava2", version.ref = "roomRuntime" } androidx-room-rxjava3 = { module = "androidx.room:room-rxjava3", version.ref = "roomRuntime" } androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "roomRuntime" } ext-appiumJavaClient = { group = "io.appium", name = "java-client", version.ref = "appiumJavaClient" } ext-appiumSeleniumClient = { group = "org.seleniumhq.selenium", name = "selenium-java", version.ref = "appiumSeleniumClient" } ext-appiumSeleniumHttp = { group = "org.seleniumhq.selenium", name = "selenium-http", version.ref = "appiumSeleniumClient" } junit = { group = "junit", name = "junit", version.ref = "junit" } ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junitJupiter" } testng = { group = "org.testng", name = "testng", version.ref = "testng" } espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }
解决方案
1. 明确Selenium依赖版本
Appium Java Client 9.3.0需要匹配兼容的Selenium版本,取消libs.versions.toml中appiumSeleniumClient的注释并指定版本:
appiumSeleniumClient = "4.26.0"
2. 调整依赖作用域
Appium相关依赖仅用于测试环境,无需添加到主应用的implementation配置,保留testImplementation即可:
// 移除主应用依赖配置 // implementation(libs.ext.appiumJavaClient) // implementation(libs.ext.appiumSeleniumClient) // implementation(libs.ext.appiumSeleniumHttp) // 仅保留测试依赖 testImplementation(libs.ext.appiumJavaClient) testImplementation(libs.ext.appiumSeleniumClient) testImplementation(libs.ext.appiumSeleniumHttp)
3. 验证设备API级别
java.net.http.HttpClient在Android API 33及以上版本才提供支持,确保测试使用的模拟器/实体设备系统版本≥Android 13(API 33)。
4. 强制引入HTTP客户端依赖(可选)
若上述步骤未解决问题,可直接添加HTTP客户端依赖到测试配置:
testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3")
5. 清理缓存并重新构建
执行Gradle清理命令清除缓存,再重新构建项目:
./gradlew clean build
内容的提问来源于stack exchange,提问作者Huy Tower
相关产品推荐
相关产品推荐

