由于沉浸式模式确认弹出窗口,Google 云测试服务器上的某些虚拟设备似乎无法正确执行测试(如下所示:https://developer.android.com/training/system-ui/immersive.html) - 有没有办法用 Espresso 自动关闭该弹出窗口?基本上我的代码可以在本地模拟器中运行,但不能在谷歌云服务器上运行。 这就是失败的地方:
View v = activity.getWindow().getDecorView();
v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
我已经使用类似版本的@paul-t解决了这个问题。模拟器启动后,运行下一个命令:
adb shell settings put secure immersive_mode_confirmations confirmed
之后您可以执行 Espresso 测试。
灵感:http://sviatoslavdev.blogspot.com/2018/02/adb-setings-secure.html
您可以在模拟器启动后立即运行这些 ADB 命令:
adb shell settings put secure immersive_mode_confirmations your.package.com
adb reboot (required)
immersive_mode_confirmations 是逗号分隔的软件包列表,不再需要沉浸模式确认
我找到了一个可行的解决方案。它与 Paul 的答案类似,但是是在测试运行之前以编程方式设置权限,而不是使用 ADB。 有一个 LinkedIn 开源库可以为您完成所有操作,从获取 WRITE_SECURE_SETTINGS 权限到动态更改沉浸式确认对话框的需求。 设置库后,在测试开始之前使用以下行:
TestButler.setImmersiveModeConfirmation(false);
有关更多详细信息和设置说明,请访问此处。
基于 jmartinalonso 的回答。我通过将以下代码添加到
@BeforeClass
函数来解决:
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
try {
UiDevice
.getInstance(InstrumentationRegistry.getInstrumentation())
.executeShellCommand("settings put secure immersive_mode_confirmations confirmed")
}catch (_: IOException) {
}