使用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

