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

使用WebdriverIO无法在Android设备运行完整测试套件(单测正常)

解决WebdriverIO批量测试Android设备时的连接异常问题

我之前帮不少开发者排查过类似的WebdriverIO批量测试Android设备的稳定性问题,你遇到的情况很典型——单个测试跑没问题,批量跑就随机失败,还伴随硬件异常,大概率是资源竞争、session清理不彻底或者并发配置不合理导致的。给你几个实用的排查和解决方向:

1. 限制测试并发数

WebdriverIO的maxInstances如果设置大于1,单台Android设备可能无法同时承载多个Appium session,导致连接超时或资源冲突。你可以在wdio.conf.js里把这个值改成1,强制串行执行测试:

capabilities: [{
  // 你的设备capabilities配置
  maxInstances: 1,
}],

2. 确保测试后彻底清理Session

有些测试用例执行完没有正常关闭Appium Session,残留的进程会占用adb连接或硬件资源,导致后续测试无法建立新连接。可以在wdio.conf.js的afterTest钩子中添加强制清理逻辑:

afterTest: async (test, context, { error, result, duration, passed, retries }) => {
  if (driver) {
    try {
      await driver.deleteSession();
    } catch (err) {
      console.log('清理Session时出现异常:', err.message);
    }
  }
},

3. 调整超时参数解决ESOCKETTIMEDOUT

ESOCKETTIMEDOUT通常是连接超时导致的,你可以尝试增大WebdriverIO的连接超时设置:

// 在wdio.conf.js中添加或修改
connectionRetryTimeout: 120000, // 调整为2分钟
connectionRetryCount: 3,

同时启动Appium时加上--session-override参数,强制覆盖残留的旧Session:

appium --session-override

4. 重置adb连接提升稳定性

批量测试时adb连接容易出现波动,你可以在测试套件执行前重置adb:

adb kill-server && adb start-server

也可以把这个命令加到wdio.conf.js的beforeSuite钩子中,确保每次执行套件前adb是干净的状态:

beforeSuite: async () => {
  await shell.exec('adb kill-server && adb start-server');
}

(注:需要先安装shelljs依赖:npm install shelljs --save-dev)

5. 查看Appium日志定位深层问题

开启Appium的调试日志(启动时加--log-level debug),重点看失败测试对应的日志内容。比如你提到的相机自动开关异常,大概率是某个测试用例调用相机后没有释放资源,导致后续测试无法获取相机权限,进而引发Session异常。

我之前遇到过类似的相机资源泄漏问题,最后发现是测试用例没有正确退出相机页面,导致硬件资源被持续占用,批量执行时就会随机失败。你可以重点检查涉及相机操作的测试用例,确保操作完成后正确退出相关页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:21