Android移动端App Espresso UI测试时Chrome停止运行解决方案问询
问题根因
Gradle依赖更新后链接跳转默认唤起System WebView Shell而非Chrome,通常是两类原因导致:
- 测试依赖(尤其是
espresso-intents、uiautomator相关组件)版本更新后,Intent匹配优先级发生变化,优先命中了系统自带的WebView Shell - CI环境所用的模拟器镜像没有预装Chrome,WebView Shell是系统默认的http链接 fallback 处理程序
恢复Chrome调用的可行方案
方案1:通过模拟器启动参数配置(最符合你的需求)
操作步骤如下:
- 更换CI环境的模拟器镜像为带Google APIs/Google Play后缀的官方镜像,这类镜像默认预装Chrome应用(包名
com.android.chrome),原生AOSP镜像默认不自带Chrome,仅内置WebView Shell - 在模拟器启动脚本中追加配置命令,无需人工交互即可将Chrome设为http/https链接的默认处理程序:
emulator -avd <你的AVD名称> -no-snapshot-load -shell "pm set-app-link --user 0 com.android.chrome always allow http https"
如果你的CI环境的模拟器已经处于运行状态,也可以单独通过adb执行配置命令:
adb shell pm set-app-link --user 0 com.android.chrome always allow http https
配置完成后再运行测试,即可恢复原有Chrome启动逻辑,你之前的waitChrome方法可以换回原com.android.chrome包名校验。
方案2:测试代码中强制指定跳转目标为Chrome
如果不想修改CI环境配置,可以直接在触发http链接跳转的测试逻辑中,强制指定Intent的目标包名为Chrome,从根源避免唤起WebView Shell:
val testUri = Uri.parse("你的测试http链接") val intent = Intent(Intent.ACTION_VIEW, testUri).apply { setPackage("com.android.chrome") addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } // 用应用上下文启动Intent,或者通过Espresso的Intent API传递即可
方案3:回退导致行为变更的依赖版本
你可以排查最近更新的测试相关依赖的版本变动,常见的会影响Intent跳转逻辑的依赖包括:
androidx.test.espresso:espresso-intentsandroidx.test:coreandroidx.test.uiautomator:uiautomator
找到最近升级的依赖后,在build.gradle中固定为升级前的可用版本,即可直接恢复原有行为。
内容的提问来源于stack exchange,提问作者chiarotto.alessandro
相关产品推荐
相关产品推荐

