使用 Espresso 在 ViewPager 中查找视图(AmbiguousViewMatcherException)

skb*_*hmn 1 android listview android-fragments android-viewpager android-espresso

我有一个 ViewPager,它一次只在屏幕上显示一个片段。该片段有一个 recyclerView,其中填充了由一个图像和两个 textView 组成的列表项。我需要选择项目并根据显示的文本执行单击。

我的 viewPage 有 Id pager,recyclerView 是listview,我正在使用 cardView 小部件,它有一个名为的相对布局cardContainer,其中有一个nickNname我感兴趣的 textView 。

Espresso 似乎只能识别pager但在视图层次结构中找不到任何其他 Id。我如何访问nickName或基本上访问viewPager 或片段中的任何其他视图?

我尝试了以下方法:

        ViewInteraction listviewInteraction = onView (allOf(withId(R.id.pager)));
    listviewInteraction.check(matches(hasDescendant(withId(R.id.listview))));
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,因为寻呼机没有任何孩子

    Expected: has descendant: with id: 2131689666
Got: "ViewPager{id=2131689659, res-name=pager, visibility=VISIBLE, width=1080, height=1533, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=144.0, child-count=0}"
Run Code Online (Sandbox Code Playgroud)

我还尝试了几种不同的方法,类似于此处发布的方法,但 Espresso 找不到listviewnickname

我怎样才能找到视图nickName

更新:

我又运行了一些测试,当 Espresso 运行测试时,viewPager 似乎从不加载片段。我曾尝试使用Thread.sleep()等待一段时间,但没有运气。我看到 listView 只填充了一段时间,然后寻呼机变为空白并且测试失败,因为它找不到任何其他视图。关于可能导致这种情况的任何想法?

更新 2:

寻呼机现在正常加载,但由于 AmbiguousViewMatcherException,Espresso 无法识别 listview 或 cardContainer 而只能识别寻呼机。viewPager 中有四个片段,但屏幕上只显示一个片段。我的代码如下:

ViewInteraction listviewInteraction = onView (allOf(withId(R.id.pager)));
    listviewInteraction.check(matches(isDisplayed()));
    onView(allOf(withId(R.id.listview), isDisplayed())).check(matches(isDisplayed()));
Run Code Online (Sandbox Code Playgroud)

视图层次结构中有两个匹配项。如果我不在 viewMatcher 中使用 isDisplayed() 方法,那么我将获得四个片段的四个匹配项。我该如何解决这个问题?

skb*_*hmn 5

屏幕外显然有一个列表视图,即使它不可见。匹配器isDisplayed()还考虑了屏幕外的视图。使用isCompletelyDisplayed()固定的AmbiguousViewMatcherException.