6

Robotium フレームワークを使用して、アプリケーションのブラック ボックス テストを行っています。テスト対象のアプリは、新しいアプリケーションをインストールするたびにステータス バーに通知を送信します。その通知をクリックしたいのですが、適切な方法が見つかりませんでした。

1 つの通知を手動でクリックすると、次の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

Ranjith KPからの回答には、解決策が含まれています。これらは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 に答える