将Android Espresso typeText导入ActionBar中的EditText

时间:2014-07-24 07:19:01

标签: android android-actionbar android-espresso

我的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,但结果相同。

我有什么遗失的吗?

5 个答案:

答案 0 :(得分:18)

此代码适用于SerachView中的ActionBar,因为SearchViewEditText中唯一的Fragment

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

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

答案 1 :(得分:10)

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

onView(withId(android.support.design.R.id.search_src_text)).perform(typeText("example"), pressKey(KeyEvent.KEYCODE_ENTER));

希望这很有用。

答案 2 :(得分: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. ex,E​​ditText。

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

获取了此代码

答案 3 :(得分:1)

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"));

答案 4 :(得分:0)

可接受的答案很好,但是由于官方的Espresso库包含与replaceText函数相同的功能,因此不再需要。

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

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