Espresso AutoCompleteTextView单击

时间:2016-07-25 07:51:49

标签: android android-testing autocompletetextview android-espresso

所以我最近开始在我现有的一个Android项目中使用Espresso。

一切都很顺利,直到我在我的程序中找到AutoCompleteTextView。我似乎不明白如何正确点击自动完成列表中的第一件事。我实际上甚至不确定在这个实例中使用哪个onView()onData()

5 个答案:

答案 0 :(得分:5)

我认为我发现了一种比接受的答案更清洁的方法!

onData(equalTo("ITEM")).inRoot(RootMatchers.isPlatformPopup()).perform(click());

细分:

  • onData(x)这将在下拉列表中找到呈现与x匹配的数据对象的视图。数据由Adaptor提供的AutoCompleteTextView提供,因此它可以是Adaptor提供的任何类型的对象,它可能不会成为视图。您将要使用标准的hamcrest核心匹配器(equalToinstanceOf等...)而不是(withTextwithId等。 ..)。尝试查找这是什么对象以及如何匹配它可能会很痛苦,但是没有更简洁的方法:在适配器中有很多项目,一些视图甚至不会出现在层次结构,所以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