Android Espresso flaky withId withText 测试

Android Espresso flaky withId withText test

我的这个测试大约有一半的时间有效。

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

我失败了:

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}"

因此,看起来它找到了 TextView"dog 0a",但它不会识别它。 我看过其他问题,我确实用 String 设置了文本,这只是我的 class:

中的几行
private String  englishText;
englishTextView.setText(englishText);

此外,我正在使用 allOf()。 任何帮助,将不胜感激。这个视图在 ViewPager 的视图内,所以我不确定测试是否在 ViewPager 是田园诗之前发生,但它确实说它找到了视图。

关于怠速问题,您的思路绝对正确。 Espresso 无法知道在执行滑动后 ViewPager 何时完全稳定下来。正如失败所暗示的那样,您正在寻找的视图位于视图层次结构中的某个位置,这意味着它已经被渲染,但 Espresso 检测到它还没有出现在屏幕上。这是因为 ViewPager 还没有完全定位到您感兴趣的页面上。

下一个问题是如何告诉 Espresso 等待 ViewPager 完成。这是一个有点难以解决的问题。

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

解决此问题的最佳方法是让 ViewPager 告诉我们何时完全完成设置。

如果您看一下 ViewPager 可用的一些侦听器,OnPageChangeListener 就是其中之一。 class 有几个回调方法:onPageScrolledonPageScrollStateChangedonPageSelected.

onPageSelected 听起来是个不错的选择,但如果您仔细查看此方法的文档,您会发现上面写着

/**
 * This method will be invoked when a new page becomes selected. Animation is not
 * necessarily complete.
 */

所以这是行不通的。

onPageScrollStateChanged 是另一个不错的选择。这会报告 ViewPager 中的几个状态更改,即 SCROLL_STATE_DRAGGINGSCROLL_STATE_SETTLINGSCROLL_STATE_IDLE。所以使用这个回调,我们可以检测到 ViewPager 何时空闲。

至于如何将此侦听器的实例挂接到 ViewPager 和 Espresso,您可以查看 Espresso 提供的 this implementation,用于在 DrawerLayouts 上执行操作并类似地等待它们完成。 它的要点是您创建一个自定义 ViewAction 以使用将这些侦听器之一附加到 ViewPager,然后执行滑动并等待 ViewPager 报告它进入 SCROLL_STATE_IDLE.

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

这对我有用

onView(allOf(
  withId(R.id.pagerimage),
  ChildOf(withId(R.id.viewpager), 0)
      )).check(matches(isDisplayed()))
        .perform(swipeLeft());