使用Selenium Grid实现安卓多设备并行执行时无法创建远程会话
看起来你在搭建Selenium Grid+Appium实现Android设备并行自动化时,遇到了Session创建失败的问题,我帮你梳理下几个关键问题点和对应的解决办法:
1. JSON节点配置的核心错误修正
你的JSON配置里有几个明显的错误,直接导致节点无法正确注册到Grid Hub,或者Session匹配失败:
- capabilities部分:
platformName写成了Windows,完全不符合Android设备的配置,必须改成AndroidbrowserName设置为Android是错误的,原生App测试不需要这个字段,直接删除即可(这个字段是给浏览器测试用的)- 补充
automationName字段,确保和代码里使用的自动化引擎一致(比如uiautomator2)
- configuration部分:
- 多设备并行时,每个Appium节点的
port必须唯一(比如Redmi用4723,Moto E用4724) url要和当前节点的Appium服务地址一致,比如http://0.0.0.0:4723/wd/hub(端口要和port字段匹配)- 建议把
proxy改成Appium专用的io.appium.java_client.remote.AppiumProxy,避免兼容性问题
- 多设备并行时,每个Appium节点的
修正后的Redmi节点JSON示例:
{ "capabilities": [ { "deviceName": "Redmi", "platformName": "Android", "platformVersion": "7.0", "automationName": "uiautomator2", "appPackage": "com.amhi.healthjinn", "appActivity": "com.amhi.healthjinn.MainActivity", "noReset": true, "maxInstances": 1 } ], "configuration": { "cleanUpCycle": 2000, "timeout": 30000, "proxy": "io.appium.java_client.remote.AppiumProxy", "url": "http://0.0.0.0:4723/wd/hub", "host": "0.0.0.0", "port": 4723, "maxSession": 1, "register": true, "registerCycle": 5000, "hubPort": 4444, "hubHost": "127.0.0.1" } }
Moto E的节点配置要把port改成4724,deviceName和platformVersion对应自己的设备,url改成http://0.0.0.0:4724/wd/hub。
2. TestNG XML的并行执行配置
你当前的TestNG XML只配置了单个测试用例,要实现并行执行,必须开启并行模式并设置线程数:
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" > <suite name="Parallel Mobile Tests" parallel="tests" thread-count="2"> <test name="test_redmi"> <parameter name="device" value="Redmi"/> <parameter name="version" value="7.0"/> <classes> <class name="Tests.LoginTest"> <methods> <include name="loginOTP"/> </methods> </class> </classes> </test> <test name="test_moto"> <parameter name="device" value="Moto E"/> <parameter name="version" value="7.1.2"/> <classes> <class name="Tests.LoginTest"> <methods> <include name="loginOTP"/> </methods> </class> </classes> </test> </suite>
parallel="tests"表示按<test>标签并行执行thread-count="2"表示同时运行2个线程,对应两台设备
3. 代码中的Capability与连接地址修正
你的setUp方法有两个关键问题:
- 使用
CapabilityType.VERSION设置系统版本是错误的,应该用Appium专属的MobileCapabilityType.PLATFORM_VERSION - 连接地址应该指向Grid Hub,而不是单个Appium节点!Grid会自动把请求分配到匹配的节点上
修正后的setUp方法片段:
import io.appium.java_client.remote.MobileCapabilityType; @Parameters({"device","version"}) @BeforeTest(alwaysRun = true) public static void setUp(String device,String version) throws MalformedURLException, InterruptedException { DesiredCapabilities cap = new DesiredCapabilities(); cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); cap.setCapability(MobileCapabilityType.DEVICE_NAME, device); cap.setCapability(MobileCapabilityType.NO_RESET, true); cap.setCapability(MobileCapabilityType.PLATFORM_VERSION, version); cap.setCapability(MobileCapabilityType.AUTOMATION_NAME, cfg.getAutomationName()); cap.setCapability(MobileCapabilityType.APP_PACKAGE, cfg.getAppPackage()); cap.setCapability(MobileCapabilityType.APP_ACTIVITY, cfg.getAppActivity()); // 重点:这里的URL是Grid Hub的地址,不是单个Appium节点的地址 driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub"), cap); System.out.println(driver); }
4. 节点启动与Hub验证步骤
- 先启动Selenium Grid Hub:运行命令
java -jar selenium-server-standalone-xxx.jar -role hub(替换xxx为你的Selenium版本号) - 分别为两台设备启动Appium服务并加载对应配置:
- Redmi设备:
appium --nodeconfig redmi_node_config.json - Moto E设备:
appium --nodeconfig moto_node_config.json -p 4724
- Redmi设备:
- 访问
http://127.0.0.1:4444/grid/console,确认两个节点都成功注册到Hub
做完以上修正后,运行TestNG XML,应该就能看到两台设备同时执行测试用例了。如果还有问题,可以查看Appium和Grid Hub的日志,获取更详细的错误提示。
内容的提问来源于stack exchange,提问作者Abhishek Chauhan
相关产品推荐
相关产品推荐

