web-dev-qa-db-fra.com

Android: Java.lang.SecurityException: l'injection dans une autre application nécessite l'autorisation INJECT_EVENTS

Bonjour, je suis nouveau dans les tests Junit sur Android:

J'ai écrit du code de test dans le fichier MainActivityFunctionalTest.Java

MainActivityFunctionalTest.Java:

package com.example.myfirstapp2.test;

public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<Login>{

private static final String TAG = "MainActivityFunctionalTest";
private Login activity;

  public MainActivityFunctionalTest() {
    super(Login.class);
  }


  @Override
  protected void setUp() throws Exception {
     Log.d(TAG,"Set-Up");
     super.setUp();
    setActivityInitialTouchMode(false);
    activity = getActivity();
  }

  public void testStartSecondActivity() throws Exception {
      // add monitor to check for the second activity
        ActivityMonitor monitor =
            getInstrumentation().
              addMonitor(DisplayMessageActivity.class.getName(), null, false);
        //addMonitor(MainActivity.class.getName(), null, false);
     // find button and click it
        Button view = (Button) activity.findViewById(R.id.btnLogin);

        // TouchUtils handles the sync with the main thread internally
        TouchUtils.clickView(this, view);

        // to click on a click, e.g., in a listview
        // listView.getChildAt(0);

        // wait 2 seconds for the start of the activity
        DisplayMessageActivity startedActivity = (DisplayMessageActivity) 

     monitor
            .waitForActivityWithTimeout(5000);
        assertNotNull(startedActivity);

        // search for the textView
        TextView textView = (TextView) startedActivity.findViewById(R.id.Email);

        // check that the TextView is on the screen
        ViewAsserts.assertOnScreen(startedActivity.getWindow().getDecorView(),
            textView);
        // validate the text on the TextView
        assertEquals("Text incorrect", "1http://www.vogella.com", 

         textView.getText().toString());

        // press back and click again
        this.sendKeys(KeyEvent.KEYCODE_BACK);

        TouchUtils.clickView(this, view);

  }


    }

Cependant, je reçois une erreur: Java.lang.SecurityException: l'injection dans une autre application nécessite l'autorisation INJECT_EVENTS.

sur com.example.myfirstapp2.test.MainActivityFunctionalTest.testStartSecondActivity (MainActivityFunctionalTest.Java:70)

 TouchUtils.clickView(this, view);

S'il vous plaît aider

27
user3238961

J'ai eu le même problème et mon code ressemblait à ceci (pour une activité de connexion normale):

    onView(withId(R.id.username))
            .perform(new TypeTextAction("test_user"));
    onView(withId(R.id.password))
            .perform(new TypeTextAction("test123"));
    onView(withId(R.id.login)).perform(click());

La dernière ligne se bloquait avec SecurityException. Après la dernière saisie de texte, le clavier a été laissé ouvert, le prochain clic a donc été pris en compte dans une autre application.

Pour résoudre ce problème, je devais simplement fermer le clavier après avoir tapé. Je devais aussi ajouter un peu de sommeil pour m'assurer que le clavier était fermé, sinon le test serait interrompu de temps en temps. Donc, le code final ressemblait à ceci:

    onView(withId(R.id.username))
            .perform(new TypeTextAction("test_user"));
    onView(withId(R.id.password))
            .perform(new TypeTextAction("test123")).perform(closeSoftKeyboard());
    Thread.sleep(250);
    onView(withId(R.id.login)).perform(click());

Cela a bien fonctionné.

34
m.hashemian

J'ai eu le même problème et l'ajout de la méthode closeSoftKeyboard () l'a résolu pour moi.

onView(withId(R.id.view)).perform(typeText(text_to_be_typed), closeSoftKeyboard());
21
moyheen

J'étais moi-même confronté au même problème et voici ce que j'ai trouvé à propos de ce problème.

  1. En ajoutant l'autorisation INJECT_EVENTS à votre application, Android Studio fait remarquer que cette autorisation "n'est accordée qu'aux applications système". De plus, le guide de référence de Google for manifest.permissions indique que cette autorisation est "non destinée à être utilisée par des applications tierces".

    Maintenant, il est probable que votre application, comme la mienne, ne soit pas une application système. Donc, ajouter cette permission n'est certainement pas une bonne chose à faire, et heureusement, cela ne s'appliquera pas à votre projet tiers. Au moins lors du développement sur Android Studio. 

  2. Je peux voir que dans votre méthode setUp, vous avez appelé setActivityInitialTouchMode (false); Comme indiqué par Les meilleures pratiques de Google en matière de test d'interface utilisateur , lorsque vous testez l'interface utilisateur, vous devez définir le mode tactile sur true. Sinon, votre appareil de test ne pourra pas interagir avec les éléments de l'interface utilisateur.

  3. Encore une chose. Il s'agit d'un test automatisé qui émule les actions de l'utilisateur sur votre application. Si nous interagissons avec le périphérique (réel ou virtuel, cela n'a pas d'importance), nous ferons probablement en sorte que d'autres objets soient mis au point (même dans l'application testée), ce qui entraînera un conflit avec les paramètres du mode tactile définis par la méthode setUp. avait effectué.

En fin de compte, c'est ce qui m'arrivait. J'ai résolu mon problème simplement en évitant de cliquer/de toucher/d'interagir avec le périphérique sur lequel le test était en cours d'exécution.

7
lpetroli

C'est parce que votre appareil est verrouillé/toute autre boîte de dialogue ouverte est ouverte/tout ce qui empêche le test de cliquer sur le bouton. Par exemple. Si le téléphone est verrouillé, lorsque le test tente de cliquer sur le bouton, il ne le peut pas car le périphérique est verrouillé.

J'avais des problèmes sur l'émulateur car il affichait toujours "le lanceur s'était écrasé". Donc, chaque fois qu'il a essayé de cliquer sur le bouton, cela ne pouvait pas parce que la boîte de dialogue d'alerte était ouverte.

En bref. Assurez-vous que votre écran est déverrouillé et qu'aucune boîte de message n'interfère avec le test et qu'il est possible de cliquer sur un bouton.

6
Prasanth Louis

pour un appareil enraciné, ce fichier m'a beaucoup aidé . Il a:

 Injector.pressBackButton();
 Injector.pressHomeButton();
 Injector.pressPowerButton();
 Injector.showNotificationCenter();
 Injector.swipeLeftRight();
 Injector.swipeRightLeft();
 Injector.touch(x, y);

J'ai eu exactement le même problème et le même message d'erreur lors de l'exécution de tests d'espresso. L'un d'eux échouait toujours lors de l'exécution d'un paquet entier, mais il passait toujours lorsque je l'exécutais seul. La chose intéressante est que le problème s'est produit parce que j'avais ajouté la ligne suivante à l'une de mes activités dans AndroidManifest.xml:

Android:windowSoftInputMode="stateUnchanged|adjustResize"

Après avoir supprimé ou modifié la ligne ci-dessus en:

Android:windowSoftInputMode="stateHidden"

le test mentionné passait également lors de l'exécution du package entier.

0
LLL