Android эспрессо - Как проверить значение TextView внизу Listview? - PullRequest
0 голосов
/ 03 сентября 2018

Please see this image

На прикрепленном изображении выше это ListView с TextView (отчет о доставке)

Its status can be 'Sent' or 'Sending' or 'Failed'

Я хочу проверить состояние «Отправлено», что означает, что сообщение об отправке успешно отправлено

Поскольку это разговор, более новые сообщения будут внизу списка.

То, что я пробовал, это ...

    // Type the message
    ViewInteraction smsEditText = onView(withId(R.id.text_editor)).check(matches(isDisplayed()));
    smsEditText.perform(typeText("abcde"));

    closeSoftKeyboard();

    Thread.sleep(500);

    // Click on send Button 
    ViewInteraction smsSendButton = onView(withId(R.id.composebtnSend)).check(matches(isDisplayed()));
    smsSendButton.check(matches(isEnabled()));
    smsSendButton.perform(click());

    Thread.sleep(3000);

    // Assert for msg Sent delivery report
    onData(anything()).inAdapterView(withId(R.id.history)).atPosition(2)
            .onChildView(withId(R.id.timestamp)).check(matches(withText("Sent .")));

Позиция должна быть «listAdapter.getCount ()»

Я знаю, что совпадения (withText ("Отправлено") не работают, поскольку они поступают с сервера, и я не могу жестко кодировать время доставки.

onData(startsWith("Sent .")).inAdapterView(withId(R.id.history)).atPosition(????)
            .onChildView(withId(R.id.timestamp)).

Как это сделать?

Обновление:

Я попробовал это и застрял в утверждении

final int[] count = new int[1];
    onView(withId(R.id.history))
            .check(matches(new TypeSafeMatcher<View>() {
                @Override
                protected boolean matchesSafely(View item) {
                    ListView listView = (ListView) item;
                    count[0] = listView.getAdapter().getCount();
                    return true;
                }

                @Override
                public void describeTo(Description description) {
                    Log.d("ConversationListTest", "describeTo: " + description);
                }
            }));
onData(containsString("Sent . "))
            .inAdapterView(withId(R.id.history))
            .atPosition(count[0] - 1)
            .onChildView(withId(R.id.timestamp))
            .check(matches(isDisplayed()));

Утверждение isDisplayed () дает

 android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id:history'.

Примечание: не добавление 'check (match (match (isDisplayed ()))) "проходит мой тест

Что я должен использовать, чтобы утверждать это?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я решил, добавив эти кусочки кода

// Below code is to get the view at bottom of the ListView
    final int[] count = new int[1];
    onView(withId(R.id.history))
            .check(matches(new TypeSafeMatcher<View>() {
                @Override
                protected boolean matchesSafely(View item) {
                    ListView listView = (ListView) item;
                    count[0] = listView.getAdapter().getCount();
                    return true;
                }

                @Override
                public void describeTo(Description description) {
                    Log.d("ConversationListTest", "describeTo: " + description);
                }
            }));

// Check if TextView contains "Sent" in it
    onData(anything())        
            .inAdapterView(allOf(withId(R.id.history), isDisplayed()))
            .atPosition(count[0] - 1)
            .onChildView(withId(R.id.timestamp))
            .check(matches(withText(containsString("Sent"))))
            .check(matches(isDisplayed()));
0 голосов
/ 04 сентября 2018

Ознакомьтесь с этим руководством по работе с Listview - http://www.qaautomated.com/2016/01/testing-with-espresso-data-adapter.html

Попробуйте использовать ListViewClass из кода для отслеживания элемента вместо ids.

onData(hasEntry(equalTo(ListViewSample.ROW_TEXT),is("List item: 25"))).onChildView(withId(R.id.rowTextView)).perform(click());
onView(withId(R.id.selection_row_value)).check(matches(withText("25")))
...