Android Uiテストで、ダイアログのスピナーアイテムをクリックしたいのですが、次のエラーが表示されます。
va.lang.RuntimeException: Waited for the root of the view hierarchy to have window focus and not be requesting layout for over 10 seconds. If you specified a non default root matcher, it may be picking a root that never takes focus. Otherwise, something is seriously wrong. Selected Root:
Root{application-window-token=Android.view.ViewRootImpl$W@2dac97c7, window-token=Android.view.ViewRootImpl$W@2dac97c7, has-window-focus=false, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) sim=#10 ty=1 fl=#81810100 pfl=0x8 wanim=0x1030461 surfaceInsets=Rect(0, 0 - 0, 0) mwfl=0x0}, decor-view-string=MultiPhoneDecorView{id=-1, visibility=VISIBLE, width=1600, height=2560, has-focus=true, has-focusable=true, has-window-focus=false, 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}}
. All Roots:
Root{application-window-token=Android.view.ViewRootImpl$W@3c913e1, window-token=Android.view.ViewRootImpl$W@21b23506, has-window-focus=true, layout-params-type=1002, layout-params-string=WM.LayoutParams{(310,600)(722x480) gr=#10000033 sim=#1 ty=1002 fl=#1860200 fmt=-3 wanim=0x10302db surfaceInsets=Rect(0, 0 - 0, 0) mwfl=0x0}, decor-view-string=PopupViewContainer{id=-1, visibility=VISIBLE, width=722, height=480, has-focus=true, has-focusable=true, 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}}
Root{application-window-token=Android.view.ViewRootImpl$W@3c913e1, window-token=Android.view.ViewRootImpl$W@3c913e1, has-window-focus=false, layout-params-type=2, layout-params-string=WM.LayoutParams{(0,0)(wrapxwrap) gr=#11 sim=#20 ty=2 fl=#1800002 pfl=0x8 fmt=-3 wanim=0x1030462 surfaceInsets=Rect(0, 0 - 0, 0) mwfl=0x10}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=1136, height=1058, has-focus=true, has-focusable=true, has-window-focus=false, 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}}
Root{application-window-token=Android.view.ViewRootImpl$W@2dac97c7, window-token=Android.view.ViewRootImpl$W@2dac97c7, has-window-focus=false, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) sim=#10 ty=1 fl=#81810100 pfl=0x8 wanim=0x1030461 surfaceInsets=Rect(0, 0 - 0, 0) mwfl=0x0}, decor-view-string=MultiPhoneDecorView{id=-1, visibility=VISIBLE, width=1600, height=2560, has-focus=true, has-focusable=true, has-window-focus=false, 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.base.RootViewPicker.get(RootViewPicker.Java:99)
at Android.support.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.Java:69)
at Android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.Java:23)
at Android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.Java:9)
at Android.support.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.Java:68)
at Android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.Java:120)
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:739)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:145)
at Android.app.ActivityThread.main(ActivityThread.Java:6117)
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:1399)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1194)
私が試してみました
onData(allOf(is(instanceOf(String.class)),containsString("A4"))).inRoot(isPlatformPopup()).perform(click());
そして
onView(withText(containsString("A4"))).inRoot(isFocusable()).check(matches(isDisplayed()));
そして
onView(withText(containsString("A4"))).inRoot(withDecorView(not(getActivity().getWindow().getDecorView()))).check(matches(isDisplayed()));
しかし、それらのどれも機能しません...誰かが、ララバントルートを取得する方法を教えてもらえますか?
DialogFragment内でSpinnerを使用したときに、同じエラーが発生しました。これは私のために働いていた唯一のコードです:
onView(withText(containsString("A4"))).inRoot(isPlatformPopup()).check(matches(isDisplayed()));
ダイアログポップアップにスピナーアイテム(ドロップダウンリスト)が含まれている場合にも同様の問題が発生しました。どのスピナーアイテムでもクリックを実行できず、同じエラーが発生しました。 RootMatchersでonData()メソッドを使用して解決策を見つけました。
onData(anything()).inRoot(RootMatchers.isPlatformPopup()).atPosition(1).perform(click());
atPosition()のインデックス値は、スピナーリストからのアイテムのインデックス値であることに注意してください。
このエラーは、「電源オフ」や「残念ながらランチャーが停止しました」(バックグラウンドアプリがクラッシュした)などのシステムダイアログが表示され、そのダイアログが表示されているときにEspressoユニットテストを実行しようとした場合に発生する可能性があります。
テストを実行する前にシステムダイアログを閉じることで、コードで回避できます。
MyActivity activityUnderTest = activityTestRule.getActivity();
activityUnderTest.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
または、adbを使用してコマンドラインでブロードキャストを送信します。
adb Shell am broadcast -a Android.intent.action.CLOSE_SYSTEM_DIALOGS
もう1つの原因は、バックグラウンドアプリがフリーズしている( [〜#〜] anr [〜#〜] )か、実行速度が遅い場合で、「アプリケーションが応答していません。実行しますか?」というシステムダイアログが表示されます。閉じますか?[待つ] [OK] ":
このダイアログが表示されているときにEspressoテストを実行しようとすると、すべて失敗し、エラーが表示されます。
このダイアログをプログラムで閉じる方法はありません。ただし、コマンドラインでadbを使用して、 画面タップ または キーストローク を送信して閉じることができます。例えば:
# On a 320x480 screen, click at screen location [x=233,y=293] to tap an "OK" dialog button.
# Just in case there is a "Launcher isn't responding" system dialog.
adb Shell input tap 233 293
または
# Send keystroke Arrow Right
sleep 3; adb Shell input keyevent 22
# Send keystroke Arrow Right again
sleep 3; adb Shell input keyevent 22
# Send keystroke Enter to press a button on the dialog
sleep 3; adb Shell input keyevent 66
より詳しい情報:
誰かのTravisビルドに発生した場合に備えて(まったく同じログで)。 this を確認してください。
まったく同じ問題があり、より低いターゲットバージョン(19)でavdを作成することで解決しました。
私が試したがうまくいかなかったこと:
UIテストにunlockScreen()
@Before
メソッドを追加します。
adb Shell input keyevent 82 &
の追加/削除。
異なるemulator
コマンドオプション-no-skin
または-no-audio
または-no-window
を削除します。今、私はそこに-no-window
を持っています。
最後に、
echo no | Android create avd --force -n test -t Android-24 --abi armeabi-v7a
に
echo no | Android create avd --force -n test -t Android-19 --abi armeabi-v7a
問題を完全に解決します。
travis.ymlのビルドツールを更新するだけです:
.travis.yml
:これが必要ですbefore_install: - echo yes | Android update sdk --all --filter build-tools-26.0.1 --no-ui --force
.travis.yml
でこれを歓迎します:script: echo no | Android create avd --force -n test -t Android-22
--abi armeabi-v7a emulator -avd test -no-audio -no-window &
Android-wait-for-emulator
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 &
adb Shell input keyevent 82 &