0

У меня есть 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.

+0

вместо 'onData' пытаются использовать' OnView (withText (R.string.test_account)) inRoot (isDialog()) проверка (матчи (isDisplayed())); ' – piotrek1543

+0

Я не знал об использовании isDialog с inRoot, это хорошо знать. Но это не касается базовой проблемы использования onView в этой ситуации: видимость. Использование onView будет соответствовать только представлениям, которые хотя бы частично видны. Вот почему я пытался использовать onData, поэтому я мог искать правильный элемент без учета видимости. – jhonvolkd

+0

Используйте 'UiAtomator', чтобы помочь' Espresso': http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html – piotrek1543

ответ

1

onData() с "com.android.internal.app.AlertController $ RecycleListView" работает для меня, обратите внимание, что у вас есть опечатка в «RecyleListView».

Кроме того, параметр onData() должен быть «dataMatcher», instanceOf() для типа, используемого как T для ArrayAdapter (String в этом случае), работает.

Это работает для меня:..

onData(is(instanceOf(String.class))).inAdapterView(allOf(withClassName(equalTo("com.android.internal.app.AlertController$RecycleListView")), isDisplayed())).atPosition(index).perform(click()); 

 Смежные вопросы

  • Нет связанных вопросов^_^