Есть следующий тест, который при переходе в форму логина, вводит некорректные данные, в ответ на которые ему выводится дилоговое окно с текстом "Warning":
@Test
fun signInUserWithInvalidPassword() {
goToSignIn()
AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, VALID_EMAIL)
AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, "987654321")
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
onView(isRoot()).perform(AcceptanceHelper.waitId(R.id.titleTextView, 5000))
AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning")
Проблема в том что тест падает на строчке:
onView(isRoot()).perform(AcceptanceHelper.waitId(R.id.titleTextView, 5000))
Мол открывается во фрагменте диалог, элементы которого он не находит.
А вот и собственно сам метод waitId
:
fun waitId(id: Int, millis: Long): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> {
return isRoot()
}
override fun getDescription(): String {
return "wait for a specific view with id <$id> during $millis millis."
}
override fun perform(uiController: UiController, view: View) {
uiController.loopMainThreadUntilIdle()
val startTime = System.currentTimeMillis()
val endTime = startTime + millis
val viewMatcher = withId(id)
do {
for (child in TreeIterables.breadthFirstViewTraversal(view)) {
// found view with required ID
if (viewMatcher.matches(child)) {
return
}
}
uiController.loopMainThreadForAtLeast(50)
} while (System.currentTimeMillis() < endTime)
// timeout happens
throw PerformException.Builder()
.withActionDescription(this.description)
.withViewDescription(HumanReadables.describe(view))
.withCause(TimeoutException())
.build()
}
}
}
Возможно кто то сталкивался, и может подсказать.
Как вариант можете воспользоваться вместо вашего метода следующим способом:
SystemClock.sleep(5000)
или
Thread.sleep(1500);
Также можно упростить Ваш метод и проставлять значения таймаута заранее:
fun waitFor(id: Int, millis: Long): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> {
return isRoot()
}
override fun getDescription(): String {
return "Wait for a specific view with $id during $millis millis."
}
override fun perform(uiController: UiController, view: View) {
uiController.loopMainThreadUntilIdle()
}
}
}
Но не стоит забывать, что это не самые лучшие варианты, так как Вам придётся постоянно ожидать n-ое кол-во времени. Лучше всего загружать нужные Вам элементы, в данном случае текст, который вы хотите проверить сразу, как только загрузился диалог. Поэтому попробуйте еще такой вариант как IdlingResource, а в качестве примера попробуйте разобраться перейдя по ссылке здесь.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть вспомогательный класс DialogIdlingResource, благодаря которому пытаюсь запустить свои тесты, все тесты проходят за исключением этого запускается...
ЗдравствуйтеНаписал библиотеку с анимациями, своими классами, методами и т
Пытаюсь писать тесты на русском в cucumber javaЕсть
Использую Google карты в своем приложении и при компиляции на android 44