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

Appium 2中UiAutomator2驱动调用close/quit后Android应用未关闭

解决Appium 2 + UiAutomator2下应用无法关闭及用例重启问题

针对你遇到的调用driver.close()/driver.quit()后应用仍未关闭,且需要每个测试用例重启应用并创建新会话的问题,可从以下几个方向处理:

1. 完善会话销毁逻辑,确保彻底终止驱动与应用

driver.quit()理论上会终止Appium会话并关闭驱动,但UiAutomator2有时会因为进程残留导致应用未关闭。可在quit()后添加adb命令强制停止应用进程:

// 执行quit终止当前Appium会话
driver.quit();
// 调用adb命令强制停止目标应用进程
Runtime.getRuntime().exec(String.format("adb -s %s shell am force-stop %s", uuid, applicationDetails.getAppPackage()));

2. 调整Desired Capabilities配置,适配用例重启需求

你的配置中setNoReset(!isClearAppData())会控制应用数据是否保留,若isClearAppData()为false,noReset设为true可能导致应用进程残留。可结合需求调整:

  • 需保留应用数据但重启应用:保持noReset=true,显式设置dontStopAppOnReset=false(确保会话结束后停止应用进程)
  • 允许清除应用数据:直接设置setFullReset(true),每次启动都会重新安装并清除应用本地数据

修改后的配置示例:

return new UiAutomator2Options()
        .setPlatformName(ApplicationConstants.ANDROID)
        .setDeviceName(deviceName)
        .setUdid(uuid)
        .setNoReset(!isClearAppData())
        .setDontStopAppOnReset(false) // 强制会话结束后停止应用
        .setNewCommandTimeout(Duration.ofSeconds(applicationDetails.getExecutionContext() == ExecutionContext.XFI ? NEW_COMMAND_TIMEOUT * XFI_NEW_COMMAND_TIMEOUT_MULTIPLIER : NEW_COMMAND_TIMEOUT))
        .setAutomationName(AutomationName.ANDROID_UIAUTOMATOR2)
        .setSystemPort(SYSTEM_PORT)
        .setAppActivity(applicationDetails.getAppActivity())
        .setAppPackage(applicationDetails.getAppPackage());

3. 测试用例前后置的标准化处理

为保证每个用例都是全新会话,需在测试框架中做标准化处理:

  • 用例前置:创建新的Appium会话实例
  • 用例后置:执行driver.quit()终止会话 → 调用adb命令强制停止应用 → 释放driver资源

关键注意点

  • 若多测试并行,需确保每个会话的systemPort唯一,避免端口冲突导致驱动进程残留
  • 若使用TestNG/JUnit等框架,可将销毁逻辑放在@AfterMethod注解方法中,确保每个用例执行后自动清理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:42:17