【问题标题】:Android Espresso flaky withId withText testAndroid Espresso flaky withId withText 测试
【发布时间】:2017-02-27 09:11:40
【问题描述】:

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

  @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 设置了文本,这只是我课堂上的几行:

private String  englishText;
englishTextView.setText(englishText);

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

【问题讨论】:

标签: android android-espresso


【解决方案1】:

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

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

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

解决此问题的最佳方法是让 ViewPager 告诉我们它何时完全稳定。

如果您查看一些可用于 ViewPager 的侦听器,其中之一就是 OnPageChangeListener。这个类有几个回调方法: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 .

【讨论】:

    【解决方案2】:

    这对我有用

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

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多