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

通过Selenium Grid运行Android测试时出现Capability匹配错误求助

解决Selenium Grid执行Appium Android测试时的CapabilityNotPresentOnTheGridException错误

看起来你遇到的问题核心是Selenium Grid的默认Capability匹配机制无法识别Appium的自定义能力参数,再加上Node配置和代码中的Capabilities存在不一致,导致Hub找不到能匹配的Node节点。下面一步步帮你解决:

一、核心原因分析

默认的DefaultCapabilityMatcher只能处理标准Selenium的Capabilities(比如platformName、browserName这些),但Appium有很多自定义的参数(比如appiumVersion、autoGrantPermissions、automationName),这些参数默认不会被Hub用来匹配Node,所以会抛出找不到对应Capability的错误。同时你的Node配置和代码中的Capabilities还存在大小写、值不匹配的问题,进一步加剧了这个问题。

二、具体解决方案

1. 修改Hub配置,使用Appium专属的Capability匹配器

Hub需要使用Appium提供的AppiumCapabilityMatcher来正确识别Appium的自定义Capabilities,同时替换为Appium的代理类来处理请求。修改你的Hub配置文件如下:

{
  "host": "10.24.4.179",
  "port": 4654,
  "newSessionWaitTimeout": -1,
  "servlets" : [],
  "prioritizer": null,
  "capabilityMatcher": "io.appium.grid.plugin.AppiumCapabilityMatcher",
  "throwOnCapabilityNotPresent": true,
  "nodePolling": 5000,
  "cleanUpCycle": 5000,
  "timeout": 300000,
  "browserTimeout": 0,
  "maxSession": 5,
  "jettyMaxThreads":-1
}

注意:启动Hub时,要确保你的classpath中包含appium-grid-plugin的依赖包,你可以通过Maven获取或者从Appium的安装目录中找到对应的jar包。

2. 修正Node配置,确保Capabilities和代码一致

你的Node配置存在几个关键问题:

  • platformname拼写错误(应该是首字母大写的platformName,和代码中的MobileCapabilityType.PLATFORM_NAME对应)
  • 缺少代码中用到的关键Appium参数(比如automationName、appPackage等)
  • platformVersion值和代码不一致(代码是5.1,Node是5.1.1)
  • 代理类应该使用Appium的专属代理

修改后的Node配置如下:

{
  "capabilities": [
    {
      "platformName": "Android",
      "platformVersion": "5.1",
      "deviceName": "Pixel_2_API_22",
      "app": "/Users/prakashp/IdeaProjects/ymca/src/test/resources/YMCA.apk",
      "newCommandTimeout": 60,
      "browserName": "android",
      "automationName": "UiAutomator2",
      "appPackage": "com.ytlcomms.ymca",
      "autoGrantPermissions": true,
      "clearSystemFiles": true,
      "noReset": false,
      "fullReset": false
    }
  ],
  "cleanUpCycle": 2000,
  "timeout": 30000,
  "proxy": "io.appium.grid.plugin.AppiumRemoteProxy",
  "url": "http://10.24.4.179:4501/wd/hub",
  "host": "10.24.4.179",
  "port": 4501,
  "maxSession": 1,
  "register": true,
  "registerCycle": 5000,
  "hubPort": 4654,
  "hubHost": "10.24.4.179"
}

3. 优化代码中的Capabilities设置

代码中有一个可以优化的点:MobileCapabilityType.VERSION已经被platformVersion替代,建议替换成标准参数,避免混淆:

// 替换原来的VERSION设置
dcap.setCapability(MobileCapabilityType.PLATFORM_VERSION, "5.1");
// 移除这一行:dcap.setCapability(MobileCapabilityType.VERSION, "5.1");

4. 重启Hub和Node,验证注册状态

  1. 重启Hub:使用修改后的配置文件启动Hub
    java -jar selenium-server-standalone-<你的版本号>.jar -role hub -hubConfig hub.json
    
  2. 重启Node:用修改后的配置启动Appium Node
    appium --nodeconfig node.json
    
  3. 访问Hub控制台(http://10.24.4.179:4654/grid/console),确认Node已经成功注册,并且显示的Capabilities和你配置的一致。

三、额外注意事项

  • 如果暂时无法获取appium-grid-plugin,可以临时将Hub配置中的throwOnCapabilityNotPresent改为false(不推荐长期使用,可能导致匹配错误的Node)
  • 确保Node上的Appium版本和代码中指定的appiumVersion一致
  • avd参数如果是代码中指定的,建议也添加到Node的Capabilities中,或者确认Node已经默认使用该AVD启动设备

内容的提问来源于stack exchange,提问作者Prakash P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:47