У меня есть AlertDialog, который содержит список опций, который устанавливается:Espresso.onData установить inAdapterView быть AlertDialog
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
.setTitle(args.getString(TITLE))
.setSingleChoiceItems(ARRAY_OF_CHARSEQUENCE, args.getInt(SELECTED_INDEX), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// handle click
dismiss();
}
});
Я пытаюсь проверить, нажав на каждом элементе. Если я бегу:
onView(allOf(withClassName(Matchers.equalTo(AppCompatCheckedTextView.class.getName())), withText(displayName)))
.perform(click());
вещи работают замечательно, за исключением, если список опций в AlertDialog слишком долго, чтобы отобразить полностью.
Итак, я пытаюсь найти элемент, используя onData, но я не уверен, как проинструктировать объект DataInteraction, созданный onData, в каком представлении искать данные.
Объекты AppCompatCheckedTextView, которые я пытаюсь щелкнуть, содержатся в AlertController $ RecyleListView с идентификатором select_dialog_listview. Итак, я попытался:
onData(withText(displayName))
.inAdapterView(withId(R.select_dialog_listview))
.perform(click());
и
onData(withText(displayName))
.inAdapterView(withClassName(Matchers.equalTo("android.internal.app.AlertController$RecyleListView")))
.perform(click());
Но получаю ошибку, что нет зрения соответствия в иерархии.
Итак, я попробовал добавить пользовательский вид в диалоговом окне Alert, чтобы узнать, могу ли я найти его по ID.
У меня есть файл макета, содержащий только LinearLayout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/dialog_view">
</LinearLayout>
Что я могу добавить к моему AlertDialog строитель:
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
.setTitle(args.getString(TITLE))
.setView(LayoutInflater.from(getContext()).inflate(R.layout.alert_dialog_view, null))
.setSingleChoiceItems(ARRAY_OF_CHARSEQUENCE, args.getInt(SELECTED_INDEX), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// handle click
dismiss();
}
});
А потом искать в Espresso:
onData(withText(displayName))
.inAdapterView(withId(R.dialog_view))
.perform(click());
Но получите ошибку:
android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id: org.OUR.APPLICATION:id/dialog_view'.
Если я правильно использую onData для выполнения щелчка, то каков правильный метод указания DataInteraction на представление AlertDialog.
вместо 'onData' пытаются использовать' OnView (withText (R.string.test_account)) inRoot (isDialog()) проверка (матчи (isDisplayed())); ' – piotrek1543
Я не знал об использовании isDialog с inRoot, это хорошо знать. Но это не касается базовой проблемы использования onView в этой ситуации: видимость. Использование onView будет соответствовать только представлениям, которые хотя бы частично видны. Вот почему я пытался использовать onData, поэтому я мог искать правильный элемент без учета видимости. – jhonvolkd
Используйте 'UiAtomator', чтобы помочь' Espresso': http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html – piotrek1543