我正试图在AndroidStudio 4.2中录制一个浓缩咖啡测试。录音似乎很好。然而,当我尝试运行录制的测试时,它们大约运行了一半,直到出现活动切换,然后它失败了,因为找不到视图,并且我一直得到NoMatchingViewException
。
我在第一个活动中点击了一堆,这会触发第二个活动的加载。当运行测试时,尝试在第二个活动中查找视图永远不会起作用。
@Test
fun firstRecordedTest() {
val materialButton = onView(
allOf(
withId(R.id.key1Button), withText("1"),
childAtPosition(
childAtPosition(
withClassName(`is`("android.widget.LinearLayout")),
0
),
3
),
isDisplayed()
)
)
materialButton.perform(click())
// Activity switches here
// The following never works
val matcher: Matcher<View> = allOf(
withId(R.id.tab_contacts), withContentDescription("Contacts"),
childAtPosition(
childAtPosition(
withId(R.id.navigation_view),
0
),
1
),
isDisplayed()
)
val bottomNavigationItemView = onView(matcher)
bottomNavigationItemView.perform(click())
}
我曾尝试放置不同类型的计时器等来等待视图加载,但要么被卡住,要么失败。我也尝试过这个答案,但没有成功。
我是不是错过了什么?即使浓缩咖啡录音机允许,在切换活动后也不可能继续测试吗?
浓缩咖啡不需要定时器。它会等到活动完全加载,你可以在这里阅读
其次,我自己没有用过录音机,因为它噪音很大。例如,下面的代码
val matcher: Matcher<View> = allOf(
withId(R.id.tab_contacts), withContentDescription("Contacts"),
childAtPosition(
childAtPosition(
withId(R.id.navigation_view),
0
),
1
),
isDisplayed()
)
我假设它点击了navigation_view中的一个按钮。可以简单地用代替
onView(withId(R.id.tab_contacts)).perform(click())
现在,说到测试失败的原因,materialButton
点击似乎是在做一些异步工作或做一些动画。你可以在你的构建中禁用动画。像这样的
android {
...
testOptions {
animationsDisabled = true
}
...
}
如果你读到这里,我总结道,espresso应该等待执行任何操作(在你的情况下,单击tab_contacts
(,直到消息队列为空,它也会与异步任务同步,但espresso不知道其他异步长时间运行的操作。因此,如果您正在使用一些异步操作,您应该考虑使用空闲资源来进行可靠的测试。
但如果你想快速破解,你可以使用这种睡眠方法:
private fun sleep(millis: Long): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> {
return isRoot()
}
override fun getDescription(): String {
return "Going to sleep for " + millis + "milliseconds"
}
override fun perform(uiController: UiController, view: View) {
uiController.loopMainThreadForAtLeast(millis)
}
}
}
并像这样调用上面的方法:
onView(isRoot())
.perform(sleep(
TimeUnit.SECONDS.toMillis(10)
))
意式浓缩咖啡有时会在视野上摇摆不定。您是否尝试使用第二个活动中的另一个视图,或者删除导致测试失败的视图并在没有它的情况下运行测试?