Appium自动化测试遇IllegalArgumentException报错求助
问题描述
已完成Appium自动化测试环境的基础准备:
- 安装并运行Appium Server
- 通过
adb devices命令验证了UDID
配置Capabilities后无法连接手机,Eclipse报错:
java.lang.IllegalArgumentException: Illegal key values seen in w3c capabilities: [addActivity, addPackage, deviceName, platformVersion, udid]
同时提示无法启动新会话。使用的是adb devices返回的UDID(替换为XXX),代码目标是打开手机计算器,代码如下:
import java.net.URL; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.AppiumDriver; import io.appium.java_client.android.AndroidDriver; public class AppiumTest1 { static AppiumDriver driver; public static void main(String[] args) { try { firstProgram(); } catch (Exception exp) { System.out.println(exp.getCause()); System.out.println(exp.getMessage()); exp.printStackTrace(); } // TODO Auto-generated method stub } public static void firstProgram() throws Exception { DesiredCapabilities cap = new DesiredCapabilities(); cap.setCapability("deviceName", "Galaxy A40"); cap.setCapability("udid", "XXX"); cap.setCapability("platformName", "Android"); cap.setCapability("platformVersion", "11"); cap.setCapability("addPackage", "com.sec.android.app.popupcalculator"); cap.setCapability("addActivity", "com.sec.android.app.popupcalculator.Calculator"); URL url = new URL("http://127.0.0.1:4723/wd/hub"); driver = new AppiumDriver(url, cap); System.out.println("Test"); } }
请问:该问题的原因是什么?代码中是否存在错误?还有哪些配置环节需要检查?
问题分析与解决
问题原因
报错核心是W3C标准兼容性问题。新版本Appium默认启用W3C协议,代码中使用的部分Capabilities键名不符合W3C规范,同时存在键名拼写错误,导致Appium无法识别参数,进而无法创建会话。
代码中的错误
- 键名拼写错误:
addPackage、addActivity是拼写错误,正确键名为appPackage和appActivity。 - W3C规范不兼容:
deviceName、platformVersion、udid这些旧版键名在W3C协议下需要添加appium:前缀,否则会被判定为非法键值。 - Driver初始化不当:目标是Android设备,应使用
AndroidDriver而非通用AppiumDriver,适配性更好。
修正后的代码:
import java.net.URL; import org.openqa.selenium.remote.DesiredCapabilities; import io.appium.java_client.android.AndroidDriver; public class AppiumTest1 { static AndroidDriver driver; public static void main(String[] args) { try { firstProgram(); } catch (Exception exp) { System.out.println(exp.getCause()); System.out.println(exp.getMessage()); exp.printStackTrace(); } } public static void firstProgram() throws Exception { DesiredCapabilities cap = new DesiredCapabilities(); // 适配W3C的设备参数 cap.setCapability("appium:deviceName", "Galaxy A40"); cap.setCapability("appium:udid", "XXX"); cap.setCapability("platformName", "Android"); cap.setCapability("appium:platformVersion", "11"); // 修正应用参数拼写 cap.setCapability("appium:appPackage", "com.sec.android.app.popupcalculator"); cap.setCapability("appium:appActivity", "com.sec.android.app.popupcalculator.Calculator"); URL url = new URL("http://127.0.0.1:4723/wd/hub"); driver = new AndroidDriver(url, cap); System.out.println("计算器已启动"); } }
需要检查的配置环节
- 版本匹配:确保Appium Server与Java客户端(io.appium.java_client)版本一致,避免版本不兼容引发协议问题。
- 手机开发者选项:
- 确认开启USB调试
- 确认开启USB调试(安全设置)(部分设备需要)
- 确认授予Appium相关的未知应用安装权限
- ADB连接状态:重新执行
adb devices,确保设备状态为device,若为unauthorized需重新授权;无线连接需确认设备与电脑同局域网,且已通过adb connect建立连接。 - Appium日志排查:查看Appium Server控制台日志,获取更详细的错误信息,比如应用包名/活动名是否正确、设备连接是否超时等。
- W3C协议设置:若暂时不想修改键名,可在Appium Server启动时添加
--no-w3c参数关闭W3C模式,但优先推荐适配W3C规范。
内容的提问来源于stack exchange,提问作者Jocken
相关产品推荐
相关产品推荐

