FBKeyboard.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /**
  2. * Copyright (c) 2015-present, Facebook, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. */
  9. #import "FBKeyboard.h"
  10. #import "FBConfiguration.h"
  11. #import "FBXCTestDaemonsProxy.h"
  12. #import "FBErrorBuilder.h"
  13. #import "FBRunLoopSpinner.h"
  14. #import "FBMacros.h"
  15. #import "FBXCodeCompatibility.h"
  16. #import "XCUIElement+FBUtilities.h"
  17. #import "XCUIElement+FBIsVisible.h"
  18. #import "XCTestDriver.h"
  19. #import "FBLogger.h"
  20. #import "FBConfiguration.h"
  21. @implementation FBKeyboard
  22. + (BOOL)waitUntilVisibleForApplication:(XCUIApplication *)app
  23. timeout:(NSTimeInterval)timeout
  24. error:(NSError **)error
  25. {
  26. BOOL (^isKeyboardVisible)(void) = ^BOOL(void) {
  27. XCUIElement *keyboard = app.keyboards.fb_firstMatch;
  28. if (nil == keyboard) {
  29. return NO;
  30. }
  31. NSPredicate *keySearchPredicate = [NSPredicate predicateWithBlock:^BOOL(id<FBXCElementSnapshot> snapshot,
  32. NSDictionary *bindings) {
  33. return snapshot.label.length > 0;
  34. }];
  35. XCUIElement *firstKey = [[keyboard descendantsMatchingType:XCUIElementTypeKey]
  36. matchingPredicate:keySearchPredicate].allElementsBoundByIndex.firstObject;
  37. return firstKey.exists && firstKey.hittable;
  38. };
  39. NSString* errMessage = @"The on-screen keyboard must be present to send keys";
  40. if (timeout <= 0) {
  41. if (!isKeyboardVisible()) {
  42. return [[[FBErrorBuilder builder] withDescription:errMessage] buildError:error];
  43. }
  44. return YES;
  45. }
  46. return
  47. [[[[FBRunLoopSpinner new]
  48. timeout:timeout]
  49. timeoutErrorMessage:errMessage]
  50. spinUntilTrue:isKeyboardVisible
  51. error:error];
  52. }
  53. #if (!TARGET_OS_TV && __clang_major__ >= 15)
  54. + (NSString *)keyValueForName:(NSString *)name
  55. {
  56. static dispatch_once_t onceKeys;
  57. static NSDictionary<NSString *, NSString *> *keysMapping;
  58. dispatch_once(&onceKeys, ^{
  59. keysMapping = @{
  60. @"XCUIKeyboardKeyDelete": XCUIKeyboardKeyDelete,
  61. @"XCUIKeyboardKeyReturn": XCUIKeyboardKeyReturn,
  62. @"XCUIKeyboardKeyEnter": XCUIKeyboardKeyEnter,
  63. @"XCUIKeyboardKeyTab": XCUIKeyboardKeyTab,
  64. @"XCUIKeyboardKeySpace": XCUIKeyboardKeySpace,
  65. @"XCUIKeyboardKeyEscape": XCUIKeyboardKeyEscape,
  66. @"XCUIKeyboardKeyUpArrow": XCUIKeyboardKeyUpArrow,
  67. @"XCUIKeyboardKeyDownArrow": XCUIKeyboardKeyDownArrow,
  68. @"XCUIKeyboardKeyLeftArrow": XCUIKeyboardKeyLeftArrow,
  69. @"XCUIKeyboardKeyRightArrow": XCUIKeyboardKeyRightArrow,
  70. @"XCUIKeyboardKeyF1": XCUIKeyboardKeyF1,
  71. @"XCUIKeyboardKeyF2": XCUIKeyboardKeyF2,
  72. @"XCUIKeyboardKeyF3": XCUIKeyboardKeyF3,
  73. @"XCUIKeyboardKeyF4": XCUIKeyboardKeyF4,
  74. @"XCUIKeyboardKeyF5": XCUIKeyboardKeyF5,
  75. @"XCUIKeyboardKeyF6": XCUIKeyboardKeyF6,
  76. @"XCUIKeyboardKeyF7": XCUIKeyboardKeyF7,
  77. @"XCUIKeyboardKeyF8": XCUIKeyboardKeyF8,
  78. @"XCUIKeyboardKeyF9": XCUIKeyboardKeyF9,
  79. @"XCUIKeyboardKeyF10": XCUIKeyboardKeyF10,
  80. @"XCUIKeyboardKeyF11": XCUIKeyboardKeyF11,
  81. @"XCUIKeyboardKeyF12": XCUIKeyboardKeyF12,
  82. @"XCUIKeyboardKeyF13": XCUIKeyboardKeyF13,
  83. @"XCUIKeyboardKeyF14": XCUIKeyboardKeyF14,
  84. @"XCUIKeyboardKeyF15": XCUIKeyboardKeyF15,
  85. @"XCUIKeyboardKeyF16": XCUIKeyboardKeyF16,
  86. @"XCUIKeyboardKeyF17": XCUIKeyboardKeyF17,
  87. @"XCUIKeyboardKeyF18": XCUIKeyboardKeyF18,
  88. @"XCUIKeyboardKeyF19": XCUIKeyboardKeyF19,
  89. @"XCUIKeyboardKeyForwardDelete": XCUIKeyboardKeyForwardDelete,
  90. @"XCUIKeyboardKeyHome": XCUIKeyboardKeyHome,
  91. @"XCUIKeyboardKeyEnd": XCUIKeyboardKeyEnd,
  92. @"XCUIKeyboardKeyPageUp": XCUIKeyboardKeyPageUp,
  93. @"XCUIKeyboardKeyPageDown": XCUIKeyboardKeyPageDown,
  94. @"XCUIKeyboardKeyClear": XCUIKeyboardKeyClear,
  95. @"XCUIKeyboardKeyHelp": XCUIKeyboardKeyHelp,
  96. @"XCUIKeyboardKeyCapsLock": XCUIKeyboardKeyCapsLock,
  97. @"XCUIKeyboardKeyShift": XCUIKeyboardKeyShift,
  98. @"XCUIKeyboardKeyControl": XCUIKeyboardKeyControl,
  99. @"XCUIKeyboardKeyOption": XCUIKeyboardKeyOption,
  100. @"XCUIKeyboardKeyCommand": XCUIKeyboardKeyCommand,
  101. @"XCUIKeyboardKeyRightShift": XCUIKeyboardKeyRightShift,
  102. @"XCUIKeyboardKeyRightControl": XCUIKeyboardKeyRightControl,
  103. @"XCUIKeyboardKeyRightOption": XCUIKeyboardKeyRightOption,
  104. @"XCUIKeyboardKeyRightCommand": XCUIKeyboardKeyRightCommand,
  105. @"XCUIKeyboardKeySecondaryFn": XCUIKeyboardKeySecondaryFn
  106. };
  107. });
  108. return keysMapping[name];
  109. }
  110. #endif
  111. @end