解锁模拟器或设备进行Android测试



我正在编写Android功能测试。我需要设备是清醒的,应用程序是可视化的,以便他们的工作。为此我咨询了Android开发者。然而,提出的解决方案存在几个问题:

  • 建议的方法现在有几个不赞成的方法。Android API现在建议我在窗口上使用标志:

该类在API级别13中已弃用。使用FLAG_DISMISS_KEYGUARD和/或FLAG_SHOW_WHEN_LOCKED代替;这可以让你无缝地在应用程序移进和移出时隐藏键护前台,不需要任何特殊的权限要求。由newKeyguardLock(String)返回的句柄,允许您禁用/重新启用keyguard。

我尝试了这个建议,然而,与已弃用的解决方案相反,标志一只是不适合我-它不解锁设备。我还发现了确认标志解决方案不稳定的来源(例如对这个答案的评论)。

  • 第二个问题是,我需要添加权限的应用程序在测试。我发现这是非常错误的方法(修改被测代码以便能够测试它)。我发现有几个地方建议我使用src/debug/AndroidManifest.xml(例如这个和这个)。然而,它并没有像所说的那样发生——调试Mainfest没有被包含到设备上部署的东西中。这与我构建和部署的方式有关吗?我使用Eclipse进行开发。只有当我使用像ant这样的构建工具时,这个清单注入才能工作吗?

总而言之-有人能建议一个稳定的解决方案,解锁和保持清醒的设备,而我的测试正在执行?

编辑

我现在发现Robotium也在他们最新版本的框架中包含了unlockScreen方法。它使用了上面建议的窗口标志,也不能在我的设备上工作。

UiDevice实例有wakeUp()方法

此方法模拟在屏幕处于关闭状态时按下电源按钮,否则如果屏幕已经打开则不执行任何操作。如果屏幕是关闭的,它刚刚被打开,这个方法将插入一个500ms的延迟,让设备有时间唤醒并接受输入。

然而,我不知道类似的方法存在解锁屏幕,所以我目前的解决方案是删除锁定模式(在测试设备上设置为NONE)

在运行Robotium测试时,我遇到了同样的不可靠解锁问题。我没有找到一个可靠地通过编程解锁设备的解决方案,但我做了两件事作为解决办法。

  • 请禁用锁屏(Settings -> Security -> Screen lock -> None)。虽然不理想,但最终,可靠的测试是最重要的。

  • 启用"保持清醒"设置,以防止屏幕因不活动而关闭(Settings -> Developer options -> Stay awake)。一些OEM/手机要么没有这个选项,要么仍然关闭,所以对于那些讨厌的设备,我安装了KeepScreenOn应用程序。

警告:让屏幕开着,坐在主屏幕上,一天24小时可能会导致一些屏幕烧坏/重影。我不确定这是否是永久性的,但要注意这一点。在我们的案例中,我们使用了专用的测试设备,所以这不是什么大问题。

还需要注意的是,由于手机会一直打开屏幕,你可能想要调暗亮度以减少电池电量(通过USB充电有时会很慢)。

到目前为止,对我来说唯一有效的是在测试之前启动唤醒设备脚本。脚本通过向所有设备发送关键事件来从cli中解锁设备。根据我的经验,解锁部分很重要,有些设备不允许你从cli解锁(你仍然需要滑动),在这种情况下,我建议在Google Play上寻找"无锁"应用程序,它应该有帮助,但可能不适用于所有设备。

我正在做Gradle插件,在Gradle构建过程中运行instrumentation测试之前,它会做同样的事情。

对于已弃用的方法和新方法,我都遇到了类似的问题。最终,我采用了这个方法,只需发送一个向上滑动的手势即可解锁:

KeyguardManager keyguardManager = (KeyguardManager) InstrumentationRegistry.getContext().getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager.isKeyguardLocked()) {
  UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
  int x = device.getDisplayWidth() / 2;
  int startY = device.getDisplayHeight();
  int endY = 0;
  device.swipe(x, startY, x, endY, 50);
}

它依赖于锁屏的细节,但到目前为止,它的工作效果出奇的好。

相关内容

  • 没有找到相关文章

最新更新