#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)
, я получаю сообщение «Две блесны не найдены!»