@appium/base-driver 8.2.1 → 8.2.2
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/build/lib/basedriver/commands/index.js +2 -4
- package/build/lib/basedriver/driver.js +2 -2
- package/build/lib/protocol/routes.js +1 -10
- package/build/test/basedriver/driver-e2e-tests.js +1 -218
- package/build/test/protocol/routes-specs.js +2 -2
- package/index.d.ts +0 -1
- package/lib/basedriver/commands/index.js +0 -2
- package/lib/basedriver/driver.js +1 -1
- package/lib/protocol/routes.js +0 -3
- package/package.json +2 -3
- package/test/basedriver/driver-e2e-tests.js +1 -179
- package/build/lib/basedriver/commands/execute-child.js +0 -137
- package/build/lib/basedriver/commands/execute.js +0 -119
- package/lib/basedriver/commands/execute-child.js +0 -132
- package/lib/basedriver/commands/execute.js +0 -126
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
-
import { BaseDriver, server, routeConfiguringFunction, DeviceSettings
|
|
3
|
-
import {
|
|
4
|
-
MJSONWP_ELEMENT_KEY, W3C_ELEMENT_KEY
|
|
5
|
-
} from '../../lib/constants';
|
|
2
|
+
import { BaseDriver, server, routeConfiguringFunction, DeviceSettings } from '../../lib';
|
|
6
3
|
import axios from 'axios';
|
|
7
4
|
import B from 'bluebird';
|
|
8
5
|
import {TEST_HOST, getTestPort, createAppiumURL, METHODS} from '../helpers';
|
|
@@ -339,181 +336,6 @@ function baseDriverE2ETests (DriverClass, defaultCaps = {}) {
|
|
|
339
336
|
});
|
|
340
337
|
});
|
|
341
338
|
|
|
342
|
-
describe('execute driver script', function () {
|
|
343
|
-
// mock some methods on BaseDriver that aren't normally there except in
|
|
344
|
-
// a fully blown driver
|
|
345
|
-
let originalFindElement, sessionId;
|
|
346
|
-
before(function () {
|
|
347
|
-
d.allowInsecure = ['execute_driver_script'];
|
|
348
|
-
originalFindElement = d.findElement;
|
|
349
|
-
d.findElement = (function (strategy, selector) {
|
|
350
|
-
if (strategy === 'accessibility id' && selector === 'amazing') {
|
|
351
|
-
return {[W3C_ELEMENT_KEY]: 'element-id-1'};
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
throw new errors.NoSuchElementError('not found');
|
|
355
|
-
}).bind(d);
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
beforeEach(async function () {
|
|
359
|
-
({sessionId} = await startSession(defaultCaps));
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
after(function () {
|
|
363
|
-
d.findElement = originalFindElement;
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
afterEach(async function () {
|
|
367
|
-
await endSession(sessionId);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
it('should not work unless the allowInsecure feature flag is set', async function () {
|
|
371
|
-
d._allowInsecure = d.allowInsecure;
|
|
372
|
-
try {
|
|
373
|
-
d.allowInsecure = [];
|
|
374
|
-
const script = `return 'foo'`;
|
|
375
|
-
await axios({
|
|
376
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
377
|
-
method: POST,
|
|
378
|
-
data: {script, type: 'wd'},
|
|
379
|
-
}).should.eventually.be.rejected;
|
|
380
|
-
await endSession(sessionId);
|
|
381
|
-
} finally {
|
|
382
|
-
d.allowInsecure = d._allowInsecure;
|
|
383
|
-
}
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
it('should execute a webdriverio script in the context of session', async function () {
|
|
387
|
-
const script = `
|
|
388
|
-
const timeouts = await driver.getTimeouts();
|
|
389
|
-
const status = await driver.status();
|
|
390
|
-
return [timeouts, status];
|
|
391
|
-
`;
|
|
392
|
-
const {value} = (await axios({
|
|
393
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
394
|
-
method: POST,
|
|
395
|
-
data: {script, type: 'webdriverio'},
|
|
396
|
-
})).data;
|
|
397
|
-
const expectedTimeouts = {command: 250, implicit: 0};
|
|
398
|
-
const expectedStatus = {};
|
|
399
|
-
value.result.should.eql([expectedTimeouts, expectedStatus]);
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
it('should fail with any script type other than webdriverio currently', async function () {
|
|
403
|
-
const script = `return 'foo'`;
|
|
404
|
-
await axios({
|
|
405
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
406
|
-
method: POST,
|
|
407
|
-
data: {script, type: 'wd'},
|
|
408
|
-
}).should.eventually.be.rejected;
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it('should execute a webdriverio script that returns elements correctly', async function () {
|
|
412
|
-
const script = `
|
|
413
|
-
return await driver.$("~amazing");
|
|
414
|
-
`;
|
|
415
|
-
const {value} = (await axios({
|
|
416
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
417
|
-
method: POST,
|
|
418
|
-
data: {script},
|
|
419
|
-
})).data;
|
|
420
|
-
value.result.should.eql({
|
|
421
|
-
[W3C_ELEMENT_KEY]: 'element-id-1',
|
|
422
|
-
[MJSONWP_ELEMENT_KEY]: 'element-id-1'
|
|
423
|
-
});
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
it('should execute a webdriverio script that returns elements in deep structure', async function () {
|
|
427
|
-
const script = `
|
|
428
|
-
const el = await driver.$("~amazing");
|
|
429
|
-
return {element: el, elements: [el, el]};
|
|
430
|
-
`;
|
|
431
|
-
const {value} = (await axios({
|
|
432
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
433
|
-
method: POST,
|
|
434
|
-
data: {script},
|
|
435
|
-
})).data;
|
|
436
|
-
const elObj = {
|
|
437
|
-
[W3C_ELEMENT_KEY]: 'element-id-1',
|
|
438
|
-
[MJSONWP_ELEMENT_KEY]: 'element-id-1'
|
|
439
|
-
};
|
|
440
|
-
value.result.should.eql({element: elObj, elements: [elObj, elObj]});
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
it('should store and return logs to the user', async function () {
|
|
444
|
-
const script = `
|
|
445
|
-
console.log("foo");
|
|
446
|
-
console.log("foo2");
|
|
447
|
-
console.warn("bar");
|
|
448
|
-
console.error("baz");
|
|
449
|
-
return null;
|
|
450
|
-
`;
|
|
451
|
-
const {value} = (await axios({
|
|
452
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
453
|
-
method: POST,
|
|
454
|
-
data: {script},
|
|
455
|
-
})).data;
|
|
456
|
-
value.logs.should.eql({log: ['foo', 'foo2'], warn: ['bar'], error: ['baz']});
|
|
457
|
-
});
|
|
458
|
-
|
|
459
|
-
it('should have appium specific commands available', async function () {
|
|
460
|
-
const script = `
|
|
461
|
-
return typeof driver.lock;
|
|
462
|
-
`;
|
|
463
|
-
const {value} = (await axios({
|
|
464
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
465
|
-
method: POST,
|
|
466
|
-
data: {script},
|
|
467
|
-
})).data;
|
|
468
|
-
value.result.should.eql('function');
|
|
469
|
-
});
|
|
470
|
-
|
|
471
|
-
it('should correctly handle errors that happen in a webdriverio script', async function () {
|
|
472
|
-
const script = `
|
|
473
|
-
return await driver.$("~notfound");
|
|
474
|
-
`;
|
|
475
|
-
const {data} = await axios({
|
|
476
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
477
|
-
method: POST,
|
|
478
|
-
validateStatus: null,
|
|
479
|
-
data: {script},
|
|
480
|
-
});
|
|
481
|
-
data.value.result.error.error.should.equal('no such element');
|
|
482
|
-
data.value.result.error.message.should.equal('not found');
|
|
483
|
-
data.value.result.error.stacktrace.should.includes('NoSuchElementError:');
|
|
484
|
-
data.value.result.selector.should.equal('~notfound');
|
|
485
|
-
data.value.result.sessionId.should.equal(sessionId);
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
it('should correctly handle errors that happen when a script cannot be compiled', async function () {
|
|
489
|
-
const script = `
|
|
490
|
-
return {;
|
|
491
|
-
`;
|
|
492
|
-
const {data} = await axios({
|
|
493
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
494
|
-
method: POST,
|
|
495
|
-
validateStatus: null,
|
|
496
|
-
data: {script},
|
|
497
|
-
});
|
|
498
|
-
data.value.should.have.property('message');
|
|
499
|
-
data.value.message.should.match(/An unknown server-side error occurred while processing the command. Original error: Could not execute driver script. Original error was: Error: Unexpected token '?;'?/);
|
|
500
|
-
});
|
|
501
|
-
|
|
502
|
-
it('should be able to set a timeout on a driver script', async function () {
|
|
503
|
-
const script = `
|
|
504
|
-
await Promise.delay(1000);
|
|
505
|
-
return true;
|
|
506
|
-
`;
|
|
507
|
-
const {value} = (await axios({
|
|
508
|
-
url: createAppiumTestURL(sessionId, 'appium/execute_driver'),
|
|
509
|
-
method: POST,
|
|
510
|
-
validateStatus: null,
|
|
511
|
-
data: {script, timeout: 50},
|
|
512
|
-
})).data;
|
|
513
|
-
value.message.should.match(/.+50.+timeout.+/);
|
|
514
|
-
});
|
|
515
|
-
});
|
|
516
|
-
|
|
517
339
|
if (DriverClass === BaseDriver) {
|
|
518
340
|
// only run this test on basedriver, not other drivers which also use these tests, since we
|
|
519
341
|
// don't want them to try and start sessions with these random capabilities that are
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
-
|
|
9
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
10
|
-
|
|
11
|
-
var _vm = _interopRequireDefault(require("vm"));
|
|
12
|
-
|
|
13
|
-
var _logger = _interopRequireDefault(require("../logger"));
|
|
14
|
-
|
|
15
|
-
var _webdriverio = require("webdriverio");
|
|
16
|
-
|
|
17
|
-
const W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735466cecf';
|
|
18
|
-
const MJSONWP_ELEMENT_KEY = 'ELEMENT';
|
|
19
|
-
|
|
20
|
-
async function runScript(driverOpts, script, timeout) {
|
|
21
|
-
if (!_lodash.default.isNumber(timeout)) {
|
|
22
|
-
throw new Error('Timeout parameter must be a number');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const logLevels = ['error', 'warn', 'log'];
|
|
26
|
-
const logs = {};
|
|
27
|
-
const consoleFns = {};
|
|
28
|
-
|
|
29
|
-
for (const level of logLevels) {
|
|
30
|
-
logs[level] = [];
|
|
31
|
-
|
|
32
|
-
consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const driver = (0, _webdriverio.attach)(driverOpts);
|
|
36
|
-
const fullScript = buildScript(script);
|
|
37
|
-
|
|
38
|
-
const vmCtx = _vm.default.runInNewContext(fullScript, {}, {
|
|
39
|
-
timeout
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
_logger.default.info('Running driver script in Node vm');
|
|
43
|
-
|
|
44
|
-
let result = await vmCtx(driver, consoleFns, _bluebird.default);
|
|
45
|
-
|
|
46
|
-
_logger.default.info('Ensuring driver script result is appropriate type for return');
|
|
47
|
-
|
|
48
|
-
result = coerceScriptResult(result);
|
|
49
|
-
return {
|
|
50
|
-
result,
|
|
51
|
-
logs
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function buildScript(script) {
|
|
56
|
-
return `(async function execute (driver, console, Promise) {
|
|
57
|
-
${script}
|
|
58
|
-
})`;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function coerceScriptResult(obj) {
|
|
62
|
-
try {
|
|
63
|
-
obj = JSON.parse(JSON.stringify(obj));
|
|
64
|
-
} catch (e) {
|
|
65
|
-
_logger.default.warn('Could not convert executeDriverScript to safe response!' + `Result was: ${obj}. Will make it null`);
|
|
66
|
-
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
let res;
|
|
71
|
-
|
|
72
|
-
if (_lodash.default.isPlainObject(obj)) {
|
|
73
|
-
res = {};
|
|
74
|
-
|
|
75
|
-
if (obj[MJSONWP_ELEMENT_KEY] || obj[W3C_ELEMENT_KEY]) {
|
|
76
|
-
if (obj[MJSONWP_ELEMENT_KEY]) {
|
|
77
|
-
res[MJSONWP_ELEMENT_KEY] = obj[MJSONWP_ELEMENT_KEY];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (obj[W3C_ELEMENT_KEY]) {
|
|
81
|
-
res[W3C_ELEMENT_KEY] = obj[W3C_ELEMENT_KEY];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return res;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
for (const key of Object.keys(obj)) {
|
|
88
|
-
res[key] = coerceScriptResult(obj[key]);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return res;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (_lodash.default.isArray(obj)) {
|
|
95
|
-
return obj.map(coerceScriptResult);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return obj;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async function main(driverOpts, script, timeout) {
|
|
102
|
-
let res;
|
|
103
|
-
|
|
104
|
-
try {
|
|
105
|
-
res = {
|
|
106
|
-
success: await runScript(driverOpts, script, timeout)
|
|
107
|
-
};
|
|
108
|
-
} catch (error) {
|
|
109
|
-
res = {
|
|
110
|
-
error: {
|
|
111
|
-
message: error.message,
|
|
112
|
-
stack: error.stack
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
await _bluebird.default.promisify(process.send, {
|
|
118
|
-
context: process
|
|
119
|
-
})(res);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (require.main === module) {
|
|
123
|
-
_logger.default.info('Running driver execution in child process');
|
|
124
|
-
|
|
125
|
-
process.on('message', ({
|
|
126
|
-
driverOpts,
|
|
127
|
-
script,
|
|
128
|
-
timeout
|
|
129
|
-
}) => {
|
|
130
|
-
_logger.default.info('Parameters received from parent process');
|
|
131
|
-
|
|
132
|
-
main(driverOpts, script, timeout);
|
|
133
|
-
});
|
|
134
|
-
}require('source-map-support').install();
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2V4ZWN1dGUtY2hpbGQuanMiXSwibmFtZXMiOlsiVzNDX0VMRU1FTlRfS0VZIiwiTUpTT05XUF9FTEVNRU5UX0tFWSIsInJ1blNjcmlwdCIsImRyaXZlck9wdHMiLCJzY3JpcHQiLCJ0aW1lb3V0IiwiXyIsImlzTnVtYmVyIiwiRXJyb3IiLCJsb2dMZXZlbHMiLCJsb2dzIiwiY29uc29sZUZucyIsImxldmVsIiwibG9nTXNncyIsInB1c2giLCJkcml2ZXIiLCJmdWxsU2NyaXB0IiwiYnVpbGRTY3JpcHQiLCJ2bUN0eCIsInZtIiwicnVuSW5OZXdDb250ZXh0IiwibG9nIiwiaW5mbyIsInJlc3VsdCIsIkIiLCJjb2VyY2VTY3JpcHRSZXN1bHQiLCJvYmoiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlIiwid2FybiIsInJlcyIsImlzUGxhaW5PYmplY3QiLCJrZXkiLCJPYmplY3QiLCJrZXlzIiwiaXNBcnJheSIsIm1hcCIsIm1haW4iLCJzdWNjZXNzIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJwcm9taXNpZnkiLCJwcm9jZXNzIiwic2VuZCIsImNvbnRleHQiLCJyZXF1aXJlIiwibW9kdWxlIiwib24iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBLE1BQU1BLGVBQWUsR0FBRyxxQ0FBeEI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxTQUE1Qjs7QUFFQSxlQUFlQyxTQUFmLENBQTBCQyxVQUExQixFQUFzQ0MsTUFBdEMsRUFBOENDLE9BQTlDLEVBQXVEO0FBQ3JELE1BQUksQ0FBQ0MsZ0JBQUVDLFFBQUYsQ0FBV0YsT0FBWCxDQUFMLEVBQTBCO0FBQ3hCLFVBQU0sSUFBSUcsS0FBSixDQUFVLG9DQUFWLENBQU47QUFDRDs7QUFHRCxRQUFNQyxTQUFTLEdBQUcsQ0FBQyxPQUFELEVBQVUsTUFBVixFQUFrQixLQUFsQixDQUFsQjtBQUNBLFFBQU1DLElB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QUFDUSxNQUFBQSxPQUFPLEVBQUUsTUFBTXRDLFNBQVMsQ0FBQ0MsVUFBRCxFQUFhQyxNQUFiLEVBQXFCQyxPQUFyQjtBQUF6QixLQUFOO0FBQ0QsR0FGRCxDQUVFLE9BQU9vQyxLQUFQLEVBQWM7QUFDZFQsSUFBQUEsR0FBRyxHQUFHO0FBQUNTLE1BQUFBLEtBQUssRUFBRTtBQUFDQyxRQUFBQSxPQUFPLEVBQUVELEtBQUssQ0FBQ0MsT0FBaEI7QUFBeUJDLFFBQUFBLEtBQUssRUFBRUYsS0FBSyxDQUFDRTtBQUF0QztBQUFSLEtBQU47QUFDRDs7QUFDRCxRQUFNbkIsa0JBQUVvQixTQUFGLENBQVlDLE9BQU8sQ0FBQ0MsSUFBcEIsRUFBMEI7QUFBQ0MsSUFBQUEsT0FBTyxFQUFFRjtBQUFWLEdBQTFCLEVBQThDYixHQUE5QyxDQUFOO0FBQ0Q7O0FBRUQsSUFBSWdCLE9BQU8sQ0FBQ1QsSUFBUixLQUFpQlUsTUFBckIsRUFBNkI7QUFDM0I1QixrQkFBSUMsSUFBSixDQUFTLDJDQUFUOztBQUNBdUIsRUFBQUEsT0FBTyxDQUFDSyxFQUFSLENBQVcsU0FBWCxFQUFzQixDQUFDO0FBQUMvQyxJQUFBQSxVQUFEO0FBQWFDLElBQUFBLE1BQWI7QUFBcUJDLElBQUFBO0FBQXJCLEdBQUQsS0FBbUM7QUFDdkRnQixvQkFBSUMsSUFBSixDQUFTLHlDQUFUOztBQUNBaUIsSUFBQUEsSUFBSSxDQUFDcEMsVUFBRCxFQUFhQyxNQUFiLEVBQXFCQyxPQUFyQixDQUFKO0FBQ0QsR0FIRDtBQUlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB2bSBmcm9tICd2bSc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBhdHRhY2ggfSBmcm9tICd3ZWJkcml2ZXJpbyc7XG5cbi8vIGR1cGxpY2F0ZSBkZWZpbmluZyB0aGVzZSBrZXlzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byByZS1sb2FkIGEgaHVnZSBhcHBpdW1cbi8vIGRlcGVuZGVuY3kgdHJlZSBpbnRvIG1lbW9yeSBqdXN0IHRvIHJ1biBhIHdkaW8gc2NyaXB0XG5jb25zdCBXM0NfRUxFTUVOVF9LRVkgPSAnZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YnO1xuY29uc3QgTUpTT05XUF9FTEVNRU5UX0tFWSA9ICdFTEVNRU5UJztcblxuYXN5bmMgZnVuY3Rpb24gcnVuU2NyaXB0IChkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXQpIHtcbiAgaWYgKCFfLmlzTnVtYmVyKHRpbWVvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaW1lb3V0IHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICAvLyBzZXQgdXAgZmFrZSBsb2dnZXJcbiAgY29uc3QgbG9nTGV2ZWxzID0gWydlcnJvcicsICd3YXJuJywgJ2xvZyddO1xuICBjb25zdCBsb2dzID0ge307XG4gIGNvbnN0IGNvbnNvbGVGbnMgPSB7fTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsb2dMZXZlbHMpIHtcbiAgICBsb2dzW2xldmVsXSA9IFtdO1xuICAgIGNvbnNvbGVGbnNbbGV2ZWxdID0gKC4uLmxvZ01zZ3MpID0+IGxvZ3NbbGV2ZWxdLnB1c2goLi4ubG9nTXNncyk7XG4gIH1cblxuICBjb25zdCBkcml2ZXIgPSBhdHRhY2goZHJpdmVyT3B0cyk7XG5cbiAgY29uc3QgZnVsbFNjcmlwdCA9IGJ1aWxkU2NyaXB0KHNjcmlwdCk7XG4gIC8vIHRoZSB0aW1lb3V0IGhlcmUgd2lsbCBub3QgbWF0dGVyIHJlYWxseSwgYnV0IHNldCBpdCBhbnl3YXkgdG8gYmUgb24gdGhlXG4gIC8vIHNhZmUgc2lkZVxuICBjb25zdCB2bUN0eCA9IHZtLnJ1bkluTmV3Q29udGV4dChmdWxsU2NyaXB0LCB7fSwge3RpbWVvdXR9KTtcblxuICAvLyBydW4gdGhlIGRyaXZlciBzY3JpcHQsIGdpdmluZyB1c2VyIGFjY2VzcyB0byB0aGUgZHJpdmVyIG9iamVjdCwgYSBmYWtlXG4gIC8vIGNvbnNvbGUgbG9nZ2VyLCBhbmQgYSBwcm9taXNlIGxpYnJhcnlcbiAgbG9nLmluZm8oJ1J1bm5pbmcgZHJpdmVyIHNjcmlwdCBpbiBOb2RlIHZtJyk7XG4gIGxldCByZXN1bHQgPSBhd2FpdCB2bUN0eChkcml2ZXIsIGNvbnNvbGVGbnMsIEIpO1xuXG4gIGxvZy5pbmZvKCdFbnN1cmluZyBkcml2ZXIgc2NyaXB0IHJlc3VsdCBpcyBhcHByb3ByaWF0ZSB0eXBlIGZvciByZXR1cm4nKTtcbiAgcmVzdWx0ID0gY29lcmNlU2NyaXB0UmVzdWx0KHJlc3VsdCk7XG4gIHJldHVybiB7cmVzdWx0LCBsb2dzfTtcbn1cblxuLyoqXG4gKiBFbWJlZCBhIHVzZXItZ2VuZXJhdGVkIHNjcmlwdCBpbnNpZGUgYSBtZXRob2Qgd2hpY2ggdGFrZXMgb25seSB0aGVcbiAqIHByZWRldGVybWluZWQgb2JqZWN0cyB3ZSBzcGVjaWZ5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdCAtIHRoZSBqYXZhc2NyaXB0IHRvIGV4ZWN1dGVcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gdGhlIGZ1bGwgc2NyaXB0IHRvIGV4ZWN1dGVcbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHQgKHNjcmlwdCkge1xuICByZXR1cm4gYChhc3luYyBmdW5jdGlvbiBleGVjdXRlIChkcml2ZXIsIGNvbnNvbGUsIFByb21pc2UpIHtcbiAgICAke3NjcmlwdH1cbiAgfSlgO1xufVxuXG4vKipcbiAqIFdlIGNhbiBnZXQgYW55IG1hbm5lciBvZiBjcmF6eSB0aGluZyBiYWNrIGZyb20gYSB2bSBleGVjdXRpbmcgdW50cnVzdGVkXG4gKiBjb2RlLiBXZSBtaWdodCBhbHNvIGdldCBXZWJkcml2ZXJJTyBvYmplY3RzIHRoYXQgYXJlbid0IHN1aXRhYmxlIGZvciBKU09OXG4gKiByZXNwb25zZS4gU28gbWFrZSBzdXJlIHdlIGNvbnZlcnQgdGhlIHRoaW5ncyB3ZSBrbm93IGFib3V0IHRvIHRoZWlyXG4gKiBhcHByb3ByaWF0ZSByZXNwb25zZSBmb3JtYXQsIGFuZCBzcXVhc2ggb3RoZXIgd2VpcmQgdGhpbmdzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBvYmplY3QgdG8gY29udmVydCBhbmQgc2FuaXRpemVcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gc2FmZWx5IGNvbnZlcnRlZCBvYmplY3RcbiAqL1xuZnVuY3Rpb24gY29lcmNlU2NyaXB0UmVzdWx0IChvYmopIHtcbiAgLy8gZmlyc3QgZW5zdXJlIG9iaiBpcyBvZiBhIHR5cGUgdGhhdCBjYW4gYmUgSlNPTiBlbmNvZGVkIHNhZmVseS4gVGhpcyB3aWxsXG4gIC8vIGdldCByaWQgb2YgY3VzdG9tIG9iamVjdHMsIGZ1bmN0aW9ucywgZXRjLi4uIGFuZCB0dXJuIHRoZW0gaW50byBQT0pPc1xuICB0cnkge1xuICAgIG9iaiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cud2FybignQ291bGQgbm90IGNvbnZlcnQgZXhlY3V0ZURyaXZlclNjcmlwdCB0byBzYWZlIHJlc3BvbnNlIScgK1xuICAgICAgICAgICAgIGBSZXN1bHQgd2FzOiAke29ian0uIFdpbGwgbWFrZSBpdCBudWxsYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgcmVzO1xuXG4gIC8vIG5vdyB3ZSBiZWdpbiBvdXIgcmVjdXJzaXZlIGNhc2Ugb3B0aW9uc1xuICBpZiAoXy5pc1BsYWluT2JqZWN0KG9iaikpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGFuIG9iamVjdCwgaXQncyBlaXRoZXIgYW4gZWxlbWVudCBvYmplY3Qgb3Igc29tZXRoaW5nIGVsc2VcbiAgICAvLyB3ZWJkcml2ZXJpbyBoYXMgbm8gbW9uYWRpYyBvYmplY3QgdHlwZXMgb3RoZXIgdGhhbiBlbGVtZW50IGFuZCBkcml2ZXIsXG4gICAgLy8gYW5kIHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgc3BlY2lhbCBjYXNpbmcgcmV0dXJuIG9mIGRyaXZlclxuICAgIHJlcyA9IHt9O1xuXG4gICAgaWYgKG9ialtNSlNPTldQX0VMRU1FTlRfS0VZXSB8fCBvYmpbVzNDX0VMRU1FTlRfS0VZXSkge1xuICAgICAgLy8gaWYgaXQncyBhbiBlbGVtZW50IG9iamVjdCwgY2xlYXIgb3V0IGFueXRoaW5nIHRoYXQncyBub3QgdGhlIGtleSwgYW5kXG4gICAgICAvLyB0aGVuIHJldHVybiB0aGUgb2JqZWN0XG4gICAgICBpZiAob2JqW01KU09OV1BfRUxFTUVOVF9LRVldKSB7XG4gICAgICAgIHJlc1tNSlNPTldQX0VMRU1FTlRfS0VZXSA9IG9ialtNSlNPTldQX0VMRU1FTlRfS0VZXTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ialtXM0NfRUxFTUVOVF9LRVldKSB7XG4gICAgICAgIHJlc1tXM0NfRUxFTUVOVF9LRVldID0gb2JqW1czQ19FTEVNRU5UX0tFWV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSwgcmVjdXJzZSBpbnRvIHRoZSBvYmplY3RcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICByZXNba2V5XSA9IGNvZXJjZVNjcmlwdFJlc3VsdChvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBpbiB0aGUgY2FlIG9mIGFuIGFycmF5LCBqdXN0IHJlY3Vyc2UgaW50byB0aGUgaXRlbXNcbiAgaWYgKF8uaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAoY29lcmNlU2NyaXB0UmVzdWx0KTtcbiAgfVxuXG4gIC8vIGJhc2UgY2FzZSwgaWYgaXQncyBub3QgYW4gb2JqZWN0IG9yIGFycmF5LCByZXR1cm4gc3RyYWlnaHRhd2F5XG4gIHJldHVybiBvYmo7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4gKGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dCkge1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IHtzdWNjZXNzOiBhd2FpdCBydW5TY3JpcHQoZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0KX07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzID0ge2Vycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07XG4gIH1cbiAgYXdhaXQgQi5wcm9taXNpZnkocHJvY2Vzcy5zZW5kLCB7Y29udGV4dDogcHJvY2Vzc30pKHJlcyk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBsb2cuaW5mbygnUnVubmluZyBkcml2ZXIgZXhlY3V0aW9uIGluIGNoaWxkIHByb2Nlc3MnKTtcbiAgcHJvY2Vzcy5vbignbWVzc2FnZScsICh7ZHJpdmVyT3B0cywgc2NyaXB0LCB0aW1lb3V0fSkgPT4ge1xuICAgIGxvZy5pbmZvKCdQYXJhbWV0ZXJzIHJlY2VpdmVkIGZyb20gcGFyZW50IHByb2Nlc3MnKTtcbiAgICBtYWluKGRyaXZlck9wdHMsIHNjcmlwdCwgdGltZW91dCk7XG4gIH0pO1xufVxuIl0sImZpbGUiOiJsaWIvYmFzZWRyaXZlci9jb21tYW5kcy9leGVjdXRlLWNoaWxkLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uIn0=
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.default = void 0;
|
|
9
|
-
|
|
10
|
-
require("source-map-support/register");
|
|
11
|
-
|
|
12
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
|
-
var _path = _interopRequireDefault(require("path"));
|
|
15
|
-
|
|
16
|
-
var _child_process = _interopRequireDefault(require("child_process"));
|
|
17
|
-
|
|
18
|
-
var _logger = _interopRequireDefault(require("../logger"));
|
|
19
|
-
|
|
20
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
21
|
-
|
|
22
|
-
const FEAT_FLAG = 'execute_driver_script';
|
|
23
|
-
const DEFAULT_SCRIPT_TIMEOUT = 1000 * 60 * 60;
|
|
24
|
-
const SCRIPT_TYPE_WDIO = 'webdriverio';
|
|
25
|
-
let commands = {};
|
|
26
|
-
|
|
27
|
-
commands.executeDriverScript = async function (script, scriptType = 'webdriverio', timeout = DEFAULT_SCRIPT_TIMEOUT) {
|
|
28
|
-
if (!this.isFeatureEnabled(FEAT_FLAG)) {
|
|
29
|
-
throw new Error(`Execute driver script functionality is not available ` + `unless server is started with --allow-insecure including ` + `the '${FEAT_FLAG}' flag, e.g., --allow-insecure=${FEAT_FLAG}`);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (scriptType !== SCRIPT_TYPE_WDIO) {
|
|
33
|
-
throw new Error(`Only the '${SCRIPT_TYPE_WDIO}' script type is currently supported`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (!this.opts.address || !this.opts.port) {
|
|
37
|
-
throw new Error('Address or port of running server were not defined; this ' + 'is required. This is probably a programming error in the driver');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!_lodash.default.isNumber(timeout)) {
|
|
41
|
-
throw new Error('Timeout parameter must be a number');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const driverOpts = {
|
|
45
|
-
sessionId: this.sessionId,
|
|
46
|
-
protocol: 'http',
|
|
47
|
-
hostname: this.opts.address,
|
|
48
|
-
port: this.opts.port,
|
|
49
|
-
path: this.basePath,
|
|
50
|
-
isW3C: this.isW3CProtocol(),
|
|
51
|
-
isMobile: true,
|
|
52
|
-
capabilities: this.caps
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
_logger.default.info(`Constructed webdriverio driver options; W3C mode is ${driverOpts.isW3C ? 'on' : 'off'}`);
|
|
56
|
-
|
|
57
|
-
const childScript = _path.default.join(__dirname, 'execute-child.js');
|
|
58
|
-
|
|
59
|
-
_logger.default.info(`Forking process to run webdriver script as child using ${childScript}`);
|
|
60
|
-
|
|
61
|
-
const scriptProc = _child_process.default.fork(childScript);
|
|
62
|
-
|
|
63
|
-
let timeoutCanceled = false;
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
const timeoutStart = Date.now();
|
|
67
|
-
|
|
68
|
-
const waitForResult = async function () {
|
|
69
|
-
const resPromise = new _bluebird.default(res => {
|
|
70
|
-
scriptProc.on('message', res);
|
|
71
|
-
});
|
|
72
|
-
const res = await resPromise;
|
|
73
|
-
|
|
74
|
-
_logger.default.info('Received execute driver script result from child process, shutting it down');
|
|
75
|
-
|
|
76
|
-
if (res.error) {
|
|
77
|
-
throw new Error(res.error.message);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return res.success;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
const waitForTimeout = async function () {
|
|
84
|
-
while (!timeoutCanceled && Date.now() - timeoutStart < timeout) {
|
|
85
|
-
await _bluebird.default.delay(500);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (timeoutCanceled) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
throw new Error(`Execute driver script timed out after ${timeout}ms. ` + `You can adjust this with the 'timeout' parameter.`);
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
_logger.default.info('Sending driver and script data to child');
|
|
96
|
-
|
|
97
|
-
scriptProc.send({
|
|
98
|
-
driverOpts,
|
|
99
|
-
script,
|
|
100
|
-
timeout
|
|
101
|
-
});
|
|
102
|
-
return await _bluebird.default.race([waitForResult(), waitForTimeout()]);
|
|
103
|
-
} catch (err) {
|
|
104
|
-
throw new Error(`Could not execute driver script. Original error was: ${err}`);
|
|
105
|
-
} finally {
|
|
106
|
-
timeoutCanceled = true;
|
|
107
|
-
|
|
108
|
-
_logger.default.info('Disconnecting from and killing driver script child proc');
|
|
109
|
-
|
|
110
|
-
scriptProc.disconnect();
|
|
111
|
-
scriptProc.kill();
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
var _default = commands;
|
|
116
|
-
exports.default = _default;require('source-map-support').install();
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9iYXNlZHJpdmVyL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwibmFtZXMiOlsiRkVBVF9GTEFHIiwiREVGQVVMVF9TQ1JJUFRfVElNRU9VVCIsIlNDUklQVF9UWVBFX1dESU8iLCJjb21tYW5kcyIsImV4ZWN1dGVEcml2ZXJTY3JpcHQiLCJzY3JpcHQiLCJzY3JpcHRUeXBlIiwidGltZW91dCIsImlzRmVhdHVyZUVuYWJsZWQiLCJFcnJvciIsIm9wdHMiLCJhZGRyZXNzIiwicG9ydCIsIl8iLCJpc051bWJlciIsImRyaXZlck9wdHMiLCJzZXNzaW9uSWQiLCJwcm90b2NvbCIsImhvc3RuYW1lIiwicGF0aCIsImJhc2VQYXRoIiwiaXNXM0MiLCJpc1czQ1Byb3RvY29sIiwiaXNNb2JpbGUiLCJjYXBhYmlsaXRpZXMiLCJjYXBzIiwibG9nIiwiaW5mbyIsImNoaWxkU2NyaXB0Iiwiam9pbiIsIl9fZGlybmFtZSIsInNjcmlwdFByb2MiLCJjcCIsImZvcmsiLCJ0aW1lb3V0Q2FuY2VsZWQiLCJ0aW1lb3V0U3RhcnQiLCJEYXRlIiwibm93Iiwid2FpdEZvclJlc3VsdCIsInJlc1Byb21pc2UiLCJCIiwicmVzIiwib24iLCJlcnJvciIsIm1lc3NhZ2UiLCJzdWNjZXNzIiwid2FpdEZvclRpbWVvdXQiLCJkZWxheSIsInNlbmQiLCJyYWNlIiwiZXJyIiwiZGlzY29ubmVjdCIsImtpbGwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsU0FBUyxHQUFHLHVCQUFsQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLE9BQU8sRUFBUCxHQUFZLEVBQTNDO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsYUFBekI7QUFHQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjs7QUFjQUEsUUFBUSxDQUFDQyxtQkFBVCxHQUErQixnQkFBZ0JDLE1BQWhCLEVBQXdCQyxVQUFVLEdBQUcsYUFBckMsRUFDN0JDLE9BQU8sR0FBR04s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QUFBQSxNQUFiO0FBQXFCRSxNQUFBQTtBQUFyQixLQUFoQjtBQUdBLFdBQU8sTUFBTWlDLGtCQUFFUyxJQUFGLENBQU8sQ0FBQ1gsYUFBYSxFQUFkLEVBQWtCUSxjQUFjLEVBQWhDLENBQVAsQ0FBYjtBQUNELEdBMUNELENBMENFLE9BQU9JLEdBQVAsRUFBWTtBQUNaLFVBQU0sSUFBSXpDLEtBQUosQ0FBVyx3REFBdUR5QyxHQUFJLEVBQXRFLENBQU47QUFDRCxHQTVDRCxTQTRDVTtBQUdSaEIsSUFBQUEsZUFBZSxHQUFHLElBQWxCOztBQUVBUixvQkFBSUMsSUFBSixDQUFTLHlEQUFUOztBQUNBSSxJQUFBQSxVQUFVLENBQUNvQixVQUFYO0FBQ0FwQixJQUFBQSxVQUFVLENBQUNxQixJQUFYO0FBQ0Q7QUFDRixDQWpHRDs7ZUFvR2VqRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNwIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBGRUFUX0ZMQUcgPSAnZXhlY3V0ZV9kcml2ZXJfc2NyaXB0JztcbmNvbnN0IERFRkFVTFRfU0NSSVBUX1RJTUVPVVQgPSAxMDAwICogNjAgKiA2MDsgLy8gZGVmYXVsdCB0byAxIGhvdXIgdGltZW91dFxuY29uc3QgU0NSSVBUX1RZUEVfV0RJTyA9ICd3ZWJkcml2ZXJpbyc7XG4vLyBUT0RPIGFkZCB3ZCBzY3JpcHQgdHlwZSBhdCBzb21lIHBvaW50XG5cbmxldCBjb21tYW5kcyA9IHt9O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHRha2VzIGEgc3RyaW5nIHdoaWNoIGlzIGV4ZWN1dGVkIGFzIGphdmFzY3JpcHQgaW4gdGhlIGNvbnRleHQgb2ZcbiAqIGEgbmV3IG5vZGVqcyBWTSwgYW5kIHdoaWNoIGhhcyBhdmFpbGFibGUgYSB3ZWJkcml2ZXJpbyBkcml2ZXIgb2JqZWN0LCBoYXZpbmdcbiAqIGFscmVhZHkgYmVlbiBhdHRhY2hlZCB0byB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2Vzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IC0gdGhlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRyaXZlciBzY3JpcHQgdG8gcnVuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdFR5cGU9J3dlYmRyaXZlcmlvJ10gLSB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyIHNjcmlwdFxuICogbGlicmFyeSAoY3VycmVudGx5IG9ubHkgd2ViZHJpdmVyaW8gaXMgc3VwcG9ydGVkKVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gYSBKU09OaWZpYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXR1cm4gdmFsdWUgb2ZcbiAqIHRoZSBzY3JpcHRcbiAqL1xuY29tbWFuZHMuZXhlY3V0ZURyaXZlclNjcmlwdCA9IGFzeW5jIGZ1bmN0aW9uIChzY3JpcHQsIHNjcmlwdFR5cGUgPSAnd2ViZHJpdmVyaW8nLFxuICB0aW1lb3V0ID0gREVGQVVMVF9TQ1JJUFRfVElNRU9VVCkge1xuXG4gIGlmICghdGhpcy5pc0ZlYXR1cmVFbmFibGVkKEZFQVRfRkxBRykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4ZWN1dGUgZHJpdmVyIHNjcmlwdCBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhdmFpbGFibGUgYCArXG4gICAgICAgICAgICAgICAgICAgIGB1bmxlc3Mgc2VydmVyIGlzIHN0YXJ0ZWQgd2l0aCAtLWFsbG93LWluc2VjdXJlIGluY2x1ZGluZyBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSAnJHtGRUFUX0ZMQUd9JyBmbGFnLCBlLmcuLCAtLWFsbG93LWluc2VjdXJlPSR7RkVBVF9GTEFHfWApO1xuICB9XG5cbiAgaWYgKHNjcmlwdFR5cGUgIT09IFNDUklQVF9UWVBFX1dESU8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGhlICcke1NDUklQVF9UWVBFX1dESU99JyBzY3JpcHQgdHlwZSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBpZiAoIXRoaXMub3B0cy5hZGRyZXNzIHx8ICF0aGlzLm9wdHMucG9ydCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWRkcmVzcyBvciBwb3J0IG9mIHJ1bm5pbmcgc2VydmVyIHdlcmUgbm90IGRlZmluZWQ7IHRoaXMgJyArXG4gICAgICAgICAgICAgICAgICAgICdpcyByZXF1aXJlZC4gVGhpcyBpcyBwcm9iYWJseSBhIHByb2dyYW1taW5nIGVycm9yIGluIHRoZSBkcml2ZXInKTtcbiAgfVxuXG4gIGlmICghXy5pc051bWJlcih0aW1lb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGltZW91dCBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3QgZHJpdmVyT3B0cyA9IHtcbiAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgIHByb3RvY29sOiAnaHR0cCcsIC8vIEFwcGl1bSB3b24ndCBldmVyIGJlIGJlaGluZCBzc2wgbG9jYWxseVxuICAgIGhvc3RuYW1lOiB0aGlzLm9wdHMuYWRkcmVzcyxcbiAgICBwb3J0OiB0aGlzLm9wdHMucG9ydCxcbiAgICBwYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIGlzVzNDOiB0aGlzLmlzVzNDUHJvdG9jb2woKSxcbiAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICBjYXBhYmlsaXRpZXM6IHRoaXMuY2Fwc1xuICB9O1xuICBsb2cuaW5mbyhgQ29uc3RydWN0ZWQgd2ViZHJpdmVyaW8gZHJpdmVyIG9wdGlvbnM7IFczQyBtb2RlIGlzICR7ZHJpdmVyT3B0cy5pc1czQyA/ICdvbicgOiAnb2ZmJ31gKTtcblxuXG4gIC8vIGZvcmsgdGhlIGV4ZWN1dGlvbiBzY3JpcHQgYXMgYSBjaGlsZCBwcm9jZXNzXG4gIGNvbnN0IGNoaWxkU2NyaXB0ID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2V4ZWN1dGUtY2hpbGQuanMnKTtcbiAgbG9nLmluZm8oYEZvcmtpbmcgcHJvY2VzcyB0byBydW4gd2ViZHJpdmVyIHNjcmlwdCBhcyBjaGlsZCB1c2luZyAke2NoaWxkU2NyaXB0fWApO1xuICBjb25zdCBzY3JpcHRQcm9jID0gY3AuZm9yayhjaGlsZFNjcmlwdCk7XG5cbiAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIGhhdmUgY2FuY2VsZWQgdGhlIHNjcmlwdCB0aW1lb3V0LCBzbyB3ZSBjYW4gc3RvcFxuICAvLyB3YWl0aW5nIGZvciBpdCBhbmQgYWxsb3cgdGhpcyBwcm9jZXNzIHRvIGZpbmlzaCBncmFjZWZ1bGx5XG4gIGxldCB0aW1lb3V0Q2FuY2VsZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRpbWVvdXRTdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAvLyBwcm9taXNlIHRoYXQgZGVhbHMgd2l0aCB0aGUgcmVzdWx0IGZyb20gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICBjb25zdCB3YWl0Rm9yUmVzdWx0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzUHJvbWlzZSA9IG5ldyBCKChyZXMpID0+IHtcbiAgICAgICAgc2NyaXB0UHJvYy5vbignbWVzc2FnZScsIHJlcyk7IC8vIHRoaXMgaXMgbm9kZSBJUENcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXNQcm9taXNlO1xuICAgICAgbG9nLmluZm8oJ1JlY2VpdmVkIGV4ZWN1dGUgZHJpdmVyIHNjcmlwdCByZXN1bHQgZnJvbSBjaGlsZCBwcm9jZXNzLCBzaHV0dGluZyBpdCBkb3duJyk7XG5cbiAgICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlcy5lcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcy5zdWNjZXNzO1xuICAgIH07XG5cbiAgICAvLyBwcm9taXNlIHRoYXQgd2FpdHMgdXAgdG8gdGhlIHRpbWVvdXQgYW5kIHRocm93cyBhbiBlcnJvciBpZiBzbywgb3IgZG9lc1xuICAgIC8vIG5vdGhpbmcgaWYgdGhlIHRpbWVvdXQgaXMgY2FuY2VsZWQgYmVjYXVzZSB3ZSBnb3QgYSByZXN1bHQgZnJvbSB0aGVcbiAgICAvLyBjaGlsZCBzY3JpcHRcbiAgICBjb25zdCB3YWl0Rm9yVGltZW91dCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlICghdGltZW91dENhbmNlbGVkICYmIChEYXRlLm5vdygpIC0gdGltZW91dFN0YXJ0KSA8IHRpbWVvdXQpIHtcbiAgICAgICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGltZW91dENhbmNlbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeGVjdXRlIGRyaXZlciBzY3JpcHQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW4gYWRqdXN0IHRoaXMgd2l0aCB0aGUgJ3RpbWVvdXQnIHBhcmFtZXRlci5gKTtcbiAgICB9O1xuXG4gICAgLy8gbm93IHRoYXQgdGhlIGNoaWxkIHNjcmlwdCBpcyBhbGl2ZSwgc2VuZCBpdCB0aGUgZGF0YSBpdCBuZWVkcyB0byBzdGFydFxuICAgIC8vIHJ1bm5pbmcgdGhlIGRyaXZlciBzY3JpcHRcbiAgICBsb2cuaW5mbygnU2VuZGluZyBkcml2ZXIgYW5kIHNjcmlwdCBkYXRhIHRvIGNoaWxkJyk7XG4gICAgc2NyaXB0UHJvYy5zZW5kKHtkcml2ZXJPcHRzLCBzY3JpcHQsIHRpbWVvdXR9KTtcblxuICAgIC8vIGFuZCBzZXQgdXAgYSByYWNlIGJldHdlZW4gdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNoaWxkIGFuZCB0aGUgdGltZW91dFxuICAgIHJldHVybiBhd2FpdCBCLnJhY2UoW3dhaXRGb3JSZXN1bHQoKSwgd2FpdEZvclRpbWVvdXQoKV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleGVjdXRlIGRyaXZlciBzY3JpcHQuIE9yaWdpbmFsIGVycm9yIHdhczogJHtlcnJ9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gZW5zdXJlIHdlIGFsd2F5cyBjYW5jZWwgdGhlIHRpbWVvdXQgc28gdGhhdCB0aGUgdGltZW91dCBwcm9taXNlIHN0b3BzXG4gICAgLy8gc3Bpbm5pbmcgYW5kIGFsbG93cyB0aGlzIHByb2Nlc3MgdG8gZGllIGdyYWNlZnVsbHlcbiAgICB0aW1lb3V0Q2FuY2VsZWQgPSB0cnVlO1xuXG4gICAgbG9nLmluZm8oJ0Rpc2Nvbm5lY3RpbmcgZnJvbSBhbmQga2lsbGluZyBkcml2ZXIgc2NyaXB0IGNoaWxkIHByb2MnKTtcbiAgICBzY3JpcHRQcm9jLmRpc2Nvbm5lY3QoKTtcbiAgICBzY3JpcHRQcm9jLmtpbGwoKTtcbiAgfVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2Jhc2Vkcml2ZXIvY29tbWFuZHMvZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLiJ9
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import _ from 'lodash';
|
|
2
|
-
import B from 'bluebird';
|
|
3
|
-
import vm from 'vm';
|
|
4
|
-
import log from '../logger';
|
|
5
|
-
import { attach } from 'webdriverio';
|
|
6
|
-
|
|
7
|
-
// duplicate defining these keys here so we don't need to re-load a huge appium
|
|
8
|
-
// dependency tree into memory just to run a wdio script
|
|
9
|
-
const W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735466cecf';
|
|
10
|
-
const MJSONWP_ELEMENT_KEY = 'ELEMENT';
|
|
11
|
-
|
|
12
|
-
async function runScript (driverOpts, script, timeout) {
|
|
13
|
-
if (!_.isNumber(timeout)) {
|
|
14
|
-
throw new Error('Timeout parameter must be a number');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// set up fake logger
|
|
18
|
-
const logLevels = ['error', 'warn', 'log'];
|
|
19
|
-
const logs = {};
|
|
20
|
-
const consoleFns = {};
|
|
21
|
-
for (const level of logLevels) {
|
|
22
|
-
logs[level] = [];
|
|
23
|
-
consoleFns[level] = (...logMsgs) => logs[level].push(...logMsgs);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const driver = attach(driverOpts);
|
|
27
|
-
|
|
28
|
-
const fullScript = buildScript(script);
|
|
29
|
-
// the timeout here will not matter really, but set it anyway to be on the
|
|
30
|
-
// safe side
|
|
31
|
-
const vmCtx = vm.runInNewContext(fullScript, {}, {timeout});
|
|
32
|
-
|
|
33
|
-
// run the driver script, giving user access to the driver object, a fake
|
|
34
|
-
// console logger, and a promise library
|
|
35
|
-
log.info('Running driver script in Node vm');
|
|
36
|
-
let result = await vmCtx(driver, consoleFns, B);
|
|
37
|
-
|
|
38
|
-
log.info('Ensuring driver script result is appropriate type for return');
|
|
39
|
-
result = coerceScriptResult(result);
|
|
40
|
-
return {result, logs};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Embed a user-generated script inside a method which takes only the
|
|
45
|
-
* predetermined objects we specify
|
|
46
|
-
*
|
|
47
|
-
* @param {string} script - the javascript to execute
|
|
48
|
-
*
|
|
49
|
-
* @return {string} - the full script to execute
|
|
50
|
-
*/
|
|
51
|
-
function buildScript (script) {
|
|
52
|
-
return `(async function execute (driver, console, Promise) {
|
|
53
|
-
${script}
|
|
54
|
-
})`;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* We can get any manner of crazy thing back from a vm executing untrusted
|
|
59
|
-
* code. We might also get WebdriverIO objects that aren't suitable for JSON
|
|
60
|
-
* response. So make sure we convert the things we know about to their
|
|
61
|
-
* appropriate response format, and squash other weird things.
|
|
62
|
-
*
|
|
63
|
-
* @param {Object} obj - object to convert and sanitize
|
|
64
|
-
*
|
|
65
|
-
* @return {Object} - safely converted object
|
|
66
|
-
*/
|
|
67
|
-
function coerceScriptResult (obj) {
|
|
68
|
-
// first ensure obj is of a type that can be JSON encoded safely. This will
|
|
69
|
-
// get rid of custom objects, functions, etc... and turn them into POJOs
|
|
70
|
-
try {
|
|
71
|
-
obj = JSON.parse(JSON.stringify(obj));
|
|
72
|
-
} catch (e) {
|
|
73
|
-
log.warn('Could not convert executeDriverScript to safe response!' +
|
|
74
|
-
`Result was: ${obj}. Will make it null`);
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
let res;
|
|
79
|
-
|
|
80
|
-
// now we begin our recursive case options
|
|
81
|
-
if (_.isPlainObject(obj)) {
|
|
82
|
-
// if we have an object, it's either an element object or something else
|
|
83
|
-
// webdriverio has no monadic object types other than element and driver,
|
|
84
|
-
// and we don't want to allow special casing return of driver
|
|
85
|
-
res = {};
|
|
86
|
-
|
|
87
|
-
if (obj[MJSONWP_ELEMENT_KEY] || obj[W3C_ELEMENT_KEY]) {
|
|
88
|
-
// if it's an element object, clear out anything that's not the key, and
|
|
89
|
-
// then return the object
|
|
90
|
-
if (obj[MJSONWP_ELEMENT_KEY]) {
|
|
91
|
-
res[MJSONWP_ELEMENT_KEY] = obj[MJSONWP_ELEMENT_KEY];
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (obj[W3C_ELEMENT_KEY]) {
|
|
95
|
-
res[W3C_ELEMENT_KEY] = obj[W3C_ELEMENT_KEY];
|
|
96
|
-
}
|
|
97
|
-
return res;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// otherwise, recurse into the object
|
|
101
|
-
for (const key of Object.keys(obj)) {
|
|
102
|
-
res[key] = coerceScriptResult(obj[key]);
|
|
103
|
-
}
|
|
104
|
-
return res;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// in the cae of an array, just recurse into the items
|
|
108
|
-
if (_.isArray(obj)) {
|
|
109
|
-
return obj.map(coerceScriptResult);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// base case, if it's not an object or array, return straightaway
|
|
113
|
-
return obj;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
async function main (driverOpts, script, timeout) {
|
|
117
|
-
let res;
|
|
118
|
-
try {
|
|
119
|
-
res = {success: await runScript(driverOpts, script, timeout)};
|
|
120
|
-
} catch (error) {
|
|
121
|
-
res = {error: {message: error.message, stack: error.stack}};
|
|
122
|
-
}
|
|
123
|
-
await B.promisify(process.send, {context: process})(res);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (require.main === module) {
|
|
127
|
-
log.info('Running driver execution in child process');
|
|
128
|
-
process.on('message', ({driverOpts, script, timeout}) => {
|
|
129
|
-
log.info('Parameters received from parent process');
|
|
130
|
-
main(driverOpts, script, timeout);
|
|
131
|
-
});
|
|
132
|
-
}
|