如何在 searchview 上按下 espresso 中的操作按钮

How to press on searchview the action button in espresso

建议,如何在输入文本请求后使用键盘上的浓缩咖啡按下搜索按钮

//Fragment class
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.search_menu, menu);
    searchMenuItem = menu.findItem(R.id.action_search);
    if (searchMenuItem != null) {
        searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
        searchView.setOnQueryTextListener(this);
        searchView.setQueryHint("Search");
    }
    super.onCreateOptionsMenu(menu, inflater);
}
来自 androidTest 的

class 是:

public class GridFragmentTest {

    private final static String TAG = GridFragmentTest.class.getSimpleName();

    @Rule
    public ActivityTestRule activityTestRule = new ActivityTestRule(MainActivity.class);

    @Test
    public void GridFragmentRecycleViewTest(){
        IdlingResource componentIdlingResource = getIdlingResource();
        Espresso.registerIdlingResources(componentIdlingResource);
        Log.d(TAG, "GridFragmentRecycleViewTest()");
        onView(withId(R.id.action_search)).perform(click());
        onView(isAssignableFrom(SearchView.class)).perform(typeSearchViewText("lord")).perform(pressImeActionButton());
        EspressoIdlingResource.increment();
        onView(withId(R.id.recycler_view)).check(new RecyclerViewItemCountAssertion(10));
    }

    public static ViewAction typeSearchViewText(final String text){
        return new ViewAction(){
            @Override
            public Matcher<View> getConstraints() {
                //Ensure that only apply if it is a SearchView and if it is visible.
                return allOf(isDisplayed(), isAssignableFrom(SearchView.class));
            }

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

            @Override
            public void perform(UiController uiController, View view) {
                ((SearchView) view).setQuery(text,false);
            }


        };
    }
}

这是代码的 PerformException:

   .perform(pressImeActionButton()

异常文本为:

androidx.test.espresso.PerformException: Error performing 'androidx.test.espresso.action.EditorAction@9c9ab29' on view 'is assignable from class: class androidx.appcompat.widget.SearchView'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.java:84)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:85)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:57)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:316)
at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:177)
at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:118)

而不是

.perform(pressImeActionButton())

应该有:

.perform(pressKey(KeyEvent.KEYCODE_ENTER))

要获取视图,您可以使用 resources.getSystem().getIdentifier 方法获取搜索文本字段,然后应用以下方法

明文() typeText("bla bla bla")

onView(withId(Resources.getSystem().getIdentifier("search_src_text",
"id", "android"))).perform(clearText(),typeText("enter the text"))
.perform(pressKey(KeyEvent.KEYCODE_ENTER))