[英]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
。 这个类有几个回调方法: onPageScrolled
, onPageScrollStateChanged
和onPageSelected
。
onPageSelected
听起来像是一个很好的候选人,但如果你仔细看看这个方法的文档,你会发现它说
/**
* This method will be invoked when a new page becomes selected. Animation is not
* necessarily complete.
*/
所以这不会起作用。
onPageScrollStateChanged
是另一个好的候选人。 这会报告ViewPager中的一些状态更改,即SCROLL_STATE_DRAGGING
, SCROLL_STATE_SETTLING
和SCROLL_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.