容器化Appium测试:无法连接AndroidUiautomator2Driver求助
问题
在Docker容器中使用Appium自动化Android平台的Flutter应用,已成功连接主机ADB并安装Appium Settings及Flutter应用,但无法连接AndroidUiautomator2Driver,核心错误为connect ECONNREFUSED 127.0.0.1:8200。
相关日志
[ADB] Running '/usr/lib/android-sdk/platform-tools/adb -P 5037 -s RR8W802EFNN install -r -g /home/myuser/app-debug.apk' [ADB] The installation of 'app-debug.apk' took 7979ms [ADB] Install command stdout: Performing Streamed Install [ADB] Success [AndroidUiautomator2Driver@9de5 (9d152cd0)] Performing shallow cleanup of automation leftovers [AndroidUiautomator2Driver@9de5 (9d152cd0)] No obsolete sessions have been detected (connect ECONNREFUSED 127.0.0.1:8200) [ADB] Running '/usr/lib/android-sdk/platform-tools/adb -P 5037 -s RR8W802EFNN shell am force-stop io.appium.uiautomator2.server.test' [AndroidUiautomator2Driver@9de5 (9d152cd0)] Starting UIAutomator2 server 5.12.16 [AndroidUiautomator2Driver@9de5 (9d152cd0)] Using UIAutomator2 server from '/home/myuser/.appium/node_modules/appium-flutter-driver/node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server/apks/appium-uiautomator2-server-v5.12.16.apk' and test from '/home/myuser/.appium/node_modules/appium-flutter-driver/node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server/apks/appium-uiautomator2-server-debug-androidTest.apk' [AndroidUiautomator2Driver@9de5 (9d152cd0)] Waiting up to 30000ms for UiAutomator2 to be online... [ADB] Creating ADB subprocess with args: ["-P","5037","-s","RR8W802EFNN","shell","am","instrument","-w","-e","disableAnalytics","true","io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner"] [AndroidUiautomator2Driver@9de5 (9d152cd0)] Matched '/status' to command name 'getStatus' [AndroidUiautomator2Driver@9de5 (9d152cd0)] Proxying [GET /status] to [GET http://127.0.0.1:8200/status] with no body [AndroidUiautomator2Driver@9de5 (9d152cd0)] connect ECONNREFUSED 127.0.0.1:8200 [AndroidUiautomator2Driver@9de5 (9d152cd0)] Matched '/status' to command name 'getStatus' [AndroidUiautomator2Driver@9de5 (9d152cd0)] Proxying [GET /status] to [GET http://127.0.0.1:8200/status] with no body [AndroidUiautomator2Driver@9de5 (9d152cd0)] connect ECONNREFUSED 127.0.0.1:8200
Dockerfile配置
RUN apt-get update \ && yes | apt-get install -y maven \ && yes | apt-get install usbutils \ && apt install wget \ && yes | apt-get install android-sdk \ && yes | apt-get install android-tools-adb \ && apt clean \ && rm -rf /var/lib/apt/lists/* ENV ANDROID_HOME "/usr/lib/android-sdk" ENV ANDROID_SDK_ROOT $ANDROID_HOME ENV PATH $PATH:$ANDROID_HOME/platforms:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools ENV ANDROID_ADB_SERVER_ADDRESS "host.docker.internal" RUN useradd -ms /bin/bash myuser \ && usermod -aG root myuser USER myuser SHELL ["/bin/bash", "--login", "-c"] RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash \ && source $HOME/.nvm/nvm.sh \ && nvm install v16.18.1 \ && npm install -g appium@latest \ && appium driver install uiautomator2 \ && appium driver install xcuitest \ && appium driver install --source=npm appium-flutter-driver \ && appium plugin install relaxed-caps \ && appium plugin install execute-driver \ && appium plugin install --source=npm appium-wait-plugin
docker-compose.yml配置
services: service: image: image network_mode: host hostname: localhost volumes: - /Users/.m2:/home/myuser/.m2
已确认容器内curl http://127.0.0.1:8200连接被拒绝,但主机上访问正常,容器已设置network_mode: host,仍无法解决问题。
解决方案
1. 修正ADB端口转发配置
Uiautomator2 Server运行在设备上,Appium需要通过ADB端口转发访问设备的8200端口。由于容器连接的是主机的ADB服务器,需确保主机已完成端口转发:
- 在主机执行:
adb -s RR8W802EFNN forward tcp:8200 tcp:8200 - 验证转发生效:
adb forward --list,输出需包含RR8W802EFNN tcp:8200 tcp:8200
2. 调整Appium的Uiautomator2连接地址
容器内的Appium默认尝试访问127.0.0.1:8200,但实际该端口转发到主机,需强制Appium使用主机实际IP而非127.0.0.1:
- 启动Appium会话时添加capability:
"uiautomator2ServerHost": "主机实际IP地址" - 或在容器内设置环境变量:
export APPIUM_UIAUTOMATOR2_SERVER_HOST=主机实际IP地址
3. 检查容器与主机ADB的权限一致性
- 临时切换到root用户测试:修改Dockerfile中的
USER root,重新构建镜像后运行 - 检查主机ADB授权状态:
adb devices确保设备已授权,容器内执行adb devices需显示相同设备列表
4. 重新安装Uiautomator2 Server
日志显示已安装服务器,但可能存在版本不兼容:
- 容器内执行:
appium driver uninstall uiautomator2,再重新安装:appium driver install uiautomator2 - 手动推送对应版本APK到设备:
adb install -r /home/myuser/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server/apks/appium-uiautomator2-server-v5.12.16.apk
5. 移除容器hostname设置
在docker-compose.yml中删除hostname: localhost,避免容器的localhost解析干扰主机端口访问:
services: service: image: image network_mode: host volumes: - /Users/.m2:/home/myuser/.m2
内容的提问来源于stack exchange,提问作者Youssef Ehab
相关产品推荐
相关产品推荐

