Как я могу использовать эспрессо, чтобы щелкнуть элемент из списка в виде текста элемента? - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь щелкнуть по элементу списка, используя эспрессо, но безуспешно.

Я перепробовал все, что есть в stackOverflow

onData(anything()).inAdapterView(withId(R.id.more_menu_list)).atPosition(0).
                    onChildView(withId(R.id.mm_item_text)).
                    check(matches(withText("Log in")))
                    .perform(click());

            onView(allOf(is(instanceOf(MenuListAdapter.class)), hasSibling(withText("Log in")))).perform(click());

            onData(allOf(is(instanceOf(MenuListAdapter.class)), hasEntry(equalTo("STR"), is("Log in"))))
                            .perform(click());

            onData(anything()).inAdapterView(withContentDescription("Log in")).atPosition(0).perform(click());

            onData(hasToString(startsWith("Promotions")))
                    .inAdapterView(withId(R.id.more_menu_list)).atPosition(0)
                    .perform(click());


            onData(hasEntry(equalTo(MenuListAdapter.class),is("Log out")))
                    .onChildView(withId(R.id.more_menu_list));
            onView(withId(R.id.mm_item_text)).check(matches(withText("Log in")));

I also tried to create a custom matcher
    public static Matcher<Object> withItemValue(final String value) {
        return new BoundedMatcher<Object, ExtraMenu>(ExtraMenu.class) {
            @Override
            protected boolean matchesSafely(ExtraMenu item) {
                return item.getText().toUpperCase().equals(String.valueOf(value));

            }

            @Override
            public void describeTo(Description description) {
                description.appendText("has value " + value);
            }
        };
    }

используется как:

onData(withItemValue("Promotions")).inAdapterView(withId(R.id.more_menu_list)).perform(click());

В большинстве случаев я получаю эту ошибку. Есть меню из 5 пунктов Вызвано: java.lang.RuntimeException: данные не найдены, соответствующие: имеет значение Акции содержали значения: <[Data: 0 (class: java.lang.Integer) токен: 0, Data: 1 (class: java.lang.Integer) токен: 1, данные: 2 (класс: java.lang.Integer) токен: 2, данные: 3 (класс: java.lang.Integer) токен: 3, данные: 4 (класс: java.lang.Integer) токен: 4]>

1 Ответ

0 голосов
/ 30 мая 2019

Я нашел способ, выложу его, чтобы помогать другим. Мне пришлось изменить представление списка на представление корзины и использовать эту команду.

onView(withId(R.id.list))
                .perform(RecyclerViewActions.actionOnItem(
                        hasDescendant(withText("Your string")), click()));

Возможно, вы захотите использовать Thread.sleep (2000), если у вас есть несколько действий до этой строки кода. Также вам нужна эта зависимость в вашем build.gradle:

androidTestImplementation("com.android.support.test.espresso:espresso-contrib:2.2.2") {
    exclude group: 'com.android.support', module: 'appcompat'
    exclude group: 'com.android.support', module: 'support-v4'
    exclude group: 'com.android.support', module: 'support-v7'
    exclude group: 'com.android.support', module: 'design'
    exclude module: 'support-annotations'
    exclude module: 'recyclerview-v7'
}
...