webentwicklung-frage-antwort-db.com.de

Android Espresso: PerformException

Ich bekomme

Android.support.test.espresso.PerformException: Fehler beim Ausführen von 'send keyCode: 4, metaState: 0 key event 'on view' Animationen oder Übergänge sind auf dem Zielgerät aktiviert.

Ich habe Artikel mit dem gleichen Fehler gelesen, aber keine Antwort gefunden.

Ich habe eine einfache Android-App und versuche, einfache Dinge zu testen:

  1. RecyclerView laden 
  2. Klicken Sie auf das Element von RecyclerView
  3. Aktivität öffnen
  4. Drücken Sie die Taste in der Aktivität
  5. Zurück drücken
  6. Wiederholen Sie ab Teil 1.

Code ist extrem einfach:

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

Nach 10-50 Iterationen (zufällig) wird eine Ausnahme ausgelöst, also ist Code im Grunde richtig.

EspressoTestDev.Java:88 Zeile wo es abstürzt ist

Espresso.pressBack();

Genau nach dieser Zeile bekomme ich eine Ausnahme.

Ausnahme 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)

Sieht aus, als hätte es ein Problem mit PopupViewContainer gefunden, aber ich verwende es nicht, klicke es nicht an und ich habe keine Ahnung, wie es auf Espresso.pressBack() wirken kann

Was ich versucht habe:

  1. Hinzufügen von getInstrumentation().waitForIdleSync(); vor und nach Espresso.pressBack()

  2. Verzögerung machen, wie vorgeschlagen hier

Die Frage ist: Wie kann ich diesen Fehler vermeiden oder wie kann ich ignorieren und Iterationen in meinem Fall fortsetzen?

12
DEADMC

Animationen oder Übergänge sind auf dem Zielgerät aktiviert.

Espresso funktioniert nicht gut mit Animationen, da es zu Verzögerungen beim visuellen Status kommt. Sie müssen Animationen auf Ihrem Gerät deaktivieren. Erstens: Entwickleroptionen aktivieren :

  1. Öffnen Sie die Einstellungen-App.
  2. Blättern Sie nach unten und wählen Sie Info zum Telefon.
  3. Scrollen Sie nach unten und tippen Sie sieben Mal auf Nummer erstellen.
  4. Kehren Sie zum vorherigen Bildschirm zurück, um im unteren Bereich Entwickleroptionen zu finden.

Rufen Sie in der App Einstellungen die Entwickleroptionen auf. Schalten Sie im Bereich Drawing alle folgenden Optionen auf Animation Off um:

  • Fensteranimationsskala
  • Übergangsanimationsskala
  • Animationsdauer-Skala
17
Michael Dodd

stellen Sie sicher, dass das Steuerelement, mit dem Sie arbeiten möchten, sichtbar ist. das hat für mich funktioniert. füge "scrollTo ()" hinzu

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

Wenn Sie den Emulator über Konsole öffnen möchten, müssen Sie zusätzlich zur akzeptierten Antwort die folgenden Befehle hinzufügen: 

    - 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

Ein einfacher try catch ..__, bei dem Sie die Ausnahme nur dann abholen, wenn es sich um eine PerformException handelt.

Alternativ können Sie die 500 Artikel per Code in Ihren Warenkorb legen und dann einen weiteren durch UI-Test hinzufügen.

0
Peter J