Как протестировать весь поток приложений с помощью Detox?
Я начал интеграцию detox
в моем приложении React Native для некоторых e2e testing
,
Пока это прекрасно работает, однако я столкнулся с препятствием. Я пытаюсь проверить успешный вход в систему, и поток эффективно:
- Пользователь вводит правильные учетные данные
- Redux будет:
- Хранить пользовательский объект в Async Storage
- Зарегистрируйте пользователя по интеркому
- Запустить успешное действие
- Перенаправить пользователя на главный экран -
navigateToHomeScreen()
- Обновить Sentry с учетными данными пользователя
navigateToHomeScreen
:
const navigateToHomeScreen = () => dispatch =>
dispatch(
NavigationActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Home' })],
})
);
В моем Home
экран, у меня есть это как моя функция рендеринга:
<View style={styles.screen} testID="home">
<Header
onMenuPress={navigationMenu.toggle}
onFilterPress={filterMenu.toggle}
/>
<Feed {...{ navigation }} />
<IntercomButton visible={!isActive} />
<Search />
</View>
В моем тесте Detox у меня есть этот случай, который терпит неудачу:
it('should trigger a login', async () => {
const loginFormEmail = element(by.id('login-form-email'));
const loginFormPassword = element(by.id('login-form-password'));
const loginButton = element(by.id('login-button'));
await expect(loginFormEmail).toBeVisible();
await expect(loginFormPassword).toBeVisible();
await expect(element(by.id('login-activity-spinner'))).toBeNotVisible();
await loginFormEmail.replaceText('xxx');
await loginFormPassword.replaceText('xxx');
await loginButton.tap();
await expect(element(by.id('home'))).toBeVisible();
});
Я получаю следующую ошибку, которая говорит testID="home"
не может быть найден:
Error: Cannot find UI Element.
Exception with Assertion: {
"Assertion Criteria" : "assertWithMatcher:matcherForSufficientlyVisible(>=0.750000)",
"Element Matcher" : "(((respondsToSelector(accessibilityIdentifier) && accessibilityID('home')) && !(kindOfClass('RCTScrollView'))) || (kindOfClass('UIScrollView') && ((kindOfClass('UIView') || respondsToSelector(accessibilityContainer)) && ancestorThatMatches(((respondsToSelector(accessibilityIdentifier) && accessibilityID('home')) && kindOfClass('RCTScrollView'))))))",
"Recovery Suggestion" : "Check if the element exists in the UI hierarchy printed below. If it exists, adjust the matcher so that it accurately matches element."
}
Error Trace: [
{
"Description" : "Interaction cannot continue because the desired element was not found.",
"Error Domain" : "com.google.earlgrey.ElementInteractionErrorDomain",
"Error Code" : "0",
"File Name" : "GREYElementInteraction.m",
"Function Name" : "-[GREYElementInteraction matchedElementsWithTimeout:error:]",
"Line" : "124"
}
]
0 ответов
У меня такая же проблема, когда у меня есть поток входа в систему, который я пытался протестировать. Я использую реагирующую навигацию, и в соответствии с документами вы можете передать testID на панель вкладок, но по какой-то причине его действительно нестабильно обнаруживать элементы управления навигацией (заголовок, нижняя панель вкладок) после входа пользователя в систему. Поэтому вместо этого я просто добавил testID элементу, который я контролирую, что мне не нужно беспокоиться о том, установлен ли он или порядок его установки. На главном экране я установил testID для тега View, который находится на моем домашнем экране, и он просто работает без тайм-аутов. По возможности старайтесь не устанавливать testID для вещей, которые вы не контролируете.
await expect(element(by.id('homeScreenViewTag'))).toBeVisible();