web-dev-qa-db-fra.com

Android Espresso: PerformException

Je suis

Android.support.test.espresso.PerformException: erreur lors de l'exécution de 'send keyCode: 4, metaState: 0 événement clé 'à la vue' Animations ou transitions sont activés sur le périphérique cible.

J'ai lu des articles avec la même erreur mais je n'ai pas trouvé de réponse.

J'ai une application Android simple et j'essaie de tester une chose simple:

  1. Charger le recycleurVoir 
  2. Cliquez sur l'article de RecyclerView
  3. Activité ouverte
  4. Appuyez sur le bouton à l'intérieur de l'activité
  5. Refouler
  6. Répétez à partir de la partie 1.

Code est extrêmement facile:

@Test
public void getOver500Products() {
    onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
    onView(withId(R.id.layout2)).perform(click());
    clickExactItem(2);
    for (int i = 0; i< 501; i++) {
        clickRandomItem();
        addedToCart();
        Espresso.pressBack();
    }
}

public void clickRandomItem() {
    try {
        int x = getRandomRecyclerPosition(R.id.list);
        clickExactItem(x);
    } catch (NoMatchingViewException e) {
    }
}

public void clickExactItem(int position) {
    onView(withId(R.id.list))
            .perform(RecyclerViewActions
                    .actionOnItemAtPosition(position, click()));
}

public boolean addedToCart() {
    try {
        onView(withId(R.id.product_add_in_cart)).perform(click());
    } catch (NoMatchingViewException e) {
        return false;
    }
    return true;
}

Il lève une exception après 10 à 50 itérations (au hasard), donc le code est correct.

EspressoTestDev.Java:88 ligne où il se bloque est

Espresso.pressBack();

Exactement après cette ligne, je reçois une exception.

Exception stacktrace:

Android.support.test.espresso.PerformException: Error performing 'send keyCode: 4, metaState: 0 key event' on view 'Animations or transitions are enabled on the target device.

is a root view.'.
at Android.support.test.espresso.PerformException$Builder.build(PerformException.Java:83)
at Android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.Java:80)
at Android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.Java:56)
at Android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.Java:184)
at Android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.Java:115)
at Android.support.test.espresso.ViewInteraction.perform(ViewInteraction.Java:87)
at Android.support.test.espresso.Espresso.pressBack(Espresso.Java:189)
at com.app.myapp.EspressoTestDev.getOver500Products(EspressoTestDev.Java:88)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
at Android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.Java:55)
at Android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.Java:270)
at org.junit.rules.RunRules.evaluate(RunRules.Java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runners.Suite.runChild(Suite.Java:128)
at org.junit.runners.Suite.runChild(Suite.Java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:115)
at Android.support.test.internal.runner.TestExecutor.execute(TestExecutor.Java:59)
at Android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.Java:262)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:1851)
Caused by: Java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
is displayed on the screen to the user
Target view: "PopupViewContainer{id=-1, visibility=VISIBLE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}"
at Android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.Java:138)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:422)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
at Android.os.Handler.handleCallback(Handler.Java:815)
at Android.os.Handler.dispatchMessage(Handler.Java:104)
at Android.os.Looper.loop(Looper.Java:194)
at Android.app.ActivityThread.main(ActivityThread.Java:5549)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:964)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:759)

On dirait qu'il a rencontré un problème avec PopupViewContainer mais je ne l'utilise pas, ne cliquez pas dessus et je ne sais pas comment cela peut avoir un impact sur Espresso.pressBack()

Ce que j'ai essayé:

  1. Ajout de getInstrumentation().waitForIdleSync(); avant et après Espresso.pressBack()

  2. Faire le retard comme suggéré ici

La question est: comment puis-je éviter cette erreur ou comment puis-je ignorer et continuer les itérations dans mon cas?

12
DEADMC

Les animations ou les transitions sont activées sur le périphérique cible.

L'espresso ne fonctionne pas bien avec les animations en raison des retards visuels qu'elles introduisent. Vous devez désactiver les animations sur votre appareil. Tout d’abord, active les options du développeur :

  1. Ouvrez l'application Paramètres.
  2. Faites défiler vers le bas et sélectionnez À propos du téléphone.
  3. Faites défiler vers le bas et appuyez sur Construire le numéro 7 fois.
  4. Retournez à l'écran précédent pour trouver les options de développement près du bas.

Accédez à Options du développeur depuis l'application Paramètres et sous la section Drawing, définissez toutes les options suivantes sur Animation désactivé:

  • Échelle d'animation de fenêtre
  • Échelle d'animation de transition
  • Échelle de durée de l'animateur
17
Michael Dodd

assurez-vous que le contrôle avec lequel vous voulez travailler est visible. cela a fonctionné pour moi. ajouter "scrollTo ()"

onView(...).perform(scrollTo(), click());
1
Atupele4

Outre la réponse acceptée, si vous souhaitez ouvrir l'émulateur depuis la console , vous devez ajouter les commandes suivantes: 

    - adb Shell settings put global window_animation_scale 0 &
    - adb Shell settings put global transition_animation_scale 0 &
    - adb Shell settings put global animator_duration_scale 0 &
0
Simon

Un simple essai catch . Où vous ne prenez l'exception que s'il s'agit d'une PerformException.

Vous pouvez également ajouter les 500 articles à votre panier par code, puis 1 test supplémentaire par interface utilisateur.

0
Peter J