Android全屏提示弹窗导致Espresso测试失败的解决咨询
解决全屏提示弹窗导致的Espresso测试失败问题
针对你在Nexus 7 API 23模拟器上遇到的全屏提示弹窗(“正在全屏查看,如需退出请从顶部向下滑动”)导致Espresso测试失败的问题,这里有几个可行的解决方案:
方案1:通过ADB命令永久禁用该弹窗
这个弹窗是Android系统针对沉浸式模式的首次提示,你可以通过ADB命令预先关闭它,这样测试运行时就不会再弹出:
adb shell settings put global immersive_mode_confirmations confirmed
把这个命令添加到构建服务器的模拟器初始化脚本中,在启动测试前执行,就能确保所有测试运行时都不会遇到这个弹窗。
方案2:在测试中自动检测并点击“Got it”按钮
如果无法修改构建服务器的初始化步骤,你可以借助UiAutomator(与Espresso兼容)来自动处理这个系统弹窗——因为Espresso默认只操作APP内视图,而系统弹窗属于系统UI,需要用UiAutomator定位。
你可以创建一个全局的TestRule,在每个测试执行前检查并处理弹窗:
import androidx.test.InstrumentationRegistry; import androidx.test.uiautomator.By; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.Until; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; public class DismissImmersivePopupRule implements TestRule { @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // 等待弹窗出现(最多5秒) if (device.wait(Until.hasObject(By.text("Got it")), 5000)) { device.findObject(By.text("Got it")).click(); } base.evaluate(); } }; } }
然后在你的测试类中添加这个Rule:
@Rule public DismissImmersivePopupRule dismissPopupRule = new DismissImmersivePopupRule(); // 你的测试方法...
这个规则会在每个测试开始前检查是否有“Got it”按钮,若存在则点击关闭,不会干扰正常测试流程。
方案3:调整模拟器的系统设置(适合手动配置场景)
如果你有权限修改模拟器配置,可以在创建模拟器后预先关闭沉浸式模式提示:
- 启动模拟器,进入设置 > 显示 > 全屏应用
- 找到你的应用,关闭“首次进入全屏时显示提示”选项
不过这种方法在构建服务器上需要手动配置镜像,不如ADB命令灵活。
另外,注意到你报错信息里提到Animations or transitions are enabled on the target device,虽然这不是本次问题的直接原因,但禁用系统动画能让Espresso测试更稳定,你也可以在测试初始化时添加这些ADB命令:
adb shell settings put global window_animation_scale 0.0 adb shell settings put global transition_animation_scale 0.0 adb shell settings put global animator_duration_scale 0.0
内容的提问来源于stack exchange,提问作者BRDroid
相关产品推荐
相关产品推荐

