Как протестировать весь поток приложений с помощью Detox?

Я начал интеграцию detox в моем приложении React Native для некоторых e2e testing,

Пока это прекрасно работает, однако я столкнулся с препятствием. Я пытаюсь проверить успешный вход в систему, и поток эффективно:

  1. Пользователь вводит правильные учетные данные
  2. 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();
Другие вопросы по тегам