selenium-webdriver 3.6.0 → 4.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGES.md +181 -0
  2. package/README.md +25 -27
  3. package/chrome.js +113 -127
  4. package/edge.js +42 -117
  5. package/example/chrome_android.js +8 -8
  6. package/example/chrome_mobile_emulation.js +8 -8
  7. package/example/firefox_channels.js +22 -18
  8. package/example/google_search_test.js +39 -26
  9. package/example/logging.js +39 -6
  10. package/firefox.js +769 -0
  11. package/http/index.js +41 -4
  12. package/http/util.js +11 -6
  13. package/ie.js +56 -97
  14. package/index.js +178 -114
  15. package/jasmine.json +11 -0
  16. package/lib/actions.js +68 -63
  17. package/lib/by.js +1 -1
  18. package/lib/capabilities.js +255 -192
  19. package/lib/command.js +26 -50
  20. package/lib/error.js +85 -44
  21. package/lib/http.js +133 -110
  22. package/lib/input.js +1044 -8
  23. package/lib/promise.js +222 -3323
  24. package/lib/proxy.js +134 -39
  25. package/lib/test/bootstrap_jasmine.js +28 -0
  26. package/lib/test/data/actions/click.html +24 -0
  27. package/lib/test/data/actions/drag.html +77 -0
  28. package/lib/test/data/actions/record_click.html +21 -0
  29. package/lib/test/data/chrome/download.html +2 -0
  30. package/lib/test/data/inputs.html +42 -0
  31. package/lib/test/data/selectPage.html +12 -0
  32. package/lib/test/data/simpleTest.html +5 -0
  33. package/lib/test/data/upload_invisible.html +45 -0
  34. package/lib/test/fileserver.js +23 -19
  35. package/lib/test/index.js +30 -212
  36. package/lib/test/resources.js +0 -1
  37. package/lib/webdriver.js +675 -936
  38. package/net/index.js +21 -25
  39. package/net/portprober.js +51 -68
  40. package/package.json +5 -3
  41. package/remote/index.js +5 -19
  42. package/safari.js +41 -128
  43. package/test/actions_test.js +173 -18
  44. package/test/{session_test.js → builder_test.js} +44 -37
  45. package/test/chrome/devtools_test.js +93 -0
  46. package/test/chrome/options_test.js +48 -154
  47. package/test/chrome/service_test.js +7 -7
  48. package/test/cookie_test.js +77 -63
  49. package/test/element_finding_test.js +206 -201
  50. package/test/execute_script_test.js +115 -114
  51. package/test/fingerprint_test.js +16 -15
  52. package/test/firefox_test.js +251 -0
  53. package/test/http/http_test.js +0 -1
  54. package/test/http/util_test.js +2 -2
  55. package/test/io/zip_test.js +6 -7
  56. package/test/lib/error_test.js +34 -7
  57. package/test/lib/http_test.js +8 -128
  58. package/test/lib/input_test.js +1379 -0
  59. package/test/lib/promise_test.js +473 -908
  60. package/test/lib/webdriver_test.js +296 -868
  61. package/test/logging_test.js +37 -43
  62. package/test/page_loading_test.js +71 -81
  63. package/test/proxy_test.js +64 -72
  64. package/test/rect_test.js +14 -25
  65. package/test/remote_test.js +10 -29
  66. package/test/safari_test.js +7 -71
  67. package/test/stale_element_test.js +20 -23
  68. package/test/tag_name_test.js +10 -9
  69. package/test/upload_test.js +27 -35
  70. package/test/window_test.js +72 -85
  71. package/testing/index.js +386 -314
  72. package/.npmignore +0 -2
  73. package/example/async_await_test.js +0 -69
  74. package/example/google_search_generator.js +0 -47
  75. package/example/parallel_flows.js +0 -51
  76. package/firefox/binary.js +0 -347
  77. package/firefox/extension.js +0 -224
  78. package/firefox/index.js +0 -576
  79. package/firefox/profile.js +0 -311
  80. package/lib/events.js +0 -210
  81. package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
  82. package/lib/test/data/firefox/sample.xpi +0 -0
  83. package/lib/test/promise.js +0 -79
  84. package/opera.js +0 -405
  85. package/phantomjs.js +0 -282
  86. package/test/firefox/extension_test.js +0 -120
  87. package/test/firefox/firefox_test.js +0 -244
  88. package/test/firefox/profile_test.js +0 -140
  89. package/test/lib/events_test.js +0 -177
  90. package/test/lib/promise_aplus_test.js +0 -78
  91. package/test/lib/promise_error_test.js +0 -884
  92. package/test/lib/promise_flow_test.js +0 -2288
  93. package/test/lib/promise_generator_test.js +0 -310
  94. package/test/phantomjs/execute_phantomjs_test.js +0 -59
  95. package/test/testing/assert_test.js +0 -373
  96. package/test/testing/index_test.js +0 -224
  97. package/testing/assert.js +0 -378
