所以我最近开始在我现有的一个Android项目中使用Espresso。
一切都很顺利,直到我在我的程序中找到AutoCompleteTextView
。我似乎不明白如何正确点击自动完成列表中的第一件事。我实际上甚至不确定在这个实例中使用哪个onView()
或onData()
。
答案 0 :(得分:5)
我认为我发现了一种比接受的答案更清洁的方法!
onData(equalTo("ITEM")).inRoot(RootMatchers.isPlatformPopup()).perform(click());
细分:
onData(x)
这将在下拉列表中找到呈现与x
匹配的数据对象的视图。数据由Adaptor
提供的AutoCompleteTextView
提供,因此它可以是Adaptor
提供的任何类型的对象,它可能不会成为视图。您将要使用标准的hamcrest核心匹配器(equalTo
,instanceOf
等...)而不是(withText
,withId
等。 ..)。尝试查找这是什么对象以及如何匹配它可能会很痛苦,但是没有更简洁的方法:在适配器中有很多项目,一些视图甚至不会出现在层次结构,所以onView
无法正常工作! onData
将确保加载与您的数据匹配的视图。结帐here(这是onData
返回的内容)和here(这会加载匹配的数据)inRoot(RootMatchers.isPlatformPopup())
事实证明,下拉菜单位于另一个窗口,而不是您的活动运行的默认窗口。因此我们必须指定我们要搜索该窗口。接受的答案使用RootMatchers.withDecorView(not(is(mActivityRule.getActivity().getWindow().getDecorView())))
,它似乎匹配任何非默认窗口。无论如何HTH别人。
答案 1 :(得分:3)
由于某些我不知道的原因,AStupidNoob的解决方案不起作用。所以我找到了另一个:
onView(withText("Spinner Item"))
.inRoot(RootMatchers.isPlatformPopup())
.perform(click());
AutoCompleteTextView 本身
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<AutoCompleteTextView
android:id="@+id/product"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="1"
android:hint="@string/product"
android:singleLine="true"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
答案 2 :(得分:1)
所以我终于明白了,感谢上一个问题: Testing autocomplete textview using espresso tool
我只是将我的版本发布给将来可能会使用它的人。
onData(instanceOf("Whatever your arrayadapter contains".class)).inRoot(RootMatchers.withDecorView(not(is(mActivityRule.getActivity().getWindow().getDecorView())))).perform(ViewActions.click());
答案 3 :(得分:0)
继 2017 年 7 月 28 日 AStupidNoob 的回答之后...
要点击下拉列表的特定行号,可以使用:
onData(anything())
.atPosition(2)
.inRoot(RootMatchers.isPlatformPopup())
.perform(click());
要点击下拉列表特定行号中的特定项目,可以使用:
onData(anything())
.atPosition(2)
.inRoot(RootMatchers.isPlatformPopup())
.onChildView(withId(R.id.button_on_layout))
.perform(click());
答案 4 :(得分:-2)
您可以验证此库示例: Library