Espresso Matcher несколько дочерних пользовательских представлений - PullRequest
0 голосов
/ 21 октября 2019

Я надеюсь, что некоторые из них могут помочь мне пролить свет на пользовательские представления. Я запустил Record Espresso Test и android-studio сгенерировал следующий код.

    ViewInteraction textInputEditText = onView(
            allOf(withId(R.id.edit_text_last_name),
                    childAtPosition(
                            allOf(withId(R.id.layout_item_viewpager),
                                    childAtPosition(
                                            withId(R.id.layout_my_activity),
                                            0)),
                            1),
                    isDisplayed()));
    textInputEditText.perform(replaceText("a"), closeSoftKeyboard());
}

private static Matcher<View> childAtPosition(
        final Matcher<View> parentMatcher, final int position) {

    return new TypeSafeMatcher<View>() {
        @Override
        public void describeTo(Description description) {
            description.appendText("Child at position " + position + " in parent ");
            parentMatcher.describeTo(description);
        }

        @Override
        public boolean matchesSafely(View view) {
            ViewParent parent = view.getParent();
            return parent instanceof ViewGroup && parentMatcher.matches(parent)
                    && view.equals(((ViewGroup) parent).getChildAt(position));
        }
    };
}

Код, сгенерированный Record Espresso Test, работает, я не уверен, как работают дочерние представления или что 0 и 1 делают в этом блоке кода.

Я прочитал довольно много информации о сопоставителях Hamcrest и о том, как создавать настраиваемые сопоставители, но мне трудно найти материал, относящийся к сгенерированному Android-коду. Любая помощь здесь будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 октября 2019

0 и 1 являются индексами нескольких возвращенных совпадений для данного идентификатора. Давайте проработаем ваш код изнутри.

  1. Найдите активность с вашим идентификатором layout_my_activity.
  2. childAtPosition с индексом 0, который говорит использовать первое совпадениевозвращается (индексы основаны на 0). Это , вероятно, не является необходимым, поскольку маловероятно (невозможно?), Что у вас есть несколько операций, выполняющихся с одним и тем же идентификатором, но тестовый регистратор предпочитает быть максимально явным.
  3. Внутри этого,ищите идентификаторы, соответствующие layout_item_viewpager.
  4. childAtPosition с индексом 1 говорит, что нужно использовать второй.
  5. Внутри этого пейджера второго вида найдите что-то с идентификатором edit_text_last_name, это поле, в которое вы хотите ввести a.
...