私は得ています
Android.support.test.espresso.PerformException:「キーコードを送信:4、metaState:0キーイベント」の実行中にエラーが発生しました。「アニメーションまたは遷移がターゲットデバイスで有効になっています。
同じエラーの記事を読みましたが、答えが見つかりませんでした。
私は簡単なAndroidアプリを持っています、そして私は簡単なことをテストしようとします:
コードは非常に簡単です:
_@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()
を追加する
提案どおりに遅延を作成 こちら
問題は:どうすればいいかavoidこのエラーまたはどうすればいいかignoreそして私の場合は反復を続けますか?
ターゲットデバイスでアニメーションまたはトランジションが有効になっています。
エスプレッソは、視覚的な状態の遅延が原因で、アニメーションではうまく機能しません。デバイスでアニメーションを無効にする必要があります。まず、 開発者オプションを有効にする :
設定アプリから開発者オプションにアクセスし、Drawingセクションで、以下のオプションをすべてAnimation Off:
受け入れられた答えに加えて、エミュレータコンソールからを開きたい場合は、次のコマンドを追加する必要があります。
- 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 &
使用するコントロールが表示されていることを確認してください。これは私のために働いた。 「scrollTo()」を追加
onView(...).perform(scrollTo(), click());
簡単な試着。 PerformExceptionである場合にのみ例外をピックアップします。
Alternativはコードで500個のアイテムをショッピングカートに追加し、UIテストで1個追加します。