Androidx:如何在 UI 测试中测试 Slider(Espresso)?

问题描述 投票:0回答:2

如何在滑块上执行操作(移动光标)?

如何检查滑块值?

有现成的功能吗?

滑块看起来像这样:

<com.google.android.material.slider.Slider
            android:id="@+id/sliderRating"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:stepSize="1"
            android:valueFrom="1.0"
            android:valueTo="5.0" />

浓缩咖啡检查:

onView(withId(R.id.sliderRating)).check( -> TODO <- )

android slider android-espresso
2个回答
10
投票

创建几个方法来做到这一点很容易。

这是我所拥有的:

fun withValue(expectedValue: Float): Matcher<View?> {
    return object : BoundedMatcher<View?, Slider>(Slider::class.java) {
        override fun describeTo(description: Description) {
            description.appendText("expected: $expectedValue")
        }

        override fun matchesSafely(slider: Slider?): Boolean {
            return slider?.value == expectedValue
        }
    }
}

fun setValue(value: Float): ViewAction {
    return object : ViewAction {
        override fun getDescription(): String {
            return "Set Slider value to $value"
        }

        override fun getConstraints(): Matcher<View> {
            return ViewMatchers.isAssignableFrom(Slider::class.java)
        }

        override fun perform(uiController: UiController?, view: View) {
            val seekBar = view as Slider
            seekBar.value = value
        }
    }
}

第一个是自定义视图匹配器,用于测试

Slider
是否具有特定值,第二个是自定义视图操作,用于设置新值。

使用它们的简单测试示例只是为了了解它们的工作原理:

@Test
fun testSlider() {
    onView(withId(R.id.sliderRating)).check(matches(withValue(1.0F)))

    onView(withId(R.id.sliderRating)).perform(setValue(2.0F))

    onView(withId(R.id.sliderRating)).check(matches(withValue(2.0F)))
}

此测试首先检查滑块的值是否为 1.0,然后将其值更改为 2.0,并使用匹配器检查该值现在是否为 2.0。

我有 kotlin 中的代码,但如果你需要 java 中的代码,它可以很容易地转换(android studio 可以做到这一点)。由于问题没有标记语言,我不知道您需要哪一种,下次标记它。


0
投票

如果您正在使用

OnSliderTouchListener
,这里是解决方案。

fun Slider.setValueAndClick(value: Float) {
            this.value = value
            val baseSliderClass = this.javaClass.superclass

            val touchListenersField: Field = baseSliderClass.getDeclaredField("touchListeners")
            touchListenersField.isAccessible = true

            val listeners = touchListenersField.get(this) as? List<*>
            val listener = listeners?.find { it is Slider.OnSliderTouchListener }

            if (listener == null) return

            for (method in listener.javaClass.declaredMethods) {
                if (method.name == "onStopTrackingTouch") {
                    Log.e(TestUtils::class.simpleName, method.)
                    method.isAccessible = true
                    method.invoke(listener, this)
                    break
                }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.