You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无法识别参数,进而无法创建会话。

代码中的错误

  1. 键名拼写错误:addPackage、addActivity是拼写错误,正确键名为appPackage和appActivity。
  2. W3C规范不兼容:deviceName、platformVersion、udid这些旧版键名在W3C协议下需要添加appium:前缀,否则会被判定为非法键值。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:42:28