selenium-webdriver 4.0.0-alpha.5 → 4.0.0-beta.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 (49) hide show
  1. package/CHANGES.md +35 -1
  2. package/LICENSE +1 -1
  3. package/NOTICE +1 -1
  4. package/README.md +4 -4
  5. package/chrome.js +72 -592
  6. package/chromium.js +829 -0
  7. package/devtools/CDPConnection.js +37 -0
  8. package/edge.js +124 -86
  9. package/example/chrome_android.js +16 -13
  10. package/example/chrome_mobile_emulation.js +18 -14
  11. package/example/firefox_channels.js +35 -28
  12. package/example/google_search.js +9 -9
  13. package/example/google_search_test.js +20 -22
  14. package/example/headless.js +27 -19
  15. package/example/logging.js +34 -38
  16. package/firefox.js +200 -200
  17. package/http/index.js +131 -115
  18. package/http/util.js +56 -64
  19. package/ie.js +180 -104
  20. package/index.js +246 -199
  21. package/io/exec.js +34 -39
  22. package/io/index.js +142 -152
  23. package/io/zip.js +75 -65
  24. package/lib/actions.js +140 -122
  25. package/lib/atoms/find-elements.js +124 -0
  26. package/lib/atoms/get-attribute.js +79 -59
  27. package/lib/atoms/is-displayed.js +72 -73
  28. package/lib/atoms/mutation-listener.js +38 -0
  29. package/lib/by.js +192 -65
  30. package/lib/capabilities.js +82 -78
  31. package/lib/command.js +20 -20
  32. package/lib/error.js +134 -168
  33. package/lib/http.js +337 -230
  34. package/lib/input.js +325 -302
  35. package/lib/logging.js +127 -138
  36. package/lib/promise.js +60 -66
  37. package/lib/proxy.js +31 -41
  38. package/lib/session.js +12 -15
  39. package/lib/symbols.js +3 -4
  40. package/lib/until.js +162 -160
  41. package/lib/webdriver.js +1024 -541
  42. package/net/index.js +30 -36
  43. package/net/portprober.js +31 -144
  44. package/opera.js +406 -0
  45. package/package.json +19 -12
  46. package/proxy.js +2 -2
  47. package/remote/index.js +190 -187
  48. package/safari.js +40 -49
  49. package/testing/index.js +166 -155
package/lib/logging.js CHANGED
@@ -15,7 +15,7 @@
15
15
  // specific language governing permissions and limitations
16
16
  // under the License.
17
17
 
18
- 'use strict';
18
+ 'use strict'
19
19
 
20
20
  /**
21
21
  * @fileoverview Defines WebDriver's logging system. The logging system is
@@ -56,7 +56,7 @@
56
56
  * **NOTE:** Only a few browsers support the remote logging API (notably
57
57
  * Firefox and Chrome). Firefox supports basic logging functionality, while
58
58
  * Chrome exposes robust
59
- * [performance logging](https://sites.google.com/a/chromium.org/chromedriver/logging)
59
+ * [performance logging](https://chromedriver.chromium.org/logging)
60
60
  * options. Remote logging is still considered a non-standard feature, and the
61
61
  * APIs exposed by this module for it are non-frozen. This module will be
62
62
  * updated, possibly breaking backwards-compatibility, once logging is
@@ -76,29 +76,29 @@ class Level {
76
76
  */
77
77
  constructor(name, level) {
78
78
  if (level < 0) {
79
- throw new TypeError('Level must be >= 0');
79
+ throw new TypeError('Level must be >= 0')
80
80
  }
81
81
 
82
82
  /** @private {string} */
83
- this.name_ = name;
83
+ this.name_ = name
84
84
 
85
85
  /** @private {number} */
86
- this.value_ = level;
86
+ this.value_ = level
87
87
  }
88
88
 
89
89
  /** This logger's name. */
90
90
  get name() {
91
- return this.name_;
91
+ return this.name_
92
92
  }
93
93
 
94
94
  /** The numeric log level. */
95
95
  get value() {
96
- return this.value_;
96
+ return this.value_
97
97
  }
98
98
 
99
99
  /** @override */
