Android Espresso 在 ActionBar 中将文本键入 EditText

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

我的 ActionBar 中有一个

SearchView
,它是从 XML 中膨胀的

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_menu_search"
        android:showAsAction="always|collapseActionView"
        android:icon="@drawable/action_bar_search_icon"
        android:actionViewClass="android.widget.SearchView"/>
</menu>

我用这种方式在我的片段中将其充气:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search, menu);

    final MenuItem item = menu.findItem(R.id.action_menu_search);
    searchView = (SearchView) item.getActionView();
    searchView.setOnQueryTextListener(this);
}

我的测试:

onView(withId(R.id.catalog_filter_indicator_header_text)).perform(click());

//enter text and wait for suggestions
onView(withId(R.id.action_menu_search)).perform(click());
onViewisAssignableFrom(AutoCompleteTextView.class)).perform(click(), typeText("test"));

看起来该字段在开始输入时失去了焦点。而且我也不知道为什么。

找到所有视图,并且

typeText
语句顺利通过,但文本未出现在字段中。我也尝试过使用简单的
EditText
和自定义
android:actionLayout
,但结果相同。

我有什么遗漏的吗?

android android-actionbar android-espresso
6个回答
20
投票

此代码适用于我的

SerachView
中的
ActionBar
,因为
SearchView
是我的
EditText
中唯一的
Fragment
:

onView(withId(R.id.action_search)).perform(click());    
onView(isAssignableFrom(EditText.class)).perform(typeText("test"), pressKey(KeyEvent.KEYCODE_ENTER));

KeyEvent.KEYCODE_ENTER
是按下提交按钮的代码。


12
投票

搜索视图有默认 ID。 你可以用这种方式在 Espresso 中得到它。

onView(withId(androidx.appcompat.R.id.search_src_text)).perform(typeText("example"), pressKey(KeyEvent.KEYCODE_ENTER));

在 AndroidX 之前,ID 为

android.support.design.R.id.search_src_text

希望这有用。


2
投票

最后,我决定创建自己的自定义操作,因为我无法输入文本工作。这是我的代码:

public static ViewAction setText(final String text){
    return new ViewAction(){
        @Override
        public Matcher<View> getConstraints() {
            return allOf(isDisplayed(), isAssignableFrom(TextView.class));
        }

        @Override
        public String getDescription() {
            return "Change view text";
        }

        @Override
        public void perform(UiController uiController, View view) {
            ((TextView) view).setText(text);
        }
    };
}

此代码对于在 TextView 的所有子级中编写代码很有用。 F. 前,EditText。

我从https://stackoverflow.com/a/32850190/1360815

获取此代码

2
投票

SearchView中EditText的id是

search_src_text

onView(withId(R.id.action_menu_search)).perform(click());
onView(withId(R.id.search_src_text)).perform(typeText("test"));

1
投票

接受的答案很好,但不再需要了,因为官方 Espresso 库包含与

replaceText
功能相同的功能。

您可以像下面这样使用它,而无需自定义实现

onView(withId(R.id.search_src_text)).perform(replaceText("test"))

0
投票

这两个

ViewInteraction
提供对
SearchView
及其
EditText
的访问:

/** @return {@link ViewInteraction} {@link SearchView}. */
private ViewInteraction onSearchView() {
    return Espresso.onView(ViewMatchers.withId(R.id.menu_action_search_view));
}

/** @return {@link ViewInteraction} {@link SearchView} {@link EditText}. */
private ViewInteraction onSearchEditText() {
    return Espresso.onView(CoreMatchers.allOf(
            ViewMatchers.isDescendantOfA(ViewMatchers.withId(R.id.menu_action_search_view)),
            ViewMatchers.isAssignableFrom(EditText.class)
    ));
}

像这样使用:

@Test
public void testSearchView() {

    onSearchView()
            .perform(ViewActions.click());

    onSearchEditText()
            .perform(ViewActions.clearText() ,ViewActions.typeText("test"));
}
© www.soinside.com 2019 - 2024. All rights reserved.