У меня есть тест, который использует 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""