Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Espresso: return boolean if view exists

I am trying to check to see if a view is displayed with Espresso. Here is some pseudo code to show what I am trying:

if (!Espresso.onView(withId(R.id.someID)).check(doesNotExist()){    // then do something  } else {    // do nothing, or what have you  } 

But my problem is .check(doesNotExist()) does not return boolean. It is just an assertion. With UiAutomator I was able to just do something like so:

 if (UiAutomator.getbyId(SomeId).exists()){       .....    } 
like image 698
Chad Bingham Avatar asked Dec 27 '13 20:12

Chad Bingham


1 Answers

Conditional logic in tests is undesirable. With that in mind, Espresso's API was designed to guide the test author away from it (by being explicit with test actions and assertions).

Having said that, you can still achieve the above by implementing your own ViewAction and capturing the isDisplayed check (inside the perform method) into an AtomicBoolean.

Another less elegant option - catch the exception that gets thrown by failed check:

    try {         onView(withText("my button")).check(matches(isDisplayed()));         //view is displayed logic     } catch (NoMatchingViewException e) {         //view not displayed logic     } 

Kotlin version with an extension function:

    fun ViewInteraction.isDisplayed(): Boolean {         try {             check(matches(ViewMatchers.isDisplayed()))             return true         } catch (e: NoMatchingViewException) {             return false         }     }      if(onView(withText("my button")).isDisplayed()) {         //view is displayed logic     } else {         //view not displayed logic     } 
like image 120
ValeraZakharov Avatar answered Sep 21 '22 08:09

ValeraZakharov