gpt4 book ai didi

Android Espresso 等待文本出现

转载 作者:行者123 更新时间:2023-12-03 13:26:04 25 4
gpt4 key购买 nike

我正在尝试使用 Espresso 自动化作为聊天机器人的 Android 应用程序。我可以说我对 Android 应用自动化完全陌生。
现在我在等待中挣扎。如果我使用 Thread.sleep ,它工作得很好。但是,我想等到屏幕上出现特定文本。我怎样才能做到这一点?

@Rule
public ActivityTestRule<LoginActivity> mActivityTestRule = new ActivityTestRule<>(LoginActivity.class);

@Test
public void loginActivityTest() {
ViewInteraction loginName = onView(allOf(withId(R.id.text_edit_field),
childAtPosition(childAtPosition(withId(R.id.email_field),0), 1)));
loginName.perform(scrollTo(), replaceText("test@test.test"), closeSoftKeyboard());

ViewInteraction password= onView(allOf(withId(R.id.text_edit_field),
childAtPosition(childAtPosition(withId(R.id.password_field),0), 1)));
password.perform(scrollTo(), replaceText("12345678"), closeSoftKeyboard());

ViewInteraction singInButton = onView(allOf(withId(R.id.sign_in), withText("Sign In"),childAtPosition(childAtPosition(withId(R.id.scrollView), 0),2)));
singInButton .perform(scrollTo(), click());

//Here I need to wait for the text "Hi ..."
一些解释:按下登录按钮后,聊天机器人会说“嗨”并提供更多信息。我想等待最后一条消息出现在屏幕上。

最佳答案

我喜欢上面@jeprubio 的回答,但是我遇到了评论中提到的@desgraci 相同的问题,他们的匹配器一直在寻找旧的、陈旧的 Root View 的 View 。当您尝试在测试中的 Activity 之间进行转换时,这种情况经常发生。

我对传统“隐式等待”模式的实现存在于下面的两个 Kotlin 文件中。

EspressoExtensions.kt 包含函数 searchFor一旦在提供的 Root View 中找到匹配项,它就会返回一个 ViewAction。

class EspressoExtensions {

companion object {

/**
* Perform action of waiting for a certain view within a single root view
* @param matcher Generic Matcher used to find our view
*/
fun searchFor(matcher: Matcher<View>): ViewAction {

return object : ViewAction {

override fun getConstraints(): Matcher<View> {
return isRoot()
}

override fun getDescription(): String {
return "searching for view $matcher in the root view"
}

override fun perform(uiController: UiController, view: View) {

var tries = 0
val childViews: Iterable<View> = TreeIterables.breadthFirstViewTraversal(view)

// Look for the match in the tree of childviews
childViews.forEach {
tries++
if (matcher.matches(it)) {
// found the view
return
}
}

throw NoMatchingViewException.Builder()
.withRootView(view)
.withViewMatcher(matcher)
.build()
}
}
}
}
}

BaseRobot.kt 调用 searchFor()方法,检查是否返回了匹配器。如果没有返回匹配,它会休眠一点点,然后获取一个新的根进行匹配,直到它尝试了 X 次,然后它抛出一个异常并且测试失败。对什么是“机器人”感到困惑?查看 this fantastic talk by Jake Wharton关于机器人模式。它与页面对象模型模式非常相似
open class BaseRobot {

fun doOnView(matcher: Matcher<View>, vararg actions: ViewAction) {
actions.forEach {
waitForView(matcher).perform(it)
}
}

fun assertOnView(matcher: Matcher<View>, vararg assertions: ViewAssertion) {
assertions.forEach {
waitForView(matcher).check(it)
}
}

/**
* Perform action of implicitly waiting for a certain view.
* This differs from EspressoExtensions.searchFor in that,
* upon failure to locate an element, it will fetch a new root view
* in which to traverse searching for our @param match
*
* @param viewMatcher ViewMatcher used to find our view
*/
fun waitForView(
viewMatcher: Matcher<View>,
waitMillis: Int = 5000,
waitMillisPerTry: Long = 100
): ViewInteraction {

// Derive the max tries
val maxTries = waitMillis / waitMillisPerTry.toInt()

var tries = 0

for (i in 0..maxTries)
try {
// Track the amount of times we've tried
tries++

// Search the root for the view
onView(isRoot()).perform(searchFor(viewMatcher))

// If we're here, we found our view. Now return it
return onView(viewMatcher)

} catch (e: Exception) {

if (tries == maxTries) {
throw e
}
sleep(waitMillisPerTry)
}

throw Exception("Error finding a view matching $viewMatcher")
}
}

使用它
// Click on element withId
BaseRobot().doOnView(withId(R.id.viewIWantToFind, click())

// Assert element withId is displayed
BaseRobot().assertOnView(withId(R.id.viewIWantToFind, matches(isDisplayed()))

我知道 IdlingResource是 Google 鼓吹在 Espresso 测试中处理异步事件的方法,但它通常要求您在应用程序代码中嵌入测试特定代码(即钩子(Hook))以同步测试。这对我来说似乎很奇怪,并且在一个拥有成熟应用程序和多个开发人员每天提交代码的团队中工作,似乎为了测试而在应用程序中的任何地方改造空闲资源将是很多额外的工作。就个人而言,我更喜欢将应用程序和测试代码尽可能分开。
/结束咆哮

关于Android Espresso 等待文本出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49796132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com