提问者:小点点

如何断言可滚动的TabLayout当前正在显示某个选项卡?


我正在显示TabLayout并将其连接到ViewPager2对象(通过TabLayoutMediator类)。TabLayout具有可滚动的tabMode,并且包含的选项卡数量超过了一次屏幕的容量。我想断言当我的活动或片段呈现时,某个选项卡是可见的并被选中的。我该如何做到这一点?


共2个答案

匿名用户

您可以为选项卡创建自定义Matcher

fun withTab(title: String) = withTab(equalTo(title))

fun withTab(title: Matcher<String>): Matcher<View> {
    return object : BoundedMatcher<View, TabView>(TabView::class.java) {
        override fun describeTo(description: Description) {
            description.appendText("with tab: ")
            title.describeTo(description)
        }

        override fun matchesSafely(item: TabView): Boolean {
            return title.matches(item.tab?.text)
        }
    }
}

然后要查找当前是否显示标签,您可以方便地使用以下操作:

onView(withTab("tab text")).check(matches(isCompletelyDisplayed()))

如果您想断言当前是否选择了选项卡,您可以调整matchesSafely以使用item.tab?.isSelected,或者简单地创建一个新的匹配器。

但是,如果您的屏幕上有多个TabLayout,那么您可能需要将匹配器与isDescendantOfAwith P家长组合。

匿名用户

多亏了Aaron的回答,我已经用TabText(text:)和isSelectedTab()函数定义了,我的测试现在阅读更流畅了,如下所示:

onView(withTabText("SomeText")).check(matches(isCompletelyDisplayed()))
onView(withTabText("SomeText")).check(matches(isSelectedTab()))

isSelectedTab()函数的实现如下:

/**
 * @return A matcher that matches a [TabLayout.TabView] which is in the selected state.
 */
fun isSelectedTab(): Matcher<View> =
    object : BoundedMatcher<View, TabLayout.TabView>(TabLayout.TabView::class.java) {

        override fun describeTo(description: Description) {
            description.appendText("TabView is selected")
        }

        override fun matchesSafely(tabView: TabLayout.TabView): Boolean {
            return tabView.tab?.isSelected == true
        }
    }

withTabText(text:)函数实现如下:

/**
 * @param text The text to match on.
 * @return A matcher that matches a [TabLayout.TabView] which has the given text.
 */
fun withTabText(text: String): Matcher<View> =
    object : BoundedMatcher<View, TabLayout.TabView>(TabLayout.TabView::class.java) {

        override fun describeTo(description: Description) {
            description.appendText("TabView with text $text")
        }

        override fun matchesSafely(tabView: TabLayout.TabView): Boolean {
            return text == tabView.tab?.text
        }
    }

我已经将这两个函数添加到android-test-utils GitHub存储库中的自定义视图匹配器集合中。