100
100
  toString() {
101
- return this.name;
101
+ return this.name
102
102
  }
103
103
  }
104
104
 
@@ -106,66 +106,57 @@ class Level {
106
106
  * Indicates no log messages should be recorded.
107
107
  * @const
108
108
  */
109
- Level.OFF = new Level('OFF', Infinity);
110
-
109
+ Level.OFF = new Level('OFF', Infinity)
111
110
 
112
111
  /**
113
112
  * Log messages with a level of `1000` or higher.
114
113
  * @const
115
114
  */
116
- Level.SEVERE = new Level('SEVERE', 1000);
117
-
115
+ Level.SEVERE = new Level('SEVERE', 1000)
118
116
 
119
117
  /**
120
118
  * Log messages with a level of `900` or higher.
121
119
  * @const
122
120
  */
123
- Level.WARNING = new Level('WARNING', 900);
124
-
121
+ Level.WARNING = new Level('WARNING', 900)
125
122
 
126
123
  /**
127
124
  * Log messages with a level of `800` or higher.
128
125
  * @const
129
126
  */
130
- Level.INFO = new Level('INFO', 800);
131
-
127
+ Level.INFO = new Level('INFO', 800)
132
128
 
133
129
  /**
134
130
  * Log messages with a level of `700` or higher.
135
131
  * @const
136
132
  */
137
- Level.DEBUG = new Level('DEBUG', 700);
138
-
133
+ Level.DEBUG = new Level('DEBUG', 700)
139
134
 
140
135
  /**
141
136
  * Log messages with a level of `500` or higher.
142
137
  * @const
143
138
  */
144
- Level.FINE = new Level('FINE', 500);
145
-
139
+ Level.FINE = new Level('FINE', 500)
146
140
 
147
141
  /**
148
142
  * Log messages with a level of `400` or higher.
149
143
  * @const
150
144
  */
151
- Level.FINER = new Level('FINER', 400);
152
-
145
+ Level.FINER = new Level('FINER', 400)
153
146
 
154
147
  /**
155
148
  * Log messages with a level of `300` or higher.
156
149
  * @const
157
150
  */
158
- Level.FINEST = new Level('FINEST', 300);
159
-
151
+ Level.FINEST = new Level('FINEST', 300)
160
152
 
161
153
  /**
162
154
  * Indicates all log messages should be recorded.
163
155
  * @const
164
156
  */
165
- Level.ALL = new Level('ALL', 0);
166
-
157
+ Level.ALL = new Level('ALL', 0)
167
158
 
168
- const ALL_LEVELS = /** !Set<Level> */new Set([
159
+ const ALL_LEVELS = /** !Set<Level> */ new Set([
169
160
  Level.OFF,
170
161
  Level.SEVERE,
171
162
  Level.WARNING,
@@ -174,9 +165,8 @@ const ALL_LEVELS = /** !Set<Level> */new Set([
174
165
  Level.FINE,
175
166
  Level.FINER,
176
167
  Level.FINEST,
177
- Level.ALL
178
- ]);
179
-
168
+ Level.ALL,
169
+ ])
180
170
 
181
171
  const LEVELS_BY_NAME = /** !Map<string, !Level> */ new Map([
182
172
  [Level.OFF.name, Level.OFF],
@@ -187,9 +177,8 @@ const LEVELS_BY_NAME = /** !Map<string, !Level> */ new Map([
187
177
  [Level.FINE.name, Level.FINE],
188
178
  [Level.FINER.name, Level.FINER],
189
179
  [Level.FINEST.name, Level.FINEST],
190
- [Level.ALL.name, Level.ALL]
191
- ]);
192
-
180
+ [Level.ALL.name, Level.ALL],
181
+ ])
193
182
 
194
183
  /**
195
184
  * Converts a level name or value to a {@link Level} value. If the name/value
@@ -201,20 +190,19 @@ const LEVELS_BY_NAME = /** !Map<string, !Level> */ new Map([
201
190
  */
202
191
  function getLevel(nameOrValue) {
203
192
  if (typeof nameOrValue === 'string') {
204
- return LEVELS_BY_NAME.get(nameOrValue) || Level.ALL;
193
+ return LEVELS_BY_NAME.get(nameOrValue) || Level.ALL
205
194
  }
206
195
  if (typeof nameOrValue !== 'number') {
207
- throw new TypeError('not a string or number');
196
+ throw new TypeError('not a string or number')
208
197
  }
209
198
  for (let level of ALL_LEVELS) {
210
199
  if (nameOrValue >= level.value) {
211
- return level;
200
+ return level
212
201
  }
213
202
  }
214
- return Level.ALL;
203
+ return Level.ALL
215
204
  }
216
205
 
217
-
218
206
  /**
219
207
  * Describes a single log entry.
220
208
  *
@@ -230,11 +218,11 @@ class Entry {
230
218
  * @param {string=} opt_type The log type, if known.
231
219
  */
232
220
  constructor(level, message, opt_timestamp, opt_type) {
233
- this.level = level instanceof Level ? level : getLevel(level);
234
- this.message = message;
221
+ this.level = level instanceof Level ? level : getLevel(level)
222
+ this.message = message
235
223
  this.timestamp =
236
- typeof opt_timestamp === 'number' ? opt_timestamp : Date.now();
237
- this.type = opt_type || '';
224
+ typeof opt_timestamp === 'number' ? opt_timestamp : Date.now()
225
+ this.type = opt_type || ''
238
226
  }
239
227
 
240
228
  /**
@@ -243,15 +231,14 @@ class Entry {
243
231
  */
244
232
  toJSON() {
245
233
  return {
246
- 'level': this.level.name,
247
- 'message': this.message,
248
- 'timestamp': this.timestamp,
249
- 'type': this.type
250
- };
234
+ level: this.level.name,
235
+ message: this.message,
236
+ timestamp: this.timestamp,
237
+ type: this.type,
238
+ }
251
239
  }
252
240
  }
253
241
 
254
-
255
242
  /**
256
243
  * An object used to log debugging messages. Loggers use a hierarchical,
257
244
  * dot-separated naming scheme. For instance, "foo" is considered the parent of
@@ -275,21 +262,21 @@ class Logger {
275
262
  */
276
263
  constructor(name, opt_level) {
277
264
  /** @private {string} */
278
- this.name_ = name;
265
+ this.name_ = name
279
266
 
280
267
  /** @private {Level} */
281
- this.level_ = opt_level || null;
268
+ this.level_ = opt_level || null
282
269
 
283
270
  /** @private {Logger} */
284
- this.parent_ = null;
271
+ this.parent_ = null
285
272
 
286
273
  /** @private {Set<function(!Entry)>} */
287
- this.handlers_ = null;
274
+ this.handlers_ = null
288
275
  }
289
276
 
290
277
  /** @return {string} the name of this logger. */
291
278
  getName() {
292
- return this.name_;
279
+ return this.name_
293
280
  }
294
281
 
295
282
  /**
@@ -297,25 +284,25 @@ class Logger {
297
284
  * should inherit its level from its parent logger.
298
285
  */
299
286
  setLevel(level) {
300
- this.level_ = level;
287
+ this.level_ = level
301
288
  }
302
289
 
303
290
  /** @return {Level} the log level for this logger. */
304
291
  getLevel() {
305
- return this.level_;
292
+ return this.level_
306
293
  }
307
294
 
308
295
  /**
309
296
  * @return {!Level} the effective level for this logger.
310
297
  */
311
298
  getEffectiveLevel() {
312
- let logger = this;
313
- let level;
299
+ let logger = this
300
+ let level
314
301
  do {
315
- level = logger.level_;
316
- logger = logger.parent_;
317
- } while (logger && !level);
318
- return level || Level.OFF;
302
+ level = logger.level_
303
+ logger = logger.parent_
304
+ } while (logger && !level)
305
+ return level || Level.OFF
319
306
  }
320
307
 
321
308
  /**
@@ -324,8 +311,10 @@ class Logger {
324
311
  * by this instance.
325
312
  */
326
313
  isLoggable(level) {
327
- return level.value !== Level.OFF.value
328
- && level.value >= this.getEffectiveLevel().value;
314
+ return (
315
+ level.value !== Level.OFF.value &&
316
+ level.value >= this.getEffectiveLevel().value
317
+ )
329
318
  }
330
319
 
331
320
  /**
@@ -336,9 +325,9 @@ class Logger {
336
325
  */
337
326
  addHandler(handler) {
338
327
  if (!this.handlers_) {
339
- this.handlers_ = new Set;
328
+ this.handlers_ = new Set()
340
329
  }
341
- this.handlers_.add(handler);
330
+ this.handlers_.add(handler)
342
331
  }
343
332
 
344
333
  /**
@@ -349,9 +338,9 @@ class Logger {
349
338
  */
350
339
  removeHandler(handler) {
351
340
  if (!this.handlers_) {
352
- return false;
341
+ return false
353
342
  }
354
- return this.handlers_.delete(handler);
343
+ return this.handlers_.delete(handler)
355
344
  }
356
345
 
357
346
  /**
@@ -367,15 +356,18 @@ class Logger {
367
356
  */
368
357
  log(level, loggable) {
369
358
  if (!this.isLoggable(level)) {
370
- return;
359
+ return
371
360
  }
372
- let message = '[' + this.name_ + '] '
373
- + (typeof loggable === 'function' ? loggable() : loggable);
374
- let entry = new Entry(level, message, Date.now());
375
- for (let logger = this; !!logger; logger = logger.parent_) {
361
+ let message =
362
+ '[' +
363
+ this.name_ +
364
+ '] ' +
365
+ (typeof loggable === 'function' ? loggable() : loggable)
366
+ let entry = new Entry(level, message, Date.now())
367
+ for (let logger = this; logger; logger = logger.parent_) {
376
368
  if (logger.handlers_) {
377
369
  for (let handler of logger.handlers_) {
378
- handler(entry);
370
+ handler(entry)
379
371
  }
380
372
  }
381
373
  }
@@ -387,7 +379,7 @@ class Logger {
387
379
  * function that will return the message.
388
380
  */
389
381
  severe(loggable) {
390
- this.log(Level.SEVERE, loggable);
382
+ this.log(Level.SEVERE, loggable)
391
383
  }
392
384
 
393
385
  /**
@@ -396,7 +388,7 @@ class Logger {
396
388
  * function that will return the message.
397
389
  */
398
390
  warning(loggable) {
399
- this.log(Level.WARNING, loggable);
391
+ this.log(Level.WARNING, loggable)
400
392
  }
401
393
 
402
394
  /**
@@ -405,7 +397,7 @@ class Logger {
405
397
  * function that will return the message.
406
398
  */
407
399
  info(loggable) {
408
- this.log(Level.INFO, loggable);
400
+ this.log(Level.INFO, loggable)
409
401
  }
410
402
 
411
403
  /**
@@ -414,7 +406,7 @@ class Logger {
414
406
  * function that will return the message.
415
407
  */
416
408
  debug(loggable) {
417
- this.log(Level.DEBUG, loggable);
409
+ this.log(Level.DEBUG, loggable)
418
410
  }
419
411
 
420
412
  /**
@@ -423,7 +415,7 @@ class Logger {
423
415
  * function that will return the message.
424
416
  */
425
417
  fine(loggable) {
426
- this.log(Level.FINE, loggable);
418
+ this.log(Level.FINE, loggable)
427
419
  }
428
420
 
429
421
  /**
@@ -432,7 +424,7 @@ class Logger {
432
424
  * function that will return the message.
433
425
  */
434
426
  finer(loggable) {
435
- this.log(Level.FINER, loggable);
427
+ this.log(Level.FINER, loggable)
436
428
  }
437
429
 
438
430
  /**
@@ -441,11 +433,10 @@ class Logger {
441
433
  * function that will return the message.
442
434
  */
443
435
  finest(loggable) {
444
- this.log(Level.FINEST, loggable);
436
+ this.log(Level.FINEST, loggable)
445
437
  }
446
438
  }
447
439
 
448
-
449
440
  /**
450
441
  * Maintains a collection of loggers.
451
442
  *
@@ -454,8 +445,8 @@ class Logger {
454
445
  class LogManager {
455
446
  constructor() {
456
447
  /** @private {!Map<string, !Logger>} */
457
- this.loggers_ = new Map;
458
- this.root_ = new Logger('', Level.OFF);
448
+ this.loggers_ = new Map()
449
+ this.root_ = new Logger('', Level.OFF)
459
450
  }
460
451
 
461
452
  /**
@@ -468,14 +459,14 @@ class LogManager {
468
459
  */
469
460
  getLogger(name) {
470
461
  if (!name) {
471
- return this.root_;
462
+ return this.root_
472
463
  }
473
- let parent = this.root_;
464
+ let parent = this.root_
474
465
  for (let i = name.indexOf('.'); i != -1; i = name.indexOf('.', i + 1)) {
475
- let parentName = name.substr(0, i);
476
- parent = this.createLogger_(parentName, parent);
466
+ let parentName = name.substr(0, i)
467
+ parent = this.createLogger_(parentName, parent)
477
468
  }
478
- return this.createLogger_(name, parent);
469
+ return this.createLogger_(name, parent)
479
470
  }
480
471
 
481
472
  /**
@@ -488,18 +479,16 @@ class LogManager {
488
479
  */
489
480
  createLogger_(name, parent) {
490
481
  if (this.loggers_.has(name)) {
491
- return /** @type {!Logger} */(this.loggers_.get(name));
482
+ return /** @type {!Logger} */ (this.loggers_.get(name))
492
483
  }
493
- let logger = new Logger(name, null);
494
- logger.parent_ = parent;
495
- this.loggers_.set(name, logger);
496
- return logger;
484
+ let logger = new Logger(name, null)
485
+ logger.parent_ = parent
486
+ this.loggers_.set(name, logger)
487
+ return logger
497
488
  }
498
489
  }
499
490
 
500
-
501
- const logManager = new LogManager;
502
-
491
+ const logManager = new LogManager()
503
492
 
504
493
  /**
505
494
  * Retrieves a named logger, creating it in the process. This function will
@@ -513,10 +502,9 @@ const logManager = new LogManager;
513
502
  * @return {!Logger} the requested logger.
514
503
  */
515
504
  function getLogger(name) {
516
- return logManager.getLogger(name);
505
+ return logManager.getLogger(name)
517
506
  }
518
507
 
519
-
520
508
  /**
521
509
  * Pads a number to ensure it has a minimum of two digits.
522
510
  *
@@ -525,44 +513,51 @@ function getLogger(name) {
525
513
  */
526
514
  function pad(n) {
527
515
  if (n >= 10) {
528
- return '' + n;
516
+ return '' + n
529
517
  } else {
530
- return '0' + n;
518
+ return '0' + n
531
519
  }
532
520
  }
533
521
 
534
-
535
522
  /**
536
523
  * Logs all messages to the Console API.
537
524
  * @param {!Entry} entry the entry to log.
538
525
  */
539
526
  function consoleHandler(entry) {
540
527
  if (typeof console === 'undefined' || !console) {
541
- return;
528
+ return
542
529
  }
543
530
 
544
- var timestamp = new Date(entry.timestamp);
531
+ var timestamp = new Date(entry.timestamp)
545
532
  var msg =
546
- '[' + timestamp.getUTCFullYear() + '-' +
547
- pad(timestamp.getUTCMonth() + 1) + '-' +
548
- pad(timestamp.getUTCDate()) + 'T' +
549
- pad(timestamp.getUTCHours()) + ':' +
550
- pad(timestamp.getUTCMinutes()) + ':' +
551
- pad(timestamp.getUTCSeconds()) + 'Z] ' +
552
- '[' + entry.level.name + '] ' +
553
- entry.message;
554
-
555
- var level = entry.level.value;
533
+ '[' +
534
+ timestamp.getUTCFullYear() +
535
+ '-' +
536
+ pad(timestamp.getUTCMonth() + 1) +
537
+ '-' +
538
+ pad(timestamp.getUTCDate()) +
539
+ 'T' +
540
+ pad(timestamp.getUTCHours()) +
541
+ ':' +
542
+ pad(timestamp.getUTCMinutes()) +
543
+ ':' +
544
+ pad(timestamp.getUTCSeconds()) +
545
+ 'Z] ' +
546
+ '[' +
547
+ entry.level.name +
548
+ '] ' +
549
+ entry.message
550
+
551
+ var level = entry.level.value
556
552
  if (level >= Level.SEVERE.value) {
557
- console.error(msg);
553
+ console.error(msg)
558
554
  } else if (level >= Level.WARNING.value) {
559
- console.warn(msg);
555
+ console.warn(msg)
560
556
  } else {
561
- console.log(msg);
557
+ console.log(msg)
562
558
  }
563
559
  }
564
560
 
565
-
566
561
  /**
567
562
  * Adds the console handler to the given logger. The console handler will log
568
563
  * all messages using the JavaScript Console API.
@@ -571,11 +566,10 @@ function consoleHandler(entry) {
571
566
  * to the root logger.
572
567
  */
573
568
  function addConsoleHandler(opt_logger) {
574
- let logger = opt_logger || logManager.root_;
575
- logger.addHandler(consoleHandler);
569
+ let logger = opt_logger || logManager.root_
570
+ logger.addHandler(consoleHandler)
576
571
  }
577
572
 
578
-
579
573
  /**
580
574
  * Removes the console log handler from the given logger.
581
575
  *
@@ -584,19 +578,17 @@ function addConsoleHandler(opt_logger) {
584
578
  * @see exports.addConsoleHandler
585
579
  */
586
580
  function removeConsoleHandler(opt_logger) {
587
- let logger = opt_logger || logManager.root_;
588
- logger.removeHandler(consoleHandler);
581
+ let logger = opt_logger || logManager.root_
582
+ logger.removeHandler(consoleHandler)
589
583
  }
590
584
 
591
-
592
585
  /**
593
586
  * Installs the console log handler on the root logger.
594
587
  */
595
588
  function installConsoleHandler() {
596
- addConsoleHandler(logManager.root_);
589
+ addConsoleHandler(logManager.root_)
597
590
  }
598
591
 
599
-
600
592
  /**
601
593
  * Common log types.
602
594
  * @enum {string}
@@ -611,9 +603,8 @@ const Type = {
611
603
  /** Logs related to performance. */
612
604
  PERFORMANCE: 'performance',
613
605
  /** Logs from the remote server. */
614
- SERVER: 'server'
615
- };
616
-
606
+ SERVER: 'server',
607
+ }
617
608
 
