6

我正在使用Robotium 框架对应用程序进行黑盒测试。每次安装新应用程序时,被测应用程序都会在状态栏中发送通知。我想单击该通知,但我仍然没有找到合适的方法来执行此操作。

当我手动单击一个通知时,我得到以下logcat几行:

I/ActivityManager(  148): START {flg=0x14000000 cmp=com.test.package/.activity.FrontActivity bnds=[0,38][240,86] (has extras) u=0} from pid -1
I/ActivityManager(  148): START {flg=0x14000000 cmp=com.test.package/.activity.ResultActivity u=0} from pid 8600
I/ActivityManager(  148): Displayed com.test.package/.activity.FrontActivity: +1s183ms
I/ActivityManager(  148): Displayed com.test.package/.activity.ResultActivity: +744ms

我知道 Robotium 不能同时测试 2 个不同的应用程序,而且我知道您无法收到外部应用程序的通知。

我还尝试使用以下代码获取待处理的意图并启动它:

Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
String intentClassString = "com.test.package.activity.FrontActivity";
Class<?> intentClass = null;

try {
    intentClass = Class.forName(intentClassString);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Intent intent = new Intent(context, intentClass);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_NO_CREATE);

try {
    pendingIntent.send();
} catch (CanceledException e) {
    e.printStackTrace();
}

该活动实际上已显示,但它与我通过手动调用它获得的不同。我认为在我传递的上下文或我调用未决意图的方式中有问题。

关于这个问题的任何提示?有没有更好的方法来模拟点击通知?

4

3 回答 3

1

您可以触发通知栏上的滑动并点击通知上的事件。

参考命令:

adb shell input swipe 100 500 400 100 1000

adb shell input tap 400 400

通过更改参数,您可以使用这些命令。

于 2016-12-29T06:11:47.323 回答
0

请在另一个 stackoverflow 问题中找到好的讨论和一些选项:
我可以使用 Android 的测试框架测试状态栏通知吗?

由于您已经有代码来启动一个意图,而不是尝试重新创建 notify() 调用会做什么,尝试添加一个特殊的活动,只是为了测试在通知上实际调用 notify()。

于 2013-08-18T16:39:21.660 回答
0

Ranjith KP给您的答案包含解决方案。请注意,您需要运行应用程序的手机 root,因为这些是与 sudo 权限一起使用的命令。

这是为我工作的代码。它首先扩展通知栏(滑动命令),等待 1 秒,最后点击列表中的第一个通知。根据需要修改轴参数。

Process su = null;
try {
 su = Runtime.getRuntime().exec("su");
 su.getOutputStream().write("input swipe 270 010 270 900\n".getBytes());
 Thread.sleep(1000);
 su.getOutputStream().write("input tap 200 200\n".getBytes());
 su.getOutputStream().write("exit\n".getBytes());
 su.waitFor();
} catch (Exception e) {
 e.printStackTrace();
} finally {
 if (su != null) {
  su.destroy();
 }
}
于 2017-01-02T14:57:09.407 回答