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

Python Appium多设备并行测试UiAutomator2端口占用求助

运行环境
  • Windows 10
  • Python 3.7.9
  • Appium 1.22.3
  • Node v12.15.0
  • Android Debug Bridge version 1.0.41(Version 33.0.2-8557947)
  • Sdkmanager 4.0.1
  • Appium-Python-Client==1.2.0
问题根因

三个独立问题共同触发所有报错:

  • 端口排查范围错误:此前检查的4725-4728是Appium服务的监听端口,但报错提示被占用的systemPort是UiAutomator2 Server与Appium通信的专属端口,默认取值范围为8200-8299段。多线程并发启动会话时,如果没有给每个设备显式配置唯一的systemPort,多个会话会抢占默认的8200端口,直接触发端口占用报错;端口被占后UiAutomator2服务启动失败,driver实例初始化结果为None,后续调用find_element方法就会抛出'NoneType' object has no attribute 'find_element'错误。
  • UDID携带隐藏无效字符:报错信息里的设备UDIDOUKIC16PRO37851 末尾带了多余空格,Appium校验已连接设备列表时做精确字符串匹配,带空格的UDID和adb返回的真实设备ID无法匹配,因此抛出Device OUKIC16PRO37851 was not in the list of connected devices错误。
  • 客户端版本并发兼容bug:使用的Appium-Python-Client 1.2.0为低版本,多线程场景下并发初始化driver实例时存在内部属性锁冲突的已知问题,会直接抛出can't set attribute错误。
修复方案

按以下操作即可解决问题:

  • 修正端口配置规则:为每台并行测试的设备分配两组全局唯一的不重复端口,一组是Appium服务监听端口(可按4723、4725、4727依次递增分配),另一组是专属systemPort(从8200开始依次递增分配,如8200、8201、8202),禁止多台设备复用同一端口。端口占用检查时除了校验Appium服务端口,还要通过netstat -ano | findstr :82xx检查对应systemPort的占用状态,发现残留占用进程直接终止。
  • 预处理设备标识:读取到设备UDID后,统一调用strip()方法去除首尾的空格、换行符等隐藏字符,再传入capabilities配置项,避免字符串匹配失败。
  • 升级客户端版本:将Appium-Python-Client升级到2.7.1及以上的稳定版本,修复低版本并发初始化时的属性赋值冲突问题。
  • 优化并发逻辑与清理规则:每个测试线程独立初始化自己的driver实例,禁止跨线程共享driver对象;每个线程的测试逻辑执行完成后,必须在finally代码块中调用driver.quit()显式销毁会话、释放端口资源,不要依赖进程退出自动回收资源。启动测试前除了终止所有node.exe进程,还要对所有已连接设备执行adb shell am force-stop io.appium.uiautomator2.server、adb shell am force-stop io.appium.uiautomator2.server.test命令,清理设备端残留的UiAutomator2服务进程,避免设备端端口被残留进程占用。

内容的提问来源于stack exchange,提问作者Gauthier Buttez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:51:21