618
609
  /**
619
610
  * Describes the log preferences for a WebDriver session.
@@ -623,7 +614,7 @@ const Type = {
623
614
  class Preferences {
624
615
  constructor() {
625
616
  /** @private {!Map<string, !Level>} */
626
- this.prefs_ = new Map;
617
+ this.prefs_ = new Map()
627
618
  }
628
619
 
629
620
  /**
@@ -634,9 +625,9 @@ class Preferences {
634
625
  */
635
626
  setLevel(type, level) {
636
627
  if (typeof type !== 'string') {
637
- throw TypeError('specified log type is not a string: ' + typeof type);
628
+ throw TypeError('specified log type is not a string: ' + typeof type)
638
629
  }
639
- this.prefs_.set(type, level instanceof Level ? level : getLevel(level));
630
+ this.prefs_.set(type, level instanceof Level ? level : getLevel(level))
640
631
  }
641
632
 
642
633
  /**
@@ -645,18 +636,16 @@ class Preferences {
645
636
  * preferences.
646
637
  */
647
638
  toJSON() {
648
- let json = {};
639
+ let json = {}
649
640
  for (let key of this.prefs_.keys()) {
650
- json[key] = this.prefs_.get(key).name;
641
+ json[key] = this.prefs_.get(key).name
651
642
  }
652
- return json;
643
+ return json
653
644
  }
654
645
  }
655
646
 
656
-
657
647
  // PUBLIC API
658
648
 
659
-
660
649
  module.exports = {
661
650
  Entry: Entry,
662
651
  Level: Level,
@@ -668,5 +657,5 @@ module.exports = {
668
657
  getLevel: getLevel,
669
658
  getLogger: getLogger,
670
659
  installConsoleHandler: installConsoleHandler,
671
- removeConsoleHandler: removeConsoleHandler
672
- };
660
+ removeConsoleHandler: removeConsoleHandler,
661
+ }