Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Espresso: PerformException

I`m getting

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.

I read articles with same error but didnt find answer.

I have simple android app and I try to test simple thing:

  1. Load RecyclerView
  2. Click on RecyclerView`s item
  3. Open Activity
  4. Press button inside Activity
  5. Press back
  6. Repeat from part 1.

Code is extremely easy:

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

It throws exception after 10-50 iterations (randomly) so basically code is right.

EspressoTestDev.java:88 line where it crashes is

Espresso.pressBack(); 

Exactly after this line I`m getting 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) 

Looks like it found problem with PopupViewContainer but I dont use it, dont click it and I have no idea how can it impact to Espresso.pressBack()

What I tried:

  1. Adding getInstrumentation().waitForIdleSync(); before and after Espresso.pressBack()

  2. Making delay as suggested here

The question is: how can I avoid this error or how can I ignore and continue iterations in my case?

like image 702
Andrey Danilov Avatar asked May 16 '17 15:05

Andrey Danilov


1 Answers

Animations or transitions are enabled on the target device.

Espresso doesn't work well with animations due to the visual state delays they introduce. You need to disable animations on your device. Firstly, enable developer options:

  1. Open the Settings app.
  2. Scroll to the bottom and select About phone.
  3. Scroll to the bottom and tap Build number 7 times.
  4. Return to the previous screen to find Developer options near the bottom.

Access Developer Options from Settings app, and under the Drawing section, switch all of the following options to Animation Off:

  • Window animation scale
  • Transition animation scale
  • Animator duration scale
like image 189
Michael Dodd Avatar answered Oct 03 '22 01:10

Michael Dodd