детокс тесты не распознают вид даже после добавления идентификатора - PullRequest
0 голосов
/ 29 июня 2018

Заранее извиняюсь, если об этом уже спрашивали. Я наткнулся на фреймворк detox e2e для реагирования на нативные приложения и подумал попробовать.

Я пытаюсь автоматизировать демонстрационное мобильное приложение, приведенное здесь - ссылка Поскольку в тестах detox используется testID в качестве одного из локаторов, я добавил его в файл LoginScreenMaterial.js внутри app/screen/LoginScreenMaterial.js следующим образом

<View testID="login_screen" style={{width: this._width, justifyContent: 'center'}}>
          <RkCard style={styles.container}>
            <View rkCardHeader style={styles.header}>
              <RkText/>
              <RkText style={styles.label}>Sign in into your account</RkText>
            </View>

Однако даже после успешной сборки приложения я запустил приложение с помощью этого простого теста

it('should have welcome screen', async () => {
    await expect(element(by.id('login_screen'))).toBeVisible();
  });

Тем не менее, тесты все еще не пройдены, и элемент не может быть распознан. Что мне здесь не хватает в этих тестах? Разве мы не можем добавить testID, как это явно, в файл .js.

Редактировать 1: добавление сообщения об ошибке

1) Example
       should have welcome screen:
     Error: Error: Cannot find UI Element.
Exception with Assertion: {
  "Assertion Criteria" : "assertWithMatcher:matcherForSufficientlyVisible(>=0.750000)",
  "Element Matcher" : "(((respondsToSelector(accessibilityIdentifier) && accessibilityID('login_screen')) && !(kindOfClass('RCTScrollView'))) || (kindOfClass('UIScrollView') && ((kindOfClass('UIView') || respondsToSelector(accessibilityContainer)) && ancestorThatMatches(((respondsToSelector(accessibilityIdentifier) && accessibilityID('login_screen')) && 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"
  }
]
      at Client.execute (node_modules/detox/src/client/Client.js:74:13)

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Действительно, эта accessibilityLabel будет вашим testID, который будет распознаваться в ваших инструментах тестирования:

<TouchableOpacity
  accessible={true}
  accessibilityLabel={'Tap me!'}
  onPress={this._onPress}>
  <View style={styles.button}>
    <Text style={styles.buttonText}>Press me!</Text>
  </View>
</TouchableOpacity>
0 голосов
/ 02 июля 2018

Я взглянул на приложение и смог заставить его работать. Я установил следующее в моих devDependencies.

  "devDependencies": {
    ...
    "jest": "23.2.0",
    "detox": "8.0.0"
    ...
  },

В package.json я также добавил

"detox": {
    "configurations": {
      "ios.sim.debug": {
        "binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/BoomApp.app",
        "build": "xcodebuild -project ios/BoomApp.xcodeproj -scheme BoomApp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
        "type": "ios.simulator",
        "name": "iPhone 7"
      }
    },

Я бегал detox init -r jest

После этого я смог распознать, когда был отображен определенный экран, и сделал это, добавив testID в ScrollView LoginScreenBlur.js (строка 23)

<AppWrapper>
    <ScrollView contentContainerStyle={{flex: 1}} testID={'login_screen'}>
    ....
    </ScrollView>
</AppWrapper>

A, затем в e2e/firstTest.spec.js я заменил тесты на

  it('should have loginScreen', async () => {
    await expect(element(by.id('login_screen'))).toBeVisible();
  });

Это был мой консольный ответ после запуска detox build && detox test

node_modules/.bin/jest e2e --config=e2e/config.json --maxWorkers=1 --testNamePattern='^((?!:android:).)*$'
 server listening on localhost:64579...
 : Searching for device matching iPhone 7...
 : Uninstalling org.reactjs.native.example.BoomApp...
 : org.reactjs.native.example.BoomApp uninstalled
 : Installing /Users/work/Downloads/react-native-ui-kitten-demo-app-master/ios/build/Build/Products/Debug-iphonesimulator/BoomApp.app...
 : /Users/work/Downloads/react-native-ui-kitten-demo-app-master/ios/build/Build/Products/Debug-iphonesimulator/BoomApp.app installed
 : Terminating org.reactjs.native.example.BoomApp...
 : org.reactjs.native.example.BoomApp terminated
 : Launching org.reactjs.native.example.BoomApp...
7: org.reactjs.native.example.BoomApp launched. The stdout and stderr logs were recreated, you can watch them with:
        tail -F /Users/work/Library/Developer/CoreSimulator/Devices/AF406169-5CF3-4480-9D00-8F934C420043/data/tmp/detox.last_launch_app_log.{out,err}
 PASS  e2e/firstTest.spec.js (7.935s)
  Example
    ✓ should have loginScreen (1499ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.87s, estimated 9s
Ran all test suites matching /e2e/i with tests matching "^((?!:android:).)*$".

Казалось бы, приложение по умолчанию запускает LoginScreenBlur, поэтому имеет смысл сначала протестировать его, а не LoginScreenMaterial.

Одна вещь, которую я заметил, состоит в том, что приложение использует RKTextInput и RkButton, это не нативные компоненты, а обертки вокруг нативных компонентов. Это означает, что вам нужно будет передать testID собственному компоненту, который вы хотите иметь testID. Я не уверен, поддерживает ли react-native-ui-kitten метки специальных возможностей, поэтому может потребоваться дополнительная работа, если вы хотите автоматизировать ввод текста и нажатие кнопок.

Добавление testID к пользовательским компонентам

См. Шаг 3 https://github.com/wix/detox/blob/master/docs/Introduction.WritingFirstTest.md

Обратите внимание, что не все компоненты React поддерживают эту опору. Большинство встроенных встроенных компонентов в React Native, таких как View, Text, TextInput, Switch, ScrollView, имеют поддержку. Если вы создадите свои собственные составные компоненты, вам придется вручную распространить эту подпорку на правильный собственный компонент.

Более подробное объяснение добавления testID к пользовательским компонентам приведено здесь https://github.com/wix/detox/blob/master/docs/Troubleshooting.RunningTests.md#cant-find-my-component-even-though-i-added-testid-to-its-props

Вкратце, вы должны реализовать свой пользовательский компонент следующим образом.

Пользовательский компонент

export class MyCompositeComponent extends Component {
  render() {
    return (
      <TouchableOpacity testID={this.props.testID}>
        <View>
          <Text>Something something</Text>
        </View>
      </TouchableOpacity>
    );
  }
}

Использование пользовательского компонента

Тогда вы должны использовать это так.

render() {
  return <MyCompositeComponent testID='MyUniqueId123' />;
}

Поиск по иерархии

Если вы выполнили все вышеперечисленное и уверены, что ваш элемент имеет правильный testID и тесты по-прежнему не проходят, вы можете найти его в иерархии представлений https://github.com/wix/detox/blob/master/docs/Troubleshooting.RunningTests.md#debug-view-hierarchy

Я не буду повторять вышеупомянутый пост полностью, но шаги

  1. Запустите в вашем симуляторе отладочное приложение (не сборку релиза)
  2. Открыть Xcode
  3. Присоедините Xcode к процессу вашего приложения
  4. Нажмите кнопку Иерархия просмотра отладки
  5. Это откроет средство просмотра иерархии и покажет разбивку иерархии представлений вашего приложения. Здесь вы можете просмотреть виды
  6. Реагировать Родные testIDs проявляются как идентификаторы доступности в иерархии собственного представления
0 голосов
/ 29 июня 2018

Используйте AccessiblityLabel для добавления идентификатора в элемент просмотра: https://facebook.github.io/react-native/docs/accessibility.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...