Как я могу протестировать проверку поля?

У меня есть код проверки, который устанавливает ошибку EditText, когда он не удовлетворяет требованиям.

field.setError(errorMessage);

Это помещает маленький красный кружок с восклицательным знаком над полем, и когда я касаюсь поля, оно отображает мое сообщение об ошибке в черном поле. Большой!

Теперь я хочу, чтобы calabash проверил, что поле не прошло проверку. На данный момент, по крайней мере, меня не беспокоит конкретное сообщение об ошибке - я просто хочу знать, отображается ли сообщение об ошибке (или я был бы рад согласиться на восклицательный знак, но поскольку я не могу найти его с помощью запроса в консоли, я подозреваю, это будет сложнее).

Этот запрос:

query("android.widget.PopupWindow$PopupViewContainer")

находит окно сообщения об ошибке, если оно присутствует.

Но он присутствует только в том случае, если поле с ошибкой имеет фокус. И я устанавливаю ошибку только тогда, когда поле теряет фокус. Это должно быть в порядке - мой шаг может ввести текст в поле, выйти из поля и вернуться. Когда я делаю это вручную, отображается окно сообщения об ошибке. Чего я еще не смог сделать, так это написать шаг, который делает эти вещи и надежно отображает окно сообщения об ошибке. я пытался

query("EditText id:'#{field_id}'", {:setText => bad_text})
touch(query("* id:'#{another_field_id}'")[0])
touch(query("* id:'#{field_id}'")[0])

и

query("EditText id:'#{field_id}'", {:setText => bad_text})
system("#{default_device.adb_command} shell input keyevent KEYCODE_TAB")
touch(query("* id:'#{field_id}'")[0])

и оба они ведут себя правильно для первого EditText, но не отображают окно сообщения об ошибке для последующих EditText. Почему? Как правильно это сделать?


person Carl Manaster    schedule 18.03.2015    source источник


Ответы (1)


Есть несколько вещей с вашими командами калебаса, которые могут привести к сбою ваших тестов.

1) Не используйте touch(query(...

# bad
touch(query("q"))
# good
touch("q")

2) Не используйте setText для имитации ввода текста.

# bad
query("EditText", {:setText => 'bad_text'})
# good
enter_text("EditText", 'bad_text')

3) Не используйте никакие входные события

События ввода, такие как system("#{default_device.adb_command} shell input keyevent KEYCODE_TAB"), пользователь не может выполнить на большинстве устройств, поскольку очень немногие устройства Android имеют физическую клавиатуру. Используйте press_user_action_button для имитации нажатия пользователем клавиши ввода вместо клавиши ввода.

person Tobias    schedule 19.03.2015
comment
Благодарю вас! Это сработало, особенно enter_text вместо set_text. Можете ли вы указать ресурс, который объясняет, почему использовать один вместо другого? - person Carl Manaster; 19.03.2015
comment
Использование «подхода setText» просто вызывает метод setText для совпадений запроса. Это не вызовет никаких обратных вызовов. Использование keyboard_enter_text — это способ ввода текста. - person Tobias; 20.03.2015
comment
Это имеет смысл, но мне все еще трудно понять, почему это сработало в первом поле на экране. Спасибо. - person Carl Manaster; 20.03.2015