поведение крана не согласовано на iOS с отключенной синхронизацией - PullRequest
0 голосов
/ 02 июля 2019

У меня есть тест, который использует WebView для входа в приложение (хакерским способом, используя текстовый ввод с кнопкой + injectedJavaScript, поскольку инструментарий WebView не поддерживается).

Проблема возникает из-за того, что операция входа в систему в WebView происходит асинхронно и нарушает синхронизацию Detox, поэтому мне приходится самостоятельно управлять ей с помощью disableSynchronization и enableSynchronization. После входа в систему у меня есть анимация перехода в стеке на новый экран (от реагирования-навигации), и мне нужно нажать кнопку на этом экране, чтобы идти дальше. Однако Detox по-прежнему не может синхронизироваться с этим экраном, поэтому я использую тап, чтобы нажать на кнопку с отключенной синхронизацией.

Здесь возникает проблема, касание не всегда срабатывает, и в 50% случаев происходит сбой с таймаутом для любого действия, выполненного после вызова disableSynchronization. Это делает тесты нестабильными и бесполезными

Может кто-нибудь порекомендовать обходной путь или знает, в чем проблема?

Окружающая среда Детокс: 12.10.3. React Native: 0.59.8 Узел: v11.7.0 Устройство: iOS Emulator (iPhone 8) ОС: iOS

Я пытался отключить и включить синхронизацию до и после нажатия на кнопку, но это не помогло, и фактически заставил тест провалиться с тайм-аутом.

Код моего метода входа в систему:

export const loginAs = async (userID) => {
  await element(by.id('introLoginBtn')).tap();
  await expect(element(by.id('loginScreen'))).toBeVisible();

  const userIdInput = element(by.id('testUserIdInput'));
  await userIdInput.tap();
  await userIdInput.typeText(userID);
  await element(by.id('testLoginBtn')).tap();

  // NOTE: WebView login breaks synchronization see 
  // https://github.com/wix/Detox/blob/master/docs/Troubleshooting.Synchronization.md
  await device.disableSynchronization();

  // Waiting for the element to be visible
  await waitFor(element(by.id('acceptTermsBtn'))).toBeVisible().withTimeout(9000);

  // This does not work consistently
  await element(by.id('acceptTermsBtn')).tap();

  await device.enableSynchronization();
};

Когда я попадаю в консоль отладки с --debug-synchronization 200:

detox[33941] INFO:  [actions.js] Sync Timer: Tracking Timer <__NSCFTimer: 0x600003e6de00>
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeInactiveFingerTips) on DTXTouchVisualizerWindow
detox[33941] INFO:  [actions.js] Sync Timed: animateWithDuration:delay:options:animations:completion:
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers
detox[33941] INFO:  [actions.js] Sync App State: undefined
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeFromSuperview) on COSTouchSpotView
detox[33941] INFO:  [actions.js] Sync Timed: animateWithDuration:delay:options:animations:completion:
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeInactiveFingerTips) on DTXTouchVisualizerWindow
detox[33941] INFO:  [actions.js] Sync Timed: animateWithDuration:delay:options:animations:completion:
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers
detox[33941] INFO:  [actions.js] Sync App State: undefined
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeInactiveFingerTips) on DTXTouchVisualizerWindow
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeFromSuperview) on COSTouchSpotView
detox[33941] INFO:  [actions.js] Sync Timed: animateWithDuration:delay:options:animations:completion:
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers
detox[33941] INFO:  [actions.js] Sync App State: undefined
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeInactiveFingerTips) on DTXTouchVisualizerWindow
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeFromSuperview) on COSTouchSpotView
detox[33941] INFO:  [actions.js] Sync WXAnimatedDisplayLinkIdlingResource: undefined
detox[33941] INFO:  [actions.js] Sync App State: undefined
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync Timed: performSelector @selector(removeInactiveFingerTips) on DTXTouchVisualizerWindow
detox[33941] INFO:  [actions.js] Sync WXAnimatedDisplayLinkIdlingResource: undefined
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync WXAnimatedDisplayLinkIdlingResource: undefined
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers
detox[33941] INFO:  [actions.js] Sync Dispatch Queue: com.apple.main-thread
detox[33941] INFO:  [actions.js] Sync JavaScript Timers: Javascript Timers

Последние 3 строки повторяются до истечения времени ожидания теста.

и после запуска с launchArgs: { 'detoxPrintBusyIdleResources': 'YES' } и запуска xcrun simctl spawn booted log stream --level debug --style compact --predicate "category=='EarlGreyStatistics'":

Error from getpwuid_r: 0 (Undefined error: 0)
Filtering the log data using "category == "EarlGreyStatistics""

1 Ответ

0 голосов
/ 08 июля 2019

Проблема, с которой я столкнулся, действительно была вызвана анимацией, которая работала в бесконечном цикле, как упоминалось Лео Натан .

У меня был экран, который был смонтирован под текущим в стековом навигаторе с react-navigation. Размонтирование стека (и бесконечно анимированного экрана) с помощью reset решило проблему.

...