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
相关产品推荐
相关产品推荐

