我得到了
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.
我有简单的Android应用程序,我尝试测试简单的事情:
>加载RecyclerView
>单击RecyclerView的项目
>打开活动
>按活动中的按钮
>按回
>从第1部分开始重复.
代码非常简单:
@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; }
它会在10-50次迭代后(随机)抛出异常,所以基本上代码是正确的.
EspressoTestDev.java:88行崩溃的地方
Espresso.pressBack();
正是在这一行之后,我才得到例外.
异常堆栈跟踪:
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)
看起来它发现PopupViewContainer的问题,但我不使用它,不要点击它,我不知道它如何影响Espresso.pressBack()
我尝试了什么:
>添加getInstrumentation().waitForIdleSync();在Espresso.pressBack()之前和之后
>按照建议here进行延迟
问题是:如何避免此错误或如何在我的情况下忽略并继续迭代?