繁体   English   中英

Android Espresso flaky withId withText test

[英]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设置文本,这只是我班级的几行:

private String  englishText;
englishTextView.setText(englishText);

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

对于空转问题,你肯定是在正确的轨道上。 在执行滑动后,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提供的此实现 ,以便对DrawerLayouts执行操作并类似地等待它们解决。 它的主旨是创建一个自定义ViewAction,用于将其中一个侦听器附加到ViewPager上,然后执行滑动并等待ViewPager报告它进入SCROLL_STATE_IDLE

注意,此实现使用反射来删除和包装一个DrawerListener从DrawerLayout如果一个连接它自己之前存在,但这不是在ViewPager情况下必要的,因为ViewPager可以有多个OnPageChangeListeners重视它。

这对我有用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM