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

时间:2014-06-21 13:49:16

标签: android android-manifest robotium android-testing keyguard

我正在编写Android功能测试。我需要唤醒设备并使应用程序可视化以便它们工作。我为此咨询了Android developers。但是,提出的解决方案存在一些问题:

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

此类在API级别13中已弃用。请使用FLAG_DISMISS_KEYGUARD   和/或FLAG_SHOW_WHEN_LOCKED;这可以让你无缝地   当应用程序移入和移出时,隐藏键盘锁   前景,并不要求任何特殊权限   请求。由允许您的newKeyguardLock(String)返回的句柄   禁用/重新启用键盘锁。

我尝试了这个建议,但是,与弃用的解决方案相反,标志一个jsut对我不起作用 - 它不会解锁设备。我还发现消息来源证实了旗帜解决方案的不稳定性(例如this answer上的评论)。

  • 第二个问题是我需要为正在测试的应用程序添加权限。我发现这是一种非常错误的方法(修改测试中的代码以便能够测试它)。我发现有几个地方建议我使用src/debug/AndroidManifest.xml(例如onethis one)。但是,它并没有按照规定发生 - 调试Mainfest不会包含在设备上已部署的内容中。它与我构建和部署的方式有关吗?我使用Eclipse进行开发(ADT)。只有当我使用像ant?
  • 这样的构建工具时,这种清单注入才会起作用

总而言之 - 在我的测试执行过程中,有人可以建议一个稳定的解决方案来解锁并保持唤醒设备吗?

修改

我现在发现Robotium在其最新版本的框架中也包含unlockScreen方法。它完全使用上面提出的窗口标志,也不能在我的设备上运行。

4 个答案:

答案 0 :(得分:0)

运行Robotium测试时,我遇到了与不可靠解锁相同的问题。我没有找到程序化解锁可靠工作的设备的解决方案,但我做了两件事作为解决办法。

  • 只需停用锁定屏幕(Settings -> Security -> Screen lock -> None)即可。不理想,但在一天结束时,可靠的测试是重要的。

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

警告:每天24小时在主屏幕上打开屏幕可能会导致屏幕老化或重影。我不确定这是否是永久性的,但是意识到这一点。在我们的例子中,我们使用的是专用测试设备,因此不是什么大问题。

另请注意,由于手机的屏幕始终处于打开状态,因此您可能需要调低亮度以降低电池电量(有时USB充电速度会很慢)。

答案 1 :(得分:0)

UiDevice的实例有wakeUp()方法

  

如果屏幕关闭,此方法模拟按下电源按钮,否则如果屏幕已经打开则不执行任何操作。如果屏幕关闭且刚刚打开,此方法将插入500毫秒的延迟,以允许设备时间唤醒并接受输入。

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

答案 2 :(得分:0)

到目前为止,唯一能为我工作的是在测试之前启动唤醒设备脚本。脚本通过向所有设备发送键事件来从cli解锁设备。解锁部分在我的经验中很重要,有些设备不允许你从cli解锁它们(你仍然需要刷卡),在这种情况下我建议照顾"没有锁定" Google Play上的应用应该会有所帮助,但可能无法在所有设备上运行。

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

答案 3 :(得分:0)

我对弃用和新方法都有类似的麻烦。最终,我最终得到了这个黑客,只是发送一个向上滑动的手势来解锁:

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);
}

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