selenium-webdriver 4.1.0 → 4.1.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.
- package/CHANGES.md +15 -0
- package/LICENSE +1 -1
- package/NOTICE +1 -1
- package/chrome.js +13 -10
- package/chromium.js +32 -6
- package/edge.js +8 -6
- package/example/google_search.js +1 -1
- package/firefox.js +32 -17
- package/index.js +4 -4
- package/io/exec.js +2 -1
- package/io/index.js +23 -21
- package/io/zip.js +1 -3
- package/lib/by.js +5 -5
- package/lib/command.js +1 -11
- package/lib/error.js +1 -20
- package/lib/http.js +62 -158
- package/lib/input.js +1 -1
- package/lib/promise.js +12 -17
- package/lib/proxy.js +15 -5
- package/lib/session.js +1 -1
- package/lib/until.js +14 -16
- package/lib/webdriver.js +95 -101
- package/net/index.js +14 -7
- package/net/portprober.js +4 -3
- package/opera.js +19 -22
- package/package.json +1 -1
- package/remote/index.js +12 -9
- package/safari.js +3 -3
- package/testing/index.js +11 -4
package/lib/http.js
CHANGED
|
@@ -31,7 +31,7 @@ const error = require('./error')
|
|
|
31
31
|
const logging = require('./logging')
|
|
32
32
|
const promise = require('./promise')
|
|
33
33
|
const { Session } = require('./session')
|
|
34
|
-
const { WebElement
|
|
34
|
+
const { WebElement } = require('./webdriver')
|
|
35
35
|
|
|
36
36
|
const getAttribute = requireAtom(
|
|
37
37
|
'get-attribute.js',
|
|
@@ -173,12 +173,13 @@ var CommandSpec // eslint-disable-line
|
|
|
173
173
|
/** @typedef {function(!cmd.Command): !cmd.Command} */
|
|
174
174
|
var CommandTransformer // eslint-disable-line
|
|
175
175
|
|
|
176
|
-
class InternalTypeError extends TypeError {
|
|
176
|
+
class InternalTypeError extends TypeError {}
|
|
177
177
|
|
|
178
178
|
/**
|
|
179
179
|
* @param {!cmd.Command} command The initial command.
|
|
180
180
|
* @param {Atom} atom The name of the atom to execute.
|
|
181
|
-
* @
|
|
181
|
+
* @param params
|
|
182
|
+
* @return {!Command} The transformed command to execute.
|
|
182
183
|
*/
|
|
183
184
|
function toExecuteAtomCommand(command, atom, ...params) {
|
|
184
185
|
if (typeof atom !== 'function') {
|
|
@@ -194,143 +195,39 @@ function toExecuteAtomCommand(command, atom, ...params) {
|
|
|
194
195
|
)
|
|
195
196
|
}
|
|
196
197
|
|
|
197
|
-
/** @const {!Map<string, CommandSpec>} */
|
|
198
|
-
const COMMAND_MAP = new Map([
|
|
199
|
-
[cmd.Name.GET_SERVER_STATUS, get('/status')],
|
|
200
|
-
[cmd.Name.NEW_SESSION, post('/session')],
|
|
201
|
-
[cmd.Name.GET_SESSIONS, get('/sessions')],
|
|
202
|
-
[cmd.Name.QUIT, del('/session/:sessionId')],
|
|
203
|
-
[cmd.Name.CLOSE, del('/session/:sessionId/window')],
|
|
204
|
-
[
|
|
205
|
-
cmd.Name.GET_CURRENT_WINDOW_HANDLE,
|
|
206
|
-
get('/session/:sessionId/window_handle'),
|
|
207
|
-
],
|
|
208
|
-
[cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window_handles')],
|
|
209
|
-
[cmd.Name.GET_CURRENT_URL, get('/session/:sessionId/url')],
|
|
210
|
-
[cmd.Name.GET, post('/session/:sessionId/url')],
|
|
211
|
-
[cmd.Name.GO_BACK, post('/session/:sessionId/back')],
|
|
212
|
-
[cmd.Name.GO_FORWARD, post('/session/:sessionId/forward')],
|
|
213
|
-
[cmd.Name.REFRESH, post('/session/:sessionId/refresh')],
|
|
214
|
-
[cmd.Name.ADD_COOKIE, post('/session/:sessionId/cookie')],
|
|
215
|
-
[cmd.Name.GET_ALL_COOKIES, get('/session/:sessionId/cookie')],
|
|
216
|
-
[cmd.Name.DELETE_ALL_COOKIES, del('/session/:sessionId/cookie')],
|
|
217
|
-
[cmd.Name.DELETE_COOKIE, del('/session/:sessionId/cookie/:name')],
|
|
218
|
-
[cmd.Name.FIND_ELEMENT, post('/session/:sessionId/element')],
|
|
219
|
-
[cmd.Name.FIND_ELEMENTS, post('/session/:sessionId/elements')],
|
|
220
|
-
[cmd.Name.GET_ACTIVE_ELEMENT, post('/session/:sessionId/element/active')],
|
|
221
|
-
[
|
|
222
|
-
cmd.Name.FIND_CHILD_ELEMENT,
|
|
223
|
-
post('/session/:sessionId/element/:id/element'),
|
|
224
|
-
],
|
|
225
|
-
[
|
|
226
|
-
cmd.Name.FIND_CHILD_ELEMENTS,
|
|
227
|
-
post('/session/:sessionId/element/:id/elements'),
|
|
228
|
-
],
|
|
229
|
-
[cmd.Name.CLEAR_ELEMENT, post('/session/:sessionId/element/:id/clear')],
|
|
230
|
-
[cmd.Name.CLICK_ELEMENT, post('/session/:sessionId/element/:id/click')],
|
|
231
|
-
[
|
|
232
|
-
cmd.Name.SEND_KEYS_TO_ELEMENT,
|
|
233
|
-
post('/session/:sessionId/element/:id/value'),
|
|
234
|
-
],
|
|
235
|
-
[cmd.Name.SUBMIT_ELEMENT, post('/session/:sessionId/element/:id/submit')],
|
|
236
|
-
[cmd.Name.GET_ELEMENT_TEXT, get('/session/:sessionId/element/:id/text')],
|
|
237
|
-
[
|
|
238
|
-
cmd.Name.GET_COMPUTED_ROLE,
|
|
239
|
-
get('/session/:sessionId/element/:id/computedrole'),
|
|
240
|
-
],
|
|
241
|
-
[
|
|
242
|
-
cmd.Name.GET_COMPUTED_LABEL,
|
|
243
|
-
get('/session/:sessionId/element/:id/computedlabel'),
|
|
244
|
-
],
|
|
245
|
-
[cmd.Name.GET_ELEMENT_TAG_NAME, get('/session/:sessionId/element/:id/name')],
|
|
246
|
-
[
|
|
247
|
-
cmd.Name.IS_ELEMENT_SELECTED,
|
|
248
|
-
get('/session/:sessionId/element/:id/selected'),
|
|
249
|
-
],
|
|
250
|
-
[cmd.Name.IS_ELEMENT_ENABLED, get('/session/:sessionId/element/:id/enabled')],
|
|
251
|
-
[
|
|
252
|
-
cmd.Name.IS_ELEMENT_DISPLAYED,
|
|
253
|
-
get('/session/:sessionId/element/:id/displayed'),
|
|
254
|
-
],
|
|
255
|
-
[
|
|
256
|
-
cmd.Name.GET_ELEMENT_LOCATION,
|
|
257
|
-
get('/session/:sessionId/element/:id/location'),
|
|
258
|
-
],
|
|
259
|
-
[cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/size')],
|
|
260
|
-
[
|
|
261
|
-
cmd.Name.GET_ELEMENT_ATTRIBUTE,
|
|
262
|
-
get('/session/:sessionId/element/:id/attribute/:name'),
|
|
263
|
-
],
|
|
264
|
-
[
|
|
265
|
-
cmd.Name.GET_ELEMENT_PROPERTY,
|
|
266
|
-
get('/session/:sessionId/element/:id/property/:name'),
|
|
267
|
-
],
|
|
268
|
-
[
|
|
269
|
-
cmd.Name.GET_ELEMENT_VALUE_OF_CSS_PROPERTY,
|
|
270
|
-
get('/session/:sessionId/element/:id/css/:propertyName'),
|
|
271
|
-
],
|
|
272
|
-
[
|
|
273
|
-
cmd.Name.TAKE_ELEMENT_SCREENSHOT,
|
|
274
|
-
get('/session/:sessionId/element/:id/screenshot'),
|
|
275
|
-
],
|
|
276
|
-
[cmd.Name.SWITCH_TO_WINDOW, post('/session/:sessionId/window')],
|
|
277
|
-
[
|
|
278
|
-
cmd.Name.MAXIMIZE_WINDOW,
|
|
279
|
-
post('/session/:sessionId/window/current/maximize'),
|
|
280
|
-
],
|
|
281
|
-
[
|
|
282
|
-
cmd.Name.GET_WINDOW_POSITION,
|
|
283
|
-
get('/session/:sessionId/window/current/position'),
|
|
284
|
-
],
|
|
285
|
-
[
|
|
286
|
-
cmd.Name.SET_WINDOW_POSITION,
|
|
287
|
-
post('/session/:sessionId/window/current/position'),
|
|
288
|
-
],
|
|
289
|
-
[cmd.Name.GET_WINDOW_SIZE, get('/session/:sessionId/window/current/size')],
|
|
290
|
-
[cmd.Name.SET_WINDOW_SIZE, post('/session/:sessionId/window/current/size')],
|
|
291
|
-
[cmd.Name.SWITCH_TO_FRAME, post('/session/:sessionId/frame')],
|
|
292
|
-
[cmd.Name.SWITCH_TO_FRAME_PARENT, post('/session/:sessionId/frame/parent')],
|
|
293
|
-
[cmd.Name.GET_PAGE_SOURCE, get('/session/:sessionId/source')],
|
|
294
|
-
[cmd.Name.GET_TITLE, get('/session/:sessionId/title')],
|
|
295
|
-
[cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute')],
|
|
296
|
-
[cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute_async')],
|
|
297
|
-
[cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')],
|
|
298
|
-
[cmd.Name.GET_TIMEOUT, get('/session/:sessionId/timeouts')],
|
|
299
|
-
[cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')],
|
|
300
|
-
[cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/accept_alert')],
|
|
301
|
-
[cmd.Name.DISMISS_ALERT, post('/session/:sessionId/dismiss_alert')],
|
|
302
|
-
[cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert_text')],
|
|
303
|
-
[cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert_text')],
|
|
304
|
-
[cmd.Name.GET_LOG, post('/session/:sessionId/log')],
|
|
305
|
-
[cmd.Name.GET_AVAILABLE_LOG_TYPES, get('/session/:sessionId/log/types')],
|
|
306
|
-
[cmd.Name.GET_SESSION_LOGS, post('/logs')],
|
|
307
|
-
[cmd.Name.UPLOAD_FILE, post('/session/:sessionId/se/file')],
|
|
308
|
-
])
|
|
309
|
-
|
|
310
198
|
/** @const {!Map<string, (CommandSpec|CommandTransformer)>} */
|
|
311
199
|
const W3C_COMMAND_MAP = new Map([
|
|
312
|
-
|
|
313
|
-
[cmd.Name.GET_SERVER_STATUS, get('/status')],
|
|
200
|
+
|
|
314
201
|
// Session management.
|
|
315
202
|
[cmd.Name.NEW_SESSION, post('/session')],
|
|
316
203
|
[cmd.Name.QUIT, del('/session/:sessionId')],
|
|
204
|
+
|
|
205
|
+
// Server status.
|
|
206
|
+
[cmd.Name.GET_SERVER_STATUS, get('/status')],
|
|
207
|
+
|
|
208
|
+
// timeouts
|
|
317
209
|
[cmd.Name.GET_TIMEOUT, get('/session/:sessionId/timeouts')],
|
|
318
210
|
[cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')],
|
|
211
|
+
|
|
319
212
|
// Navigation.
|
|
320
213
|
[cmd.Name.GET_CURRENT_URL, get('/session/:sessionId/url')],
|
|
321
214
|
[cmd.Name.GET, post('/session/:sessionId/url')],
|
|
322
215
|
[cmd.Name.GO_BACK, post('/session/:sessionId/back')],
|
|
323
216
|
[cmd.Name.GO_FORWARD, post('/session/:sessionId/forward')],
|
|
324
217
|
[cmd.Name.REFRESH, post('/session/:sessionId/refresh')],
|
|
218
|
+
|
|
325
219
|
// Page inspection.
|
|
326
220
|
[cmd.Name.GET_PAGE_SOURCE, get('/session/:sessionId/source')],
|
|
327
221
|
[cmd.Name.GET_TITLE, get('/session/:sessionId/title')],
|
|
222
|
+
|
|
328
223
|
// Script execution.
|
|
329
224
|
[cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute/sync')],
|
|
330
225
|
[cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute/async')],
|
|
226
|
+
|
|
331
227
|
// Frame selection.
|
|
332
228
|
[cmd.Name.SWITCH_TO_FRAME, post('/session/:sessionId/frame')],
|
|
333
229
|
[cmd.Name.SWITCH_TO_FRAME_PARENT, post('/session/:sessionId/frame/parent')],
|
|
230
|
+
|
|
334
231
|
// Window management.
|
|
335
232
|
[cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window')],
|
|
336
233
|
[cmd.Name.CLOSE, del('/session/:sessionId/window')],
|
|
@@ -342,9 +239,13 @@ const W3C_COMMAND_MAP = new Map([
|
|
|
342
239
|
[cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/maximize')],
|
|
343
240
|
[cmd.Name.MINIMIZE_WINDOW, post('/session/:sessionId/window/minimize')],
|
|
344
241
|
[cmd.Name.FULLSCREEN_WINDOW, post('/session/:sessionId/window/fullscreen')],
|
|
242
|
+
|
|
345
243
|
// Actions.
|
|
346
244
|
[cmd.Name.ACTIONS, post('/session/:sessionId/actions')],
|
|
347
245
|
[cmd.Name.CLEAR_ACTIONS, del('/session/:sessionId/actions')],
|
|
246
|
+
[cmd.Name.PRINT_PAGE, post('/session/:sessionId/print')],
|
|
247
|
+
|
|
248
|
+
|
|
348
249
|
// Locating elements.
|
|
349
250
|
[cmd.Name.GET_ACTIVE_ELEMENT, get('/session/:sessionId/element/active')],
|
|
350
251
|
[cmd.Name.FIND_ELEMENT, post('/session/:sessionId/element')],
|
|
@@ -365,6 +266,13 @@ const W3C_COMMAND_MAP = new Map([
|
|
|
365
266
|
],
|
|
366
267
|
// Element interaction.
|
|
367
268
|
[cmd.Name.GET_ELEMENT_TAG_NAME, get('/session/:sessionId/element/:id/name')],
|
|
269
|
+
[cmd.Name.GET_DOM_ATTRIBUTE, get('/session/:sessionId/element/:id/attribute/:name')],
|
|
270
|
+
[
|
|
271
|
+
cmd.Name.GET_ELEMENT_ATTRIBUTE,
|
|
272
|
+
(cmd) => {
|
|
273
|
+
return toExecuteAtomCommand(cmd, Atom.GET_ATTRIBUTE, 'id', 'name')
|
|
274
|
+
},
|
|
275
|
+
],
|
|
368
276
|
[
|
|
369
277
|
cmd.Name.GET_ELEMENT_PROPERTY,
|
|
370
278
|
get('/session/:sessionId/element/:id/property/:name'),
|
|
@@ -391,43 +299,53 @@ const W3C_COMMAND_MAP = new Map([
|
|
|
391
299
|
],
|
|
392
300
|
[cmd.Name.IS_ELEMENT_ENABLED, get('/session/:sessionId/element/:id/enabled')],
|
|
393
301
|
[
|
|
394
|
-
cmd.Name.
|
|
395
|
-
(
|
|
396
|
-
return toExecuteAtomCommand(cmd, Atom.GET_ATTRIBUTE, 'id', 'name')
|
|
397
|
-
},
|
|
302
|
+
cmd.Name.IS_ELEMENT_SELECTED,
|
|
303
|
+
get('/session/:sessionId/element/:id/selected'),
|
|
398
304
|
],
|
|
305
|
+
|
|
399
306
|
[
|
|
400
307
|
cmd.Name.IS_ELEMENT_DISPLAYED,
|
|
401
308
|
(cmd) => {
|
|
402
309
|
return toExecuteAtomCommand(cmd, Atom.IS_DISPLAYED, 'id')
|
|
403
310
|
},
|
|
404
311
|
],
|
|
312
|
+
|
|
405
313
|
// Cookie management.
|
|
406
314
|
[cmd.Name.GET_ALL_COOKIES, get('/session/:sessionId/cookie')],
|
|
407
315
|
[cmd.Name.ADD_COOKIE, post('/session/:sessionId/cookie')],
|
|
408
316
|
[cmd.Name.DELETE_ALL_COOKIES, del('/session/:sessionId/cookie')],
|
|
409
317
|
[cmd.Name.GET_COOKIE, get('/session/:sessionId/cookie/:name')],
|
|
410
318
|
[cmd.Name.DELETE_COOKIE, del('/session/:sessionId/cookie/:name')],
|
|
319
|
+
|
|
411
320
|
// Alert management.
|
|
412
321
|
[cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/alert/accept')],
|
|
413
322
|
[cmd.Name.DISMISS_ALERT, post('/session/:sessionId/alert/dismiss')],
|
|
414
323
|
[cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert/text')],
|
|
415
324
|
[cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert/text')],
|
|
325
|
+
|
|
416
326
|
// Screenshots.
|
|
417
327
|
[cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')],
|
|
418
328
|
[
|
|
419
329
|
cmd.Name.TAKE_ELEMENT_SCREENSHOT,
|
|
420
330
|
get('/session/:sessionId/element/:id/screenshot'),
|
|
421
331
|
],
|
|
422
|
-
|
|
423
|
-
[cmd.Name.PRINT_PAGE, post('/session/:sessionId/print')],
|
|
332
|
+
|
|
424
333
|
// Shadow Root
|
|
425
334
|
[cmd.Name.GET_SHADOW_ROOT, get('/session/:sessionId/element/:id/shadow')],
|
|
426
|
-
[
|
|
427
|
-
|
|
335
|
+
[
|
|
336
|
+
cmd.Name.FIND_ELEMENT_FROM_SHADOWROOT,
|
|
337
|
+
post('/session/:sessionId/shadow/:id/element'),
|
|
338
|
+
],
|
|
339
|
+
[
|
|
340
|
+
cmd.Name.FIND_ELEMENTS_FROM_SHADOWROOT,
|
|
341
|
+
post('/session/:sessionId/shadow/:id/elements'),
|
|
342
|
+
],
|
|
428
343
|
// Log extensions.
|
|
429
344
|
[cmd.Name.GET_LOG, post('/session/:sessionId/se/log')],
|
|
430
345
|
[cmd.Name.GET_AVAILABLE_LOG_TYPES, get('/session/:sessionId/se/log/types')],
|
|
346
|
+
|
|
347
|
+
// Server Extensions
|
|
348
|
+
[cmd.Name.UPLOAD_FILE, post('/session/:sessionId/se/file')],
|
|
431
349
|
])
|
|
432
350
|
|
|
433
351
|
/**
|
|
@@ -451,31 +369,23 @@ class Client {
|
|
|
451
369
|
/**
|
|
452
370
|
* @param {Map<string, CommandSpec>} customCommands
|
|
453
371
|
* A map of custom command definitions.
|
|
454
|
-
* @param {boolean} w3c Whether to use W3C command mappings.
|
|
455
372
|
* @param {!cmd.Command} command The command to resolve.
|
|
456
373
|
* @return {!Request} A promise that will resolve with the
|
|
457
374
|
* command to execute.
|
|
458
375
|
*/
|
|
459
|
-
function buildRequest(customCommands,
|
|
376
|
+
function buildRequest(customCommands, command) {
|
|
460
377
|
LOG.finest(() => `Translating command: ${command.getName()}`)
|
|
461
378
|
let spec = customCommands && customCommands.get(command.getName())
|
|
462
379
|
if (spec) {
|
|
463
380
|
return toHttpRequest(spec)
|
|
464
381
|
}
|
|
465
382
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
} else if (spec) {
|
|
473
|
-
return toHttpRequest(spec)
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
spec = COMMAND_MAP.get(command.getName())
|
|
478
|
-
if (spec) {
|
|
383
|
+
spec = W3C_COMMAND_MAP.get(command.getName())
|
|
384
|
+
if (typeof spec === 'function') {
|
|
385
|
+
LOG.finest(() => `Transforming command for W3C: ${command.getName()}`)
|
|
386
|
+
let newCommand = spec(command)
|
|
387
|
+
return buildRequest(customCommands, newCommand)
|
|
388
|
+
} else if (spec) {
|
|
479
389
|
return toHttpRequest(spec)
|
|
480
390
|
}
|
|
481
391
|
throw new error.UnknownCommandError(
|
|
@@ -519,15 +429,6 @@ class Executor {
|
|
|
519
429
|
constructor(client) {
|
|
520
430
|
CLIENTS.set(this, client)
|
|
521
431
|
|
|
522
|
-
/**
|
|
523
|
-
* Whether this executor should use the W3C wire protocol. The executor
|
|
524
|
-
* will automatically switch if the remote end sends a compliant response
|
|
525
|
-
* to a new session command, however, this property may be directly set to
|
|
526
|
-
* `true` to force the executor into W3C mode.
|
|
527
|
-
* @type {boolean}
|
|
528
|
-
*/
|
|
529
|
-
this.w3c = false
|
|
530
|
-
|
|
531
432
|
/** @private {Map<string, CommandSpec>} */
|
|
532
433
|
this.customCommands_ = null
|
|
533
434
|
|
|
@@ -557,7 +458,7 @@ class Executor {
|
|
|
557
458
|
|
|
558
459
|
/** @override */
|
|
559
460
|
async execute(command) {
|
|
560
|
-
let request = buildRequest(this.customCommands_,
|
|
461
|
+
let request = buildRequest(this.customCommands_, command)
|
|
561
462
|
this.log_.finer(() => `>>> ${request.method} ${request.path}`)
|
|
562
463
|
|
|
563
464
|
let client = CLIENTS.get(this)
|
|
@@ -588,7 +489,7 @@ class Executor {
|
|
|
588
489
|
// No implementations use the `capabilities` key yet...
|
|
589
490
|
let capabilities = value.capabilities || value.value
|
|
590
491
|
return new Session(
|
|
591
|
-
/** @type {{sessionId: string}} */(value).sessionId,
|
|
492
|
+
/** @type {{sessionId: string}} */ (value).sessionId,
|
|
592
493
|
capabilities
|
|
593
494
|
)
|
|
594
495
|
}
|
|
@@ -658,7 +559,7 @@ function parseHttpResponse(command, httpResponse) {
|
|
|
658
559
|
|
|
659
560
|
// 404 represents an unknown command; anything else > 399 is a generic unknown
|
|
660
561
|
// error.
|
|
661
|
-
if (httpResponse.status
|
|
562
|
+
if (httpResponse.status === 404) {
|
|
662
563
|
throw new error.UnsupportedOperationError(command.getName() + ': ' + value)
|
|
663
564
|
} else if (httpResponse.status >= 400) {
|
|
664
565
|
throw new error.WebDriverError(value)
|
|
@@ -702,8 +603,11 @@ function buildPath(path, parameters) {
|
|
|
702
603
|
|
|
703
604
|
// PUBLIC API
|
|
704
605
|
|
|
705
|
-
exports
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
606
|
+
module.exports = {
|
|
607
|
+
Executor: Executor,
|
|
608
|
+
Client: Client,
|
|
609
|
+
Request: Request,
|
|
610
|
+
Response: Response,
|
|
611
|
+
// Exported for testing.
|
|
612
|
+
buildPath: buildPath
|
|
613
|
+
}
|
package/lib/input.js
CHANGED
package/lib/promise.js
CHANGED
|
@@ -142,14 +142,12 @@ async function map(array, fn, self = undefined) {
|
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
const arr = /** @type {!Array} */ (v)
|
|
145
|
-
const
|
|
146
|
-
const values = new Array(n)
|
|
145
|
+
const values = []
|
|
147
146
|
|
|
148
|
-
for (
|
|
149
|
-
|
|
150
|
-
values[i] = await Promise.resolve(fn.call(self, arr[i], i, arr))
|
|
151
|
-
}
|
|
147
|
+
for (const [index, item] of arr.entries()) {
|
|
148
|
+
values.push(await Promise.resolve(fn.call(self, item, index, arr)))
|
|
152
149
|
}
|
|
150
|
+
|
|
153
151
|
return values
|
|
154
152
|
}
|
|
155
153
|
|
|
@@ -181,19 +179,17 @@ async function filter(array, fn, self = undefined) {
|
|
|
181
179
|
}
|
|
182
180
|
|
|
183
181
|
const arr = /** @type {!Array} */ (v)
|
|
184
|
-
const n = arr.length
|
|
185
182
|
const values = []
|
|
186
|
-
let valuesLength = 0
|
|
187
183
|
|
|
188
|
-
for (
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
184
|
+
for (const [index, item] of arr.entries()) {
|
|
185
|
+
const isConditionTrue = await Promise.resolve(
|
|
186
|
+
fn.call(self, item, index, arr)
|
|
187
|
+
)
|
|
188
|
+
if (isConditionTrue) {
|
|
189
|
+
values.push(item)
|
|
195
190
|
}
|
|
196
191
|
}
|
|
192
|
+
|
|
197
193
|
return values
|
|
198
194
|
}
|
|
199
195
|
|
|
@@ -266,8 +262,7 @@ async function fullyResolveKeys(obj) {
|
|
|
266
262
|
) {
|
|
267
263
|
return
|
|
268
264
|
}
|
|
269
|
-
|
|
270
|
-
obj[key] = resolvedValue
|
|
265
|
+
obj[key] = await fullyResolved(partialValue)
|
|
271
266
|
})
|
|
272
267
|
return obj
|
|
273
268
|
}
|
package/lib/proxy.js
CHANGED
|
@@ -130,7 +130,7 @@ ManualConfig.prototype.socksVersion
|
|
|
130
130
|
* Configures WebDriver to bypass all browser proxies.
|
|
131
131
|
* @return {!Config} A new proxy configuration object.
|
|
132
132
|
*/
|
|
133
|
-
|
|
133
|
+
function direct() {
|
|
134
134
|
return { proxyType: Type.DIRECT }
|
|
135
135
|
}
|
|
136
136
|
|
|
@@ -155,7 +155,7 @@ exports.direct = function () {
|
|
|
155
155
|
* configuration options.
|
|
156
156
|
* @return {!ManualConfig} A new proxy configuration object.
|
|
157
157
|
*/
|
|
158
|
-
|
|
158
|
+
function manual({ ftp, http, https, bypass }) {
|
|
159
159
|
return {
|
|
160
160
|
proxyType: Type.MANUAL,
|
|
161
161
|
ftpProxy: ftp,
|
|
@@ -185,7 +185,7 @@ exports.manual = function ({ ftp, http, https, bypass }) {
|
|
|
185
185
|
* @return {!ManualConfig} A new proxy configuration object.
|
|
186
186
|
* @see https://en.wikipedia.org/wiki/SOCKS
|
|
187
187
|
*/
|
|
188
|
-
|
|
188
|
+
function socks(socksProxy, socksVersion = undefined) {
|
|
189
189
|
return /** @type {!Config} */ ({
|
|
190
190
|
proxyType: Type.MANUAL,
|
|
191
191
|
socksProxy,
|
|
@@ -199,7 +199,7 @@ exports.socks = function (socksProxy, socksVersion = undefined) {
|
|
|
199
199
|
* @param {string} proxyAutoconfigUrl URL for the PAC proxy to use.
|
|
200
200
|
* @return {!PacConfig} A new proxy configuration object.
|
|
201
201
|
*/
|
|
202
|
-
|
|
202
|
+
function pac(proxyAutoconfigUrl) {
|
|
203
203
|
return { proxyType: Type.PAC, proxyAutoconfigUrl }
|
|
204
204
|
}
|
|
205
205
|
|
|
@@ -207,6 +207,16 @@ exports.pac = function (proxyAutoconfigUrl) {
|
|
|
207
207
|
* Configures WebDriver to use the current system's proxy.
|
|
208
208
|
* @return {!Config} A new proxy configuration object.
|
|
209
209
|
*/
|
|
210
|
-
|
|
210
|
+
function system() {
|
|
211
211
|
return { proxyType: Type.SYSTEM }
|
|
212
212
|
}
|
|
213
|
+
|
|
214
|
+
// PUBLIC API
|
|
215
|
+
|
|
216
|
+
module.exports = {
|
|
217
|
+
system,
|
|
218
|
+
pac,
|
|
219
|
+
socks,
|
|
220
|
+
manual,
|
|
221
|
+
direct,
|
|
222
|
+
}
|
package/lib/session.js
CHANGED
package/lib/until.js
CHANGED
|
@@ -137,14 +137,13 @@ exports.alertIsPresent = function alertIsPresent() {
|
|
|
137
137
|
* @return {!Condition<boolean>} The new condition.
|
|
138
138
|
*/
|
|
139
139
|
exports.titleIs = function titleIs(title) {
|
|
140
|
-
return new Condition(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
)
|
|
140
|
+
return new Condition('for title to be ' + JSON.stringify(title), function (
|
|
141
|
+
driver
|
|
142
|
+
) {
|
|
143
|
+
return driver.getTitle().then(function (t) {
|
|
144
|
+
return t === title
|
|
145
|
+
})
|
|
146
|
+
})
|
|
148
147
|
}
|
|
149
148
|
|
|
150
149
|
/**
|
|
@@ -189,14 +188,13 @@ exports.titleMatches = function titleMatches(regex) {
|
|
|
189
188
|
* @return {!Condition<boolean>} The new condition.
|
|
190
189
|
*/
|
|
191
190
|
exports.urlIs = function urlIs(url) {
|
|
192
|
-
return new Condition(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
)
|
|
191
|
+
return new Condition('for URL to be ' + JSON.stringify(url), function (
|
|
192
|
+
driver
|
|
193
|
+
) {
|
|
194
|
+
return driver.getCurrentUrl().then(function (u) {
|
|
195
|
+
return u === url
|
|
196
|
+
})
|
|
197
|
+
})
|
|
200
198
|
}
|
|
201
199
|
|
|
202
200
|
/**
|