Android Espresso片状withId withText测试

flo*_*cca 3 android android-espresso

我有这项测试的时间大约是一半。

  @Test
  public void thirdSwipe() {
    onView(withId(R.id.pager)).perform(swipeLeft());
    onView(withId(R.id.pager)).perform(swipeLeft());
    onView(withId(R.id.pager)).perform(swipeLeft());
    onView(allOf(withId(R.id.hint_english_text), withText("dog 0a"))).check(matches(isDisplayed()));
  }
Run Code Online (Sandbox Code Playgroud)

我得到这个失败:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'is displayed on the screen to the user' doesn't match the selected view.
Expected: is displayed on the screen to the user
Got: "TextView{id=2131427358, res-name=hint_english_text, visibility=VISIBLE, width=624, height=62, has-focus=false, has-focusable=false, 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=20.0, y=20.0, text=dog 0a, input-type=0, ime-target=false, has-links=false}"
Run Code Online (Sandbox Code Playgroud)

因此,看起来好像找到了TextViewwith "dog 0a",但无法识别它。我看了其他问题,并用设置了文本String,这只是我课堂上的几行:

private String  englishText;
englishTextView.setText(englishText);
Run Code Online (Sandbox Code Playgroud)

另外,我正在使用allOf()。任何帮助,将不胜感激。该视图位于ViewPager的视图内,因此我不确定测试是否在ViewPagerid 之前进行,但是它确实说它找到了视图。

小智 5

您肯定在怠速问题上走了正确的路。在执行滑动后,Espresso无法知道ViewPager何时完全稳定。正如失败所暗示的那样,您要查找的视图位于视图层次结构中的某个位置,这意味着它已被渲染,但是Espresso正在检测它尚未显示在屏幕上。这是因为ViewPager尚未完全稳定在您感兴趣的页面上。

下一个问题是如何告诉Espresso等待ViewPager解决。这是一个很难解决的问题。

消除此问题可能性的一种方法是执行Thread.sleep,这将迫使Espresso等待一段时间,并希望ViewPager在等待结束之前解决。虽然这通常可以在足够长的睡眠时间下工作,但这并不理想,因为这会增加不必要的测试时间。

最好的方法是让ViewPager告诉我们何时完全解决。

如果您查看一些可用于ViewPager的侦听器,其中的一个是OnPageChangeListener。这个类有几个回调方法:onPageScrolledonPageScrollStateChanged,和onPageSelected

onPageSelected 听起来像是一个不错的选择,但是如果您仔细阅读该方法的文档,您会发现它说

/**
 * This method will be invoked when a new page becomes selected. Animation is not
 * necessarily complete.
 */
Run Code Online (Sandbox Code Playgroud)

所以这行不通。

onPageScrollStateChanged是另一个很好的候选人。该报告在ViewPager,即一对夫妇的状态变化SCROLL_STATE_DRAGGINGSCROLL_STATE_SETTLINGSCROLL_STATE_IDLE。因此,使用此回调,我们可以检测到ViewPager何时变为空闲状态。

关于如何将此侦听器的实例与ViewPager和Espresso挂钩,您可以查看Espresso提供的此实现,以在DrawerLayouts上执行操作并类似地等待它们解决。这样做的主要目的是创建一个自定义ViewAction来使用,它将这些侦听器之一附加到ViewPager上,然后执行滑动操作并等待ViewPager报告它已进入SCROLL_STATE_IDLE

请注意,此实现使用反射DrawerListener从DrawerLayout中移除并包装(如果存在)在附加它自己的之前,但是在ViewPager的情况下这不是必需的,因为ViewPager可以有多个OnPageChangeListeners附件。