web-dev-qa-db-ja.com

Androidテスト:ビュー階層のルートがウィンドウフォーカスを持つのを待ちました

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()));

しかし、それらのどれも機能しません...誰かが、ララバントルートを取得する方法を教えてもらえますか?

11
Kimmy

DialogFragment内でSpinnerを使用したときに、同じエラーが発生しました。これは私のために働いていた唯一のコードです:

onView(withText(containsString("A4"))).inRoot(isPlatformPopup()).check(matches(isDisplayed()));
6
StefanTo

ダイアログポップアップにスピナーアイテム(ドロップダウンリスト)が含まれている場合にも同様の問題が発生しました。どのスピナーアイテムでもクリックを実行できず、同じエラーが発生しました。 RootMatchersでonData()メソッドを使用して解決策を見つけました。

onData(anything()).inRoot(RootMatchers.isPlatformPopup()).atPosition(1).perform(click());

atPosition()のインデックス値は、スピナーリストからのアイテムのインデックス値であることに注意してください。

4
Jamil Rahman

このエラーは、「電源オフ」や「残念ながらランチャーが停止しました」(バックグラウンドアプリがクラッシュした)などのシステムダイアログが表示され、そのダイアログが表示されているときにEspressoユニットテストを実行しようとした場合に発生する可能性があります。

Android system dialog: Unfortunately, Launcher has stopped.

画像クレジット: http://zte-iqorsupport.custhelp.com/app/answers/detail/a_id/4597/~/phone-is-getting-an-error- message%3A-残念ながら-launcher-has-stopped

テストを実行する前にシステムダイアログを閉じることで、コードで回避できます。

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] ":

Android system dialog: Launcher isn't Responding. Do you want to close it? Wait, OK

画像クレジット: https://engineering.linkedin.com/blog/2016/08/introducing-and-open-sourcing-test-butler--reliable-Android-test

このダイアログが表示されているときに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

より詳しい情報:

3
Mr-IDE

誰かの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

問題を完全に解決します。

1
Jing Li

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 &
0
denis_lor