android-test: Toast message assertions not working with android 11 and target sdk 30
Description
On the app I am testing there are a number of toast messages that I check to make sure toasts are displayed with correct text. My espresso tests started to fail when using Android 11 and SDK30.
Steps to Reproduce
I have a simple check where I try to check the text appears on screen for a toast.
onView(withText(R.string.toast_text)).inRoot( withDecorView(not(activityRule.activity.window.decorView))) .check(matches(isDisplayed()))
I have also tried with a Custom toast matcher without any luck
fun onToast(
text: Int,
@IntRange(from = 1) maximumRetries: Int = MAX_RETRIES
): ViewInteraction = onView(withText(text)).inRoot(ToastMatcher(maximumRetries))
class ToastMatcher(private val maximumRetries: Int) : TypeSafeMatcher<Root>() {
private var currentFailures: Int = 0
override fun describeTo(description: Description?) {
description?.appendText("no toast found after")
}
override fun matchesSafely(item: Root?): Boolean {
val type: Int? = item?.windowLayoutParams?.get()?.type
if(TYPE_TOAST == type || TYPE_APPLICATION_OVERLAY == type) {
val windowToken = item.decorView.windowToken
val appToken = item.decorView.applicationWindowToken
if(windowToken == appToken) {
return true
}
}
return ++currentFailures >= maximumRetries
}
}
onToast(R.string.toast_text) .check(matches(isDisplayed()))
Expected Results
Tests pass. This works as expected when using OS lower than android 11. It also works as expected when using android 11 and sdk 29. I also tried updating the version of androidx and espresso to the latest version 3.3.0 and 1.3.0 but this did not make any difference.
Actual Results
Result when using withDecorView
androidx.test.espresso.NoMatchingRootException: Matcher 'with decor view not <DecorView@5ae48a6[TestActivity]>' did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@1337585, window-token=android.view.ViewRootImpl$W@1337585, has-window-focus=true, layout-params-type=1, layout-params-string={(0,0)(fillxfill) sim={state=hidden} ty=BASE_APPLICATION wanim=0x10302fe fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED fitSides=}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=1080, height=2160, has-focus=false, 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, layout-params={(0,0)(fillxfill) sim={state=hidden} ty=BASE_APPLICATION wanim=0x10302fe fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED fitSides=}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}}] at dalvik.system.VMStack.getThreadStackTrace(Native Method) at java.lang.Thread.getStackTrace(Thread.java:1736) at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:96) at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59) at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:322) at androidx.test.espresso.ViewInteraction.check(ViewInteraction.java:306)
Result when using ToastMatcher
androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with string from resource id: <2131755255>[toast_text] value: Toast Text. If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:com.squareup.timessquare.CalendarPickerView{1af12d7 VFED.VC.. ........ 0,0-1080,1657 #7f09010e app:id/calendarPv} View Hierarchy: +>DecorView{id=-1, visibility=VISIBLE, width=1080, height=2160, has-focus=false, 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, layout-params={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302fe fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS pfl=FORCE_DRAW_STATUS_BAR_BACKGROUND FIT_INSETS_CONTROLLED fitSides=}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3} |
AndroidX Test and Android OS Versions
AndroidX Test: 1.2.0 Espresso: 3.2.0 Android OS: Android 11 (API 30)
About this issue
- Original URL
- State: open
- Created 4 years ago
- Reactions: 59
- Comments: 29 (1 by maintainers)
Commits related to this issue
- fix fixed issues found on project review: 1. There is no error message when the location permission is denied by the user. 2. The user can't select a random location on the map. 3. Device location is... — committed to artem-benda/nd940-todo-list-app by deleted user 3 years ago
- ##Refining## -Added condition in RemindersActivityTest.kt to run the Toast test only on devices with api less than 30 as in api 30 and later Toasts can't be tested problem reference: https://github.co... — committed to omarAhmed22600/Location-Reminder by omarAhmed22600 a year ago
- display missing amount as error instead of toast message toast messages aren't testable anymore see https://github.com/android/android-test/issues/803 — committed to djbrown/gnucash-android by djbrown a year ago
- Clean imports for Espresso utility class FIXME: It seems there are some issues with Toast assertion with API 30 and upper -> https://github.com/android/android-test/issues/803 — committed to maugagneur/vigik by maugagneur 2 years ago
So, we are unable to test toasts now? Is there a reason for that? Security issues?
Hi @ralf-at-android
When I write the test to verify Toast is displayed like this:
Espresso.onView(withText(“Toast message here”)).inRoot(withDecorView(not(decorView))).check(matches(isDisplayed()))
It work fine in Android lower Android 11. But from Android 11 I have an exception like this:
androidx.test.espresso.NoMarchingRootException: Matcher ‘with decor view not <DecorView@17028cf[MyActivity]>’ did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@3daab3f, window-token=android.view.ViewRootImpl$W@3daab3f, has-window-focus=true, layout-params-type=1, layout-params-string={(0,0)(fillxfill) ty=BASE_APPLICATION wanim=0x10302fe
Thank you for your idea about that!
Maybe, but you’re not having Toasts in all of your tests hopefully, right? 😅
Thanks a ton, @djbrown 😃 I was spending days with the Toast. Now SnackBar worked like a charm!
@clarabez It didn’t work for me in Android 12 , the assertion always Fails :\
Ops, sorry, it was private. Now it is public. Link here.
@TWiStErRob Yes I have used Toast as less as possible because of the testing issue. But there are some cases that can only be verified using toast . I am stuck in that 😃