Espresso:如果视图存在,则返回布尔值

我正在尝试查看是否使用Espresso显示视图。 这里是一些伪代码来显示我正在尝试:

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

但我的问题是.check(doesNotExist())不返回布尔值。 这只是一个断言。 用UiAutomator,我能够做到这样的事情:

  if (UiAutomator.getbyId(SomeId).exists()){ ..... } 

Solutions Collecting From Web of "Espresso:如果视图存在,则返回布尔值"

我们需要这个function,最后我在下面实现它:

https://github.com/marcosdiez/espresso_clone

 if(onView(withText("click OK to Continue")).exists()){ doSomething(); } else { doSomethingElse(); } 

我希望这对你有用。

testing中的条件逻辑是不可取的 。 考虑到这一点,Espresso的API旨在引导testing作者远离它(通过明确的testing操作和断言)。

话虽如此,你仍然可以通过实现你自己的ViewAction并将isDisplayed检查(在perform方法中)​​捕获到AtomicBoolean来实现上述目的。

另一个不太优雅的选项 – 捕获失败检查引发的exception:

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

你也检查下面的代码。 如果显示视图,则会点击,否则会传递。

 onView(withText("OK")).withFailureHandler(new FailureHandler() { @Override public void handle(Throwable error, Matcher<View> viewMatcher){ } }).check(matches(isDisplayed())).perform(customClick()); 

我想模仿UIAutomator,你可以这样做:
不过,我build议重新思考你的方法是没有条件的。

 ViewInteraction view = onView(withBlah(...)); // supports .inRoot(...) as well if (exists(view)) { view.perform(...); } @CheckResult public static boolean exists(ViewInteraction interaction) { try { interaction.perform(new ViewAction() { @Override public Matcher<View> getConstraints() { return any(View.class); } @Override public String getDescription() { return "check for existence"; } @Override public void perform(UiController uiController, View view) { // no op, if this is run, then the execution will continue after .perform(...) } }); return true; } catch (AmbiguousViewMatcherException ex) { // if there's any interaction later with the same matcher, that'll fail anyway return true; // we found more than one } catch (NoMatchingViewException ex) { return false; } catch (NoMatchingRootException ex) { // optional depending on what you think "exists" means return false; } } 

没有分支的情况也exists ,实现起来很简单:

 onView(withBlah()).check(exists()); // the opposite of doesNotExist() public static ViewAssertion exists() { return matches(anything()); } 

虽然大部分时间值得检查matches(isDisplayed())

基于Dhiren Mudgil的回答,我写下了以下方法:

 public static boolean viewIsDisplayed(int viewId) { final boolean[] isDisplayed = {true}; onView(withId(viewId)).withFailureHandler(new FailureHandler() { @Override public void handle(Throwable error, Matcher<View> viewMatcher) { isDisplayed[0] = false; } }).check(matches(isDisplayed())); return isDisplayed[0]; } 

我正在使用它来帮助确定当前显示ViewFlipper中的哪个视图。