Robotium не переходит к текстовому представлению

#android #testing #robotium

#Android #тестирование #robotium

Вопрос:

У меня есть следующий макет в моем фрагменте и активности:

введите описание изображения здесь

Как вы можете видеть, Robotium заполняет текст для EditText представлений. Он также прокручивается и заполняет поле «Команда», которое следует за «Именем игрока». Однако Spinner после этого есть a с соответствующей меткой в a textView , и solo.searchForText() он не прокручивается вниз, чтобы отобразить его. Это из-за разделенной панели действий? Что я могу сделать, чтобы устранить эту проблему в своих тестах?

Соответствующий код, который пытается получить доступ к Spinner :

         Spinner playerPositionSpinner = (Spinner) solo.getView(R.id.player_position_text);
        @SuppressWarnings("unchecked")
        ArrayAdapter<CharSequence> playerPositionAdapter = (ArrayAdapter<CharSequence>) playerPositionSpinner
                .getAdapter();
        int newIndex = playerPositionAdapter.getPosition(card
                .getPlayerPosition());
        int currIndex = playerPositionSpinner.getSelectedItemPosition();

        boolean isPositionVisible = solo.searchText(
                solo.getString(R.string.player_position_label), true);
        solo.waitForView(R.id.player_position_text);

        boolean isConditionVisible = solo.searchText(solo.getString(R.string.condition_label),
                false);
        int index = -1;
        if (!isConditionVisible amp;amp; isPositionVisible) {
            index = 0;
        }
        if (isPositionVisible amp;amp; isConditionVisible) {
            index = 1;
        }

        Assert.assertFalse("Invalid index", index == -1);
        solo.pressSpinnerItem(index, newIndex - currIndex);
 

XML-макет для фрагмента формы:

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@id/scroll_card_details"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TableLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="1" >

        <TableRow>

            <CheckBox
                android:id="@id/autograph"
                android:text="@string/autograph_label"
                android:layout_span="2" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/condition_label"
                android:textStyle="bold" />

            <Spinner
                android:id="@id/condition"
                android:hint="@string/condition_hint"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/brand_label"
                android:textStyle="bold" />

            <AutoCompleteTextView
                android:id="@id/brand_text"
                android:completionThreshold="1"
                android:hint="@string/brand_hint"
                android:inputType="textCapWords"
                android:selectAllOnFocus="true"
                android:singleLine="true" >

                <requestFocus />
            </AutoCompleteTextView>
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/year_label"
                android:textStyle="bold" />

            <EditText
                android:id="@id/year_text"
                android:hint="@string/year_hint"
                android:inputType="number"
                android:selectAllOnFocus="true"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/number_label"
                android:textStyle="bold" />

            <EditText
                android:id="@id/number_text"
                android:hint="@string/number_hint"
                android:inputType="number"
                android:selectAllOnFocus="true"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/value_label"
                android:textStyle="bold" />

            <EditText
                android:id="@id/value_text"
                android:hint="@string/value_hint"
                android:inputType="numberDecimal"
                android:selectAllOnFocus="true"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/count_label"
                android:textStyle="bold" />

            <EditText
                android:id="@id/count_text"
                android:hint="@string/count_hint"
                android:inputType="number"
                android:selectAllOnFocus="true"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/player_name_label"
                android:textStyle="bold" />

            <AutoCompleteTextView
                android:id="@id/player_name_text"
                android:completionThreshold="1"
                android:hint="@string/player_name_hint"
                android:inputType="textCapWords"
                android:selectAllOnFocus="true"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/team_label"
                android:textStyle="bold" />

            <AutoCompleteTextView
                android:id="@id/team_text"
                android:completionThreshold="1"
                android:hint="@string/team_hint"
                android:inputType="textCapWords"
                android:selectAllOnFocus="true"
                android:singleLine="true" />
        </TableRow>

        <TableRow>

            <TextView
                android:text="@string/player_position_label"
                android:textStyle="bold" />

            <Spinner
                android:id="@id/player_position_text"
                android:hint="@string/player_position_hint"
                android:singleLine="true" />
        </TableRow>

    </TableLayout>

</ScrollView>
 

Ответ №1:

По-видимому, Robotium находит объявление вместо ScrollView. Robotium не знает, как с этим справиться, и просто игнорирует это вместо того, чтобы вызывать какие-либо ошибки.

В итоге я написал свою собственную функцию для выполнения прокрутки:

 public static void scrollDown(final ScrollView scrollView) {
    scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.arrowScroll(ScrollView.FOCUS_DOWN);
        }
    });
}
 

Комментарии:

1. У меня была такая же проблема, вот что я сделал: solo.sendKey(Solo.DOWN); solo.sendKey(Solo.DOWN); solo.sendKey(Solo.DOWN);

2. solo.SendKey (Solo.DOWN) сделал трюк для меня. Спасибо @GabrielKaffka.

Ответ №2:

А вы пробовали:

 solo.pressSpinnerItem(0, 1);
 

Первый параметр — это индекс используемого счетчика, а второй параметр — элемент в счетчике, который нужно выбрать.

Комментарии:

1. Статический индекс не работает, потому что я хочу, чтобы мой тест был гибким для многих размеров экрана. На больших экранах могут быть видны два блесны.

2. На экранах меньшего размера счетчик, на который я хочу нажать, может быть скрыт. Когда я это делаю pressSpinnerItem(1, x) , я получаю сообщение «Две блесны не найдены!»