web-dev-qa-db-ja.com

Android Espresso:PerformException

私は得ています

Android.support.test.espresso.PerformException:「キーコードを送信:4、metaState:0キーイベント」の実行中にエラーが発生しました。「アニメーションまたは遷移がターゲットデバイスで有効になっています。

同じエラーの記事を読みましたが、答えが見つかりませんでした。

私は簡単なAndroidアプリを持っています、そして私は簡単なことをテストしようとします:

  1. RecyclerViewのロード
  2. RecyclerViewのアイテムをクリックします
  3. オープンアクティビティ
  4. アクティビティ内のボタンを押す
  5. 押し戻す
  6. パート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()にどのように影響するかわかりません

試したこと:

  1. getInstrumentation().waitForIdleSync();の前後にEspresso.pressBack()を追加する

  2. 提案どおりに遅延を作成 こちら

問題は:どうすればいいかavoidこのエラーまたはどうすればいいかignoreそして私の場合は反復を続けますか?

18
Andrey Danilov

ターゲットデバイスでアニメーションまたはトランジションが有効になっています。

エスプレッソは、視覚的な状態の遅延が原因で、アニメーションではうまく機能しません。デバイスでアニメーションを無効にする必要があります。まず、 開発者オプションを有効にする

  1. 設定アプリを開きます。
  2. 一番下までスクロールし、[電話について]を選択します。
  3. 一番下までスクロールして、ビルド番号を7回タップします。
  4. 前の画面に戻って、下部の開発者オプションを見つけます。

設定アプリから開発者オプションにアクセスし、Drawingセクションで、以下のオプションをすべてAnimation Off

  • ウィンドウアニメーションスケール
  • 遷移アニメーションスケール
  • アニメーターの継続時間スケール
27
Michael Dodd

受け入れられた答えに加えて、エミュレータコンソールからを開きたい場合は、次のコマンドを追加する必要があります。

    - 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 &
5
Simon

使用するコントロールが表示されていることを確認してください。これは私のために働いた。 「scrollTo()」を追加

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

簡単な試着。 PerformExceptionである場合にのみ例外をピックアップします。

Alternativはコードで500個のアイテムをショッピングカートに追加し、UIテストで1個追加します。

0
Peter J