FBCommandStatus.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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 "FBCommandStatus.h"
  10. static NSString *const FB_UNKNOWN_ERROR = @"unknown error";
  11. static const HTTPStatusCode FB_UNKNOWN_ERROR_CODE = kHTTPStatusCodeInternalServerError;
  12. static NSString *const FB_UNKNOWN_ERROR_MSG = @"An unknown server-side error occurred while processing the command";
  13. static NSString *const FB_UNABLE_TO_CAPTURE_ERROR = @"unable to capture screen";
  14. static const HTTPStatusCode FB_UNABLE_TO_CAPTURE_ERROR_CODE = kHTTPStatusCodeInternalServerError;
  15. static NSString *const FB_UNABLE_TO_CAPTURE_MSG = @"A screen capture was made impossible";
  16. static NSString *const FB_NO_SUCH_ELEMENT_ERROR = @"no such element";
  17. static const HTTPStatusCode FB_NO_SUCH_ELEMENT_ERROR_CODE = kHTTPStatusCodeNotFound;
  18. static NSString *const FB_NO_SUCH_ELEMENT_MSG = @"An element could not be located on the page using the given search parameters";
  19. static NSString *const FB_INVALID_ELEMENT_STATE_ERROR = @"invalid element state";
  20. static const HTTPStatusCode FB_INVALID_ELEMENT_STATE_ERROR_CODE = kHTTPStatusCodeBadRequest;
  21. static NSString *const FB_INVALID_ELEMENT_STATE_MSG = @"An element command could not be completed because the element is in an invalid state (e.g. attempting to click a disabled element)";
  22. static NSString *const FB_INVALID_ARGUMENT_ERROR = @"invalid argument";
  23. static const HTTPStatusCode FB_INVALID_ARGUMENT_ERROR_CODE = kHTTPStatusCodeBadRequest;
  24. static NSString *const FB_INVALID_ARGUMENT_MSG = @"The arguments passed to the command are either invalid or malformed";
  25. static NSString *const FB_STALE_ELEMENT_REF_ERROR = @"stale element reference";
  26. static const HTTPStatusCode FB_STALE_ELEMENT_REF_ERROR_CODE = kHTTPStatusCodeNotFound;
  27. static NSString *const FB_STALE_ELEMENT_REF_MSG = @"An element command failed because the referenced element is no longer attached to the DOM";
  28. static NSString *const FB_INVALID_SELECTOR_ERROR = @"invalid selector";
  29. static const HTTPStatusCode FB_INVALID_SELECTOR_ERROR_CODE = kHTTPStatusCodeBadRequest;
  30. static NSString *const FB_INVALID_SELECTOR_MSG = @"Argument was an invalid selector (e.g. XPath/Class Chain)";
  31. static NSString *const FB_NO_ALERT_OPEN_ERROR = @"no such alert";
  32. static const HTTPStatusCode FB_NO_ALERT_OPEN_ERROR_CODE = kHTTPStatusCodeNotFound;
  33. static NSString *const FB_NO_ALERT_OPEN_MSG = @"An attempt was made to operate on a modal dialog when one was not open";
  34. static NSString *const FB_UNEXPECTED_ALERT_OPEN_ERROR = @"unexpected alert open";
  35. static const HTTPStatusCode FB_UNEXPECTED_ALERT_OPEN_ERROR_CODE = kHTTPStatusCodeInternalServerError;
  36. static NSString *const FB_UNEXPECTED_ALERT_OPEN_MSG = @"A modal dialog was open, blocking this operation";
  37. static NSString *const FB_NOT_IMPLEMENTED_ERROR = @"unknown method";
  38. static const HTTPStatusCode FB_NOT_IMPLEMENTED_ERROR_CODE = kHTTPStatusCodeMethodNotAllowed;
  39. static NSString *const FB_NOT_IMPLEMENTED_MSG = @"Method is not implemented";
  40. static NSString *const FB_SESSION_NOT_CREATED_ERROR = @"session not created";
  41. static const HTTPStatusCode FB_SESSION_NOT_CREATED_ERROR_CODE = kHTTPStatusCodeInternalServerError;
  42. static NSString *const FB_SESSION_NOT_CREATED_MSG = @"A new session could not be created";
  43. static NSString *const FB_INVALID_COORDINATES_ERROR = @"invalid coordinates";
  44. static const HTTPStatusCode FB_INVALID_COORDINATES_ERROR_CODE = kHTTPStatusCodeBadRequest;
  45. static NSString *const FB_INVALID_COORDINATES_MSG = @"The coordinates provided to an interactions operation are invalid";
  46. static NSString *const FB_UNSUPPORTED_OPERATION_ERROR = @"unsupported operation";
  47. static const HTTPStatusCode FB_UNSUPPORTED_OPERATION_ERROR_CODE = kHTTPStatusCodeInternalServerError;
  48. static NSString *const FB_UNSUPPORTED_OPERATION_ERROR_MSG = @"The requested operation is not supported";
  49. static NSString *const FB_UNKNOWN_COMMAND_ERROR = @"unknown command";
  50. static const HTTPStatusCode FB_UNKNOWN_COMMAND_ERROR_CODE = kHTTPStatusCodeNotFound;
  51. static NSString *const FB_UNKNOWN_COMMAND_MSG = @"The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource";
  52. static NSString *const FB_TIMEOUT_ERROR = @"timeout";
  53. static const HTTPStatusCode FB_TIMEOUT_ERROR_CODE = kHTTPStatusCodeRequestTimeout;
  54. static NSString *const FB_TIMEOUT_MSG = @"An operation did not complete before its timeout expired";
  55. static NSString *const FB_ELEMENT_NOT_VISIBLE_ERROR = @"element not visible";
  56. static const HTTPStatusCode FB_ELEMENT_NOT_VISIBLE_ERROR_CODE = kHTTPStatusCodeBadRequest;
  57. static NSString *const FB_ELEMENT_NOT_VISIBLE_MSG = @"An element command could not be completed because the element is not visible on the page";
  58. static NSString *const FB_NO_SUCH_DRIVER_ERROR = @"invalid session id";
  59. static const HTTPStatusCode FB_NO_SUCH_DRIVER_ERROR_CODE = kHTTPStatusCodeNotFound;
  60. static NSString *const FB_NO_SUCH_DRIVER_MSG = @"A session is either terminated or not started";
  61. @implementation FBCommandStatus
  62. - (instancetype)initWithValue:(nullable id)value
  63. {
  64. self = [super init];
  65. if (self) {
  66. _value = value;
  67. _message = nil;
  68. _error = nil;
  69. _traceback = nil;
  70. _statusCode = kHTTPStatusCodeOK;
  71. }
  72. return self;
  73. }
  74. - (instancetype)initWithError:(NSString *)error
  75. statusCode:(HTTPStatusCode)statusCode
  76. message:(NSString *)message
  77. traceback:(nullable NSString *)traceback
  78. {
  79. self = [super init];
  80. if (self) {
  81. _error = error;
  82. _statusCode = statusCode;
  83. _message = message;
  84. _traceback = traceback;
  85. _value = nil;
  86. }
  87. return self;
  88. }
  89. - (BOOL)hasError
  90. {
  91. return self.statusCode != kHTTPStatusCodeOK;
  92. }
  93. + (instancetype)ok
  94. {
  95. return [[FBCommandStatus alloc] initWithValue:nil];
  96. }
  97. + (instancetype)okWithValue:(id)value
  98. {
  99. return [[FBCommandStatus alloc] initWithValue:value];
  100. }
  101. + (instancetype)unknownErrorWithMessage:(NSString *)message
  102. traceback:(NSString *)traceback
  103. {
  104. return [[FBCommandStatus alloc] initWithError:FB_UNKNOWN_ERROR
  105. statusCode:FB_UNKNOWN_ERROR_CODE
  106. message:message ?: FB_UNKNOWN_ERROR_MSG
  107. traceback:traceback];
  108. }
  109. + (instancetype)unsupportedOperationErrorWithMessage:(NSString *)message
  110. traceback:(NSString *)traceback
  111. {
  112. return [[FBCommandStatus alloc] initWithError:FB_UNSUPPORTED_OPERATION_ERROR
  113. statusCode:FB_UNSUPPORTED_OPERATION_ERROR_CODE
  114. message:message ?: FB_UNSUPPORTED_OPERATION_ERROR_MSG
  115. traceback:traceback];
  116. }
  117. + (instancetype)unableToCaptureScreenErrorWithMessage:(NSString *)message
  118. traceback:(NSString *)traceback
  119. {
  120. return [[FBCommandStatus alloc] initWithError:FB_UNABLE_TO_CAPTURE_ERROR
  121. statusCode:FB_UNABLE_TO_CAPTURE_ERROR_CODE
  122. message:message ?: FB_UNABLE_TO_CAPTURE_MSG
  123. traceback:traceback];
  124. }
  125. + (instancetype)noSuchElementErrorWithMessage:(NSString *)message
  126. traceback:(NSString *)traceback
  127. {
  128. return [[FBCommandStatus alloc] initWithError:FB_NO_SUCH_ELEMENT_ERROR
  129. statusCode:FB_NO_SUCH_ELEMENT_ERROR_CODE
  130. message:message ?: FB_NO_SUCH_ELEMENT_MSG
  131. traceback:traceback];
  132. }
  133. + (instancetype)invalidElementStateErrorWithMessage:(NSString *)message
  134. traceback:(NSString *)traceback
  135. {
  136. return [[FBCommandStatus alloc] initWithError:FB_INVALID_ELEMENT_STATE_ERROR
  137. statusCode:FB_INVALID_ELEMENT_STATE_ERROR_CODE
  138. message:message ?: FB_INVALID_ELEMENT_STATE_MSG
  139. traceback:traceback];
  140. }
  141. + (instancetype)invalidArgumentErrorWithMessage:(NSString *)message
  142. traceback:(NSString *)traceback
  143. {
  144. return [[FBCommandStatus alloc] initWithError:FB_INVALID_ARGUMENT_ERROR
  145. statusCode:FB_INVALID_ARGUMENT_ERROR_CODE
  146. message:message ?: FB_INVALID_ARGUMENT_MSG
  147. traceback:traceback];
  148. }
  149. + (instancetype)staleElementReferenceErrorWithMessage:(NSString *)message
  150. traceback:(NSString *)traceback
  151. {
  152. return [[FBCommandStatus alloc] initWithError:FB_STALE_ELEMENT_REF_ERROR
  153. statusCode:FB_STALE_ELEMENT_REF_ERROR_CODE
  154. message:message ?: FB_STALE_ELEMENT_REF_MSG
  155. traceback:traceback];
  156. }
  157. + (instancetype)invalidSelectorErrorWithMessage:(NSString *)message
  158. traceback:(NSString *)traceback
  159. {
  160. return [[FBCommandStatus alloc] initWithError:FB_INVALID_SELECTOR_ERROR
  161. statusCode:FB_INVALID_SELECTOR_ERROR_CODE
  162. message:message ?: FB_INVALID_SELECTOR_MSG
  163. traceback:traceback];
  164. }
  165. + (instancetype)noAlertOpenErrorWithMessage:(NSString *)message
  166. traceback:(NSString *)traceback
  167. {
  168. return [[FBCommandStatus alloc] initWithError:FB_NO_ALERT_OPEN_ERROR
  169. statusCode:FB_NO_ALERT_OPEN_ERROR_CODE
  170. message:message ?: FB_NO_ALERT_OPEN_MSG
  171. traceback:traceback];
  172. }
  173. + (instancetype)unexpectedAlertOpenErrorWithMessage:(NSString *)message
  174. traceback:(NSString *)traceback
  175. {
  176. return [[FBCommandStatus alloc] initWithError:FB_UNEXPECTED_ALERT_OPEN_ERROR
  177. statusCode:FB_UNEXPECTED_ALERT_OPEN_ERROR_CODE
  178. message:message ?: FB_UNEXPECTED_ALERT_OPEN_MSG
  179. traceback:traceback];
  180. }
  181. + (instancetype)notImplementedErrorWithMessage:(NSString *)message
  182. traceback:(NSString *)traceback
  183. {
  184. return [[FBCommandStatus alloc] initWithError:FB_NOT_IMPLEMENTED_ERROR
  185. statusCode:FB_NOT_IMPLEMENTED_ERROR_CODE
  186. message:message ?: FB_NOT_IMPLEMENTED_MSG
  187. traceback:traceback];
  188. }
  189. + (instancetype)sessionNotCreatedError:(NSString *)message
  190. traceback:(NSString *)traceback
  191. {
  192. return [[FBCommandStatus alloc] initWithError:FB_SESSION_NOT_CREATED_ERROR
  193. statusCode:FB_SESSION_NOT_CREATED_ERROR_CODE
  194. message:message ?: FB_SESSION_NOT_CREATED_MSG
  195. traceback:traceback];
  196. }
  197. + (instancetype)invalidCoordinatesErrorWithMessage:(NSString *)message
  198. traceback:(NSString *)traceback
  199. {
  200. return [[FBCommandStatus alloc] initWithError:FB_INVALID_COORDINATES_ERROR
  201. statusCode:FB_INVALID_COORDINATES_ERROR_CODE
  202. message:message ?: FB_INVALID_COORDINATES_MSG
  203. traceback:traceback];
  204. }
  205. + (instancetype)unknownCommandErrorWithMessage:(NSString *)message
  206. traceback:(NSString *)traceback
  207. {
  208. return [[FBCommandStatus alloc] initWithError:FB_UNKNOWN_COMMAND_ERROR
  209. statusCode:FB_UNKNOWN_COMMAND_ERROR_CODE
  210. message:message ?: FB_UNKNOWN_COMMAND_MSG
  211. traceback:traceback];
  212. }
  213. + (instancetype)timeoutErrorWithMessage:(NSString *)message
  214. traceback:(NSString *)traceback
  215. {
  216. return [[FBCommandStatus alloc] initWithError:FB_TIMEOUT_ERROR
  217. statusCode:FB_TIMEOUT_ERROR_CODE
  218. message:message ?: FB_TIMEOUT_MSG
  219. traceback:traceback];
  220. }
  221. + (instancetype)elementNotVisibleErrorWithMessage:(NSString *)message
  222. traceback:(NSString *)traceback
  223. {
  224. return [[FBCommandStatus alloc] initWithError:FB_ELEMENT_NOT_VISIBLE_ERROR
  225. statusCode:FB_ELEMENT_NOT_VISIBLE_ERROR_CODE
  226. message:message ?: FB_ELEMENT_NOT_VISIBLE_MSG
  227. traceback:traceback];
  228. }
  229. + (instancetype)noSuchDriverErrorWithMessage:(NSString *)message
  230. traceback:(NSString *)traceback
  231. {
  232. return [[FBCommandStatus alloc] initWithError:FB_NO_SUCH_DRIVER_ERROR
  233. statusCode:FB_NO_SUCH_DRIVER_ERROR_CODE
  234. message:message ?: FB_NO_SUCH_DRIVER_MSG
  235. traceback:traceback];
  236. }
  237. @end