Выберите параметр диалога в Espresso с библиотекой поддержки ArrayAdapter и Material v7

У меня есть диалог со списком элементов, каждый из которых снабжен ArrayAdapter:

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState){

        ArrayList<String> names = getArguments().getStringArrayList(INTENT_OPTIONS);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1, names);
        DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){
                if (mListener != null){
                    mListener.onSelectedElement(which);
                }
            }
        };

        return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.loginActivity_selectVACenter)
                .setCancelable(true)
                .setAdapter(adapter, listener)
                .create();
    }

Прежде чем внедрить библиотеку appcompat v7 для включения материальных функций, я выбрал каждый элемент в Espresso со следующим предложением:

onView(withText("text of the entry"))
                    .perform(click());

Но после добавления этой библиотеки это предложение больше не работает, Espresso не может найти представление и выдает NoMatchingViewException.

Есть ли другой способ получить доступ к параметрам диалога?


person svprdga    schedule 11.12.2015    source источник
comment
Добавьте пожалуйста скриншот этого диалога и конечно полный лог NoMatchingViewException   -  person piotrek1543    schedule 12.12.2015


Ответы (1)


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

В одном из возможных ответов есть совпадение getRootView():

Чтобы ответить на вопрос 4, которого нет в принятом ответе, я изменил следующий код, который нашел здесь, в Stack Overflow (ссылка) для проверки того, отображался ли Toast.

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

Переданный id - это идентификатор View, который в данный момент отображается в вашем диалоговом окне. Вы также можете написать метод следующим образом:

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

И теперь он ищет View, содержащий определенную текстовую строку.

Используйте это так:

getRootView(getActivity(), R.id.text_id).perform(click());

Попробуйте это сначала. Также в той же теме вы найдете этот метод:

onView(withText(R.string.my_title)).inRoot(isDialog()).check(matches(isDisplayed()));

Если это все еще не работает, можно использовать onData matcher.

Всякий раз, когда у вас есть ListView, GridView, Spinner и другие представления на основе адаптера, вам придется использовать onData() для взаимодействия с элементом из этого списка. onData() нацелен непосредственно на данные, предоставленные вашим адаптером. Что это значит, мы вскоре увидим.[ 1]

Вы можете прочитать об этом здесь:

Начните с простого теста, используя onData

[codepath] Тестирование пользовательского интерфейса с помощью Espresso

Android Espresso onData with DoesNotExist

person piotrek1543    schedule 12.12.2015
comment
Ищите использование scrollTo() в эспрессо, например: элемент представления без списка"> stackoverflow.com/questions/25410613/ - person piotrek1543; 14.12.2015