package/lib/command.js CHANGED
@@ -90,7 +90,6 @@ const Name = {
90
90
 
91
91
  NEW_SESSION: 'newSession',
92
92
  GET_SESSIONS: 'getSessions',
93
- DESCRIBE_SESSION: 'getSessionCapabilities',
94
93
 
95
94
  CLOSE: 'close',
96
95
  QUIT: 'quit',
@@ -124,10 +123,15 @@ const Name = {
124
123
  SET_WINDOW_POSITION: 'setWindowPosition',
125
124
  GET_WINDOW_SIZE: 'getWindowSize',
126
125
  SET_WINDOW_SIZE: 'setWindowSize',
126
+ GET_WINDOW_RECT: 'getWindowRect',
127
+ SET_WINDOW_RECT: 'setWindowRect',
127
128
  MAXIMIZE_WINDOW: 'maximizeWindow',
129
+ MINIMIZE_WINDOW: 'minimizeWindow',
130
+ FULLSCREEN_WINDOW: 'fullscreenWindow',
128
131
 
129
132
  SWITCH_TO_WINDOW: 'switchToWindow',
130
133
  SWITCH_TO_FRAME: 'switchToFrame',
134
+ SWITCH_TO_FRAME_PARENT: 'switchToFrameParent',
131
135
  GET_PAGE_SOURCE: 'getPageSource',
132
136
  GET_TITLE: 'getTitle',
133
137
 
@@ -141,10 +145,10 @@ const Name = {
141
145
  IS_ELEMENT_DISPLAYED: 'isElementDisplayed',
142
146
  GET_ELEMENT_LOCATION: 'getElementLocation',
143
147
  GET_ELEMENT_LOCATION_IN_VIEW: 'getElementLocationOnceScrolledIntoView',
148
+ GET_ELEMENT_RECT: 'getElementRect',
144
149
  GET_ELEMENT_SIZE: 'getElementSize',
145
150
  GET_ELEMENT_ATTRIBUTE: 'getElementAttribute',
146
151
  GET_ELEMENT_VALUE_OF_CSS_PROPERTY: 'getElementValueOfCssProperty',
147
- ELEMENT_EQUALS: 'elementEquals',
148
152
 
149
153
  SCREENSHOT: 'screenshot',
150
154
  TAKE_ELEMENT_SCREENSHOT: 'takeElementScreenshot',
@@ -158,66 +162,38 @@ const Name = {
158
162
  DISMISS_ALERT: 'dismissAlert',
159
163
  GET_ALERT_TEXT: 'getAlertText',
160
164
  SET_ALERT_TEXT: 'setAlertValue',
161
- SET_ALERT_CREDENTIALS: 'setAlertCredentials',
162
-
163
- EXECUTE_SQL: 'executeSQL',
164
- GET_LOCATION: 'getLocation',
165
- SET_LOCATION: 'setLocation',
166
- GET_APP_CACHE: 'getAppCache',
167
- GET_APP_CACHE_STATUS: 'getStatus',
168
- CLEAR_APP_CACHE: 'clearAppCache',
169
- IS_BROWSER_ONLINE: 'isBrowserOnline',
170
- SET_BROWSER_ONLINE: 'setBrowserOnline',
171
-
172
- GET_LOCAL_STORAGE_ITEM: 'getLocalStorageItem',
173
- GET_LOCAL_STORAGE_KEYS: 'getLocalStorageKeys',
174
- SET_LOCAL_STORAGE_ITEM: 'setLocalStorageItem',
175
- REMOVE_LOCAL_STORAGE_ITEM: 'removeLocalStorageItem',
176
- CLEAR_LOCAL_STORAGE: 'clearLocalStorage',
177
- GET_LOCAL_STORAGE_SIZE: 'getLocalStorageSize',
178
-
179
- GET_SESSION_STORAGE_ITEM: 'getSessionStorageItem',
180
- GET_SESSION_STORAGE_KEYS: 'getSessionStorageKey',
181
- SET_SESSION_STORAGE_ITEM: 'setSessionStorageItem',
182
- REMOVE_SESSION_STORAGE_ITEM: 'removeSessionStorageItem',
183
- CLEAR_SESSION_STORAGE: 'clearSessionStorage',
184
- GET_SESSION_STORAGE_SIZE: 'getSessionStorageSize',
185
-
186
- SET_SCREEN_ORIENTATION: 'setScreenOrientation',
187
- GET_SCREEN_ORIENTATION: 'getScreenOrientation',
188
-
189
- // These belong to the Advanced user interactions - an element is
190
- // optional for these commands.
191
- CLICK: 'mouseClick',
192
- DOUBLE_CLICK: 'mouseDoubleClick',
193
- MOUSE_DOWN: 'mouseButtonDown',
194
- MOUSE_UP: 'mouseButtonUp',
195
- MOVE_TO: 'mouseMoveTo',
196
- SEND_KEYS_TO_ACTIVE_ELEMENT: 'sendKeysToActiveElement',
197
-
198
- // These belong to the Advanced Touch API
199
- TOUCH_SINGLE_TAP: 'touchSingleTap',
200
- TOUCH_DOWN: 'touchDown',
201
- TOUCH_UP: 'touchUp',
202
- TOUCH_MOVE: 'touchMove',
203
- TOUCH_SCROLL: 'touchScroll',
204
- TOUCH_DOUBLE_TAP: 'touchDoubleTap',
205
- TOUCH_LONG_PRESS: 'touchLongPress',
206
- TOUCH_FLICK: 'touchFlick',
207
165
 
208
166
  GET_AVAILABLE_LOG_TYPES: 'getAvailableLogTypes',
209
167
  GET_LOG: 'getLog',
210
168
  GET_SESSION_LOGS: 'getSessionLogs',
211
169
 
212
170
  // Non-standard commands used by the standalone Selenium server.
213
- UPLOAD_FILE: 'uploadFile'
171
+ UPLOAD_FILE: 'uploadFile',
172
+
173
+ ACTIONS: 'actions',
174
+ CLEAR_ACTIONS: 'clearActions',
175
+
176
+ LEGACY_ACTION_CLICK: 'legacyAction:click',
177
+ LEGACY_ACTION_DOUBLE_CLICK: 'legacyAction:doubleclick',
178
+ LEGACY_ACTION_MOUSE_DOWN: 'legacyAction:mouseDown',
179
+ LEGACY_ACTION_MOUSE_UP: 'legacyAction:mouseUp',
180
+ LEGACY_ACTION_MOUSE_MOVE: 'legacyAction:mouseMove',
181
+ LEGACY_ACTION_SEND_KEYS: 'legacyAction:sendKeys',
182
+ LEGACY_ACTION_TOUCH_DOWN: 'legacyAction:touchDown',
183
+ LEGACY_ACTION_TOUCH_UP: 'legacyAction:touchUp',
184
+ LEGACY_ACTION_TOUCH_MOVE: 'legacyAction:touchMove',
185
+ LEGACY_ACTION_TOUCH_SCROLL: 'legacyAction:touchScroll',
186
+ LEGACY_ACTION_TOUCH_LONG_PRESS: 'legacyAction:touchLongPress',
187
+ LEGACY_ACTION_TOUCH_FLICK: 'legacyAction:touchFlick',
188
+ LEGACY_ACTION_TOUCH_SINGLE_TAP: 'legacyAction:singleTap',
189
+ LEGACY_ACTION_TOUCH_DOUBLE_TAP: 'legacyAction:doubleTap',
214
190
  };
215
191
 
216
192
 
217
193
 
218
194
  /**
219
195
  * Handles the execution of WebDriver {@link Command commands}.
220
- * @interface
196
+ * @record
221
197
  */
222
198
  class Executor {
223
199
  /**
package/lib/error.js CHANGED
@@ -40,6 +40,19 @@ class WebDriverError extends Error {
40
40
  }
41
41
 
42
42
 
43
+ /**
44
+ * Indicates a {@linkplain ./webdriver.WebElement#click click command} could not
45
+ * completed because the click target is obscured by other elements on the
46
+ * page.
47
+ */
48
+ class ElementClickInterceptedError extends WebDriverError {
49
+ /** @param {string=} opt_error the error message, if any. */
50
+ constructor(opt_error) {
51
+ super(opt_error);
52
+ }
53
+ }
54
+
55
+
43
56
  /**
44
57
  * An attempt was made to select an element that cannot be selected.
45
58
  */
@@ -66,12 +79,10 @@ class ElementNotInteractableError extends WebDriverError {
66
79
 
67
80
 
68
81
  /**
69
- * An element command could not be completed because the element is not visible
70
- * on the page.
71
- *
72
- * @deprecated Use {@link ElementNotInteractable} instead.
82
+ * Indicates a navigation event caused the browser to generate a certificate
83
+ * warning. This is usually caused by an expired or invalid TLS certificate.
73
84
  */
74
- class ElementNotVisibleError extends ElementNotInteractableError {
85
+ class InsecureCertificateError extends WebDriverError {
75
86
  /** @param {string=} opt_error the error message, if any. */
76
87
  constructor(opt_error) {
77
88
  super(opt_error);
@@ -105,7 +116,7 @@ class InvalidCookieDomainError extends WebDriverError {
105
116
  /**
106
117
  * The coordinates provided to an interactions operation are invalid.
107
118
  */
108
- class InvalidElementCoordinatesError extends WebDriverError {
119
+ class InvalidCoordinatesError extends WebDriverError {
109
120
  /** @param {string=} opt_error the error message, if any. */
110
121
  constructor(opt_error) {
111
122
  super(opt_error);
@@ -182,6 +193,18 @@ class NoSuchAlertError extends WebDriverError {
182
193
  }
183
194
 
184
195
 
196
+ /**
197
+ * Indicates a named cookie could not be found in the cookie jar for the
198
+ * currently selected document.
199
+ */
200
+ class NoSuchCookieError extends WebDriverError {
201
+ /** @param {string=} opt_error the error message, if any. */
202
+ constructor(opt_error) {
203
+ super(opt_error);
204
+ }
205
+ }
206
+
207
+
185
208
  /**
186
209
  * An element could not be located on the page using the given search
187
210
  * parameters.
@@ -356,6 +379,7 @@ class UnsupportedOperationError extends WebDriverError {
356
379
  */
357
380
  const ErrorCode = {
358
381
  SUCCESS: 0,
382
+ NO_SUCH_SESSION: 6,
359
383
  NO_SUCH_ELEMENT: 7,
360
384
  NO_SUCH_FRAME: 8,
361
385
  UNKNOWN_COMMAND: 9,
@@ -383,16 +407,21 @@ const ErrorCode = {
383
407
  SQL_DATABASE_ERROR: 35,
384
408
  INVALID_XPATH_SELECTOR: 51,
385
409
  INVALID_XPATH_SELECTOR_RETURN_TYPE: 52,
410
+ ELEMENT_NOT_INTERACTABLE: 60,
411
+ INVALID_ARGUMENT: 61,
412
+ NO_SUCH_COOKIE: 62,
413
+ UNABLE_TO_CAPTURE_SCREEN: 63,
414
+ ELEMENT_CLICK_INTERCEPTED: 64,
386
415
  METHOD_NOT_ALLOWED: 405
387
416
  };
388
417
 
389
418
 
390
419
  const LEGACY_ERROR_CODE_TO_TYPE = new Map([
420
+ [ErrorCode.NO_SUCH_SESSION, NoSuchSessionError],
391
421
  [ErrorCode.NO_SUCH_ELEMENT, NoSuchElementError],
392
422
  [ErrorCode.NO_SUCH_FRAME, NoSuchFrameError],
393
423
  [ErrorCode.UNSUPPORTED_OPERATION, UnsupportedOperationError],
394
424
  [ErrorCode.STALE_ELEMENT_REFERENCE, StaleElementReferenceError],
395
- [ErrorCode.ELEMENT_NOT_VISIBLE, ElementNotVisibleError],
396
425
  [ErrorCode.INVALID_ELEMENT_STATE, InvalidElementStateError],
397
426
  [ErrorCode.UNKNOWN_ERROR, WebDriverError],
398
427
  [ErrorCode.ELEMENT_NOT_SELECTABLE, ElementNotSelectableError],
@@ -405,29 +434,36 @@ const LEGACY_ERROR_CODE_TO_TYPE = new Map([
405
434
  [ErrorCode.UNEXPECTED_ALERT_OPEN, UnexpectedAlertOpenError],
406
435
  [ErrorCode.NO_SUCH_ALERT, NoSuchAlertError],
407
436
  [ErrorCode.SCRIPT_TIMEOUT, ScriptTimeoutError],
408
- [ErrorCode.INVALID_ELEMENT_COORDINATES, InvalidElementCoordinatesError],
437
+ [ErrorCode.INVALID_ELEMENT_COORDINATES, InvalidCoordinatesError],
409
438
  [ErrorCode.INVALID_SELECTOR_ERROR, InvalidSelectorError],
410
439
  [ErrorCode.SESSION_NOT_CREATED, SessionNotCreatedError],
411
440
  [ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS, MoveTargetOutOfBoundsError],
412
441
  [ErrorCode.INVALID_XPATH_SELECTOR, InvalidSelectorError],
413
442
  [ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPE, InvalidSelectorError],
443
+ [ErrorCode.ELEMENT_NOT_INTERACTABLE, ElementNotInteractableError],
444
+ [ErrorCode.INVALID_ARGUMENT, InvalidArgumentError],
445
+ [ErrorCode.NO_SUCH_COOKIE, NoSuchCookieError],
446
+ [ErrorCode.UNABLE_TO_CAPTURE_SCREEN, UnableToCaptureScreenError],
447
+ [ErrorCode.ELEMENT_CLICK_INTERCEPTED, ElementClickInterceptedError],
414
448
  [ErrorCode.METHOD_NOT_ALLOWED, UnsupportedOperationError]]);
415
449
 
416
450
 
417
451
  const ERROR_CODE_TO_TYPE = new Map([
418
452
  ['unknown error', WebDriverError],
453
+ ['element click intercepted', ElementClickInterceptedError],
419
454
  ['element not interactable', ElementNotInteractableError],
420
455
  ['element not selectable', ElementNotSelectableError],
421
- ['element not visible', ElementNotVisibleError],
456
+ ['insecure certificate', InsecureCertificateError],
422
457
  ['invalid argument', InvalidArgumentError],
423
458
  ['invalid cookie domain', InvalidCookieDomainError],
424
- ['invalid element coordinates', InvalidElementCoordinatesError],
459
+ ['invalid coordinates', InvalidCoordinatesError],
425
460
  ['invalid element state', InvalidElementStateError],
426
461
  ['invalid selector', InvalidSelectorError],
427
462
  ['invalid session id', NoSuchSessionError],
428
463
  ['javascript error', JavascriptError],
429
464
  ['move target out of bounds', MoveTargetOutOfBoundsError],
430
465
  ['no such alert', NoSuchAlertError],
466
+ ['no such cookie', NoSuchCookieError],
431
467
  ['no such element', NoSuchElementError],
432
468
  ['no such frame', NoSuchFrameError],
433
469
  ['no such window', NoSuchWindowError],
@@ -512,8 +548,11 @@ function throwDecodedError(data) {
512
548
  if (isErrorResponse(data)) {
513
549
  let ctor = ERROR_CODE_TO_TYPE.get(data.error) || WebDriverError;
514
550
  let err = new ctor(data.message);
551
+ // TODO(jleyba): remove whichever case is excluded from the final W3C spec.
515
552
  if (typeof data.stacktrace === 'string') {
516
553
  err.remoteStacktrace = data.stacktrace;
554
+ } else if (typeof data.stackTrace === 'string') {
555
+ err.remoteStacktrace = data.stackTrace;
517
556
  }
518
557
  throw err;
519
558
  }
@@ -561,38 +600,40 @@ function checkLegacyResponse(responseObj) {
561
600
 
562
601
 
563
602
  module.exports = {
564
- ErrorCode: ErrorCode,
565
-
566
- WebDriverError: WebDriverError,
567
- ElementNotInteractableError: ElementNotInteractableError,
568
- ElementNotSelectableError: ElementNotSelectableError,
569
- ElementNotVisibleError: ElementNotVisibleError,
570
- InvalidArgumentError: InvalidArgumentError,
571
- InvalidCookieDomainError: InvalidCookieDomainError,
572
- InvalidElementCoordinatesError: InvalidElementCoordinatesError,
573
- InvalidElementStateError: InvalidElementStateError,
574
- InvalidSelectorError: InvalidSelectorError,
575
- JavascriptError: JavascriptError,
576
- MoveTargetOutOfBoundsError: MoveTargetOutOfBoundsError,
577
- NoSuchAlertError: NoSuchAlertError,
578
- NoSuchElementError: NoSuchElementError,
579
- NoSuchFrameError: NoSuchFrameError,
580
- NoSuchSessionError: NoSuchSessionError,
581
- NoSuchWindowError: NoSuchWindowError,
582
- ScriptTimeoutError: ScriptTimeoutError,
583
- SessionNotCreatedError: SessionNotCreatedError,
584
- StaleElementReferenceError: StaleElementReferenceError,
585
- TimeoutError: TimeoutError,
586
- UnableToSetCookieError: UnableToSetCookieError,
587
- UnableToCaptureScreenError: UnableToCaptureScreenError,
588
- UnexpectedAlertOpenError: UnexpectedAlertOpenError,
589
- UnknownCommandError: UnknownCommandError,
590
- UnknownMethodError: UnknownMethodError,
591
- UnsupportedOperationError: UnsupportedOperationError,
592
-
593
- checkResponse: checkResponse,
594
- checkLegacyResponse: checkLegacyResponse,
595
- encodeError: encodeError,
596
- isErrorResponse: isErrorResponse,
597
- throwDecodedError: throwDecodedError,
603
+ ErrorCode,
604
+
605
+ WebDriverError,
606
+ ElementClickInterceptedError,
607
+ ElementNotInteractableError,
608
+ ElementNotSelectableError,
609
+ InsecureCertificateError,
610
+ InvalidArgumentError,
611
+ InvalidCookieDomainError,
612
+ InvalidCoordinatesError,
613
+ InvalidElementStateError,
614
+ InvalidSelectorError,
615
+ JavascriptError,
616
+ MoveTargetOutOfBoundsError,
617
+ NoSuchAlertError,
618
+ NoSuchCookieError,
619
+ NoSuchElementError,
620
+ NoSuchFrameError,
621
+ NoSuchSessionError,
622
+ NoSuchWindowError,
623
+ ScriptTimeoutError,
624
+ SessionNotCreatedError,
625
+ StaleElementReferenceError,
626
+ TimeoutError,
627
+ UnableToSetCookieError,
628
+ UnableToCaptureScreenError,
629
+ UnexpectedAlertOpenError,
630
+ UnknownCommandError,
631
+ UnknownMethodError,
632
+ UnsupportedOperationError,
633
+
634
+ checkResponse,
635
+ checkLegacyResponse,
636
+ encodeError,
637
+ isErrorResponse,
638
+ throwDecodedError,
598
639
  };