appium-geckodriver 0.3.0 → 1.0.0
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/.eslintrc +1 -1
- package/README.md +13 -10
- package/build/index.js +9 -6
- package/build/lib/commands/find.js +3 -3
- package/build/lib/desired-caps.js +4 -1
- package/build/lib/driver.js +3 -3
- package/build/lib/gecko.js +39 -18
- package/build/lib/logger.js +3 -3
- package/build/lib/server.js +4 -4
- package/build/lib/utils.js +5 -1
- package/build/test/functional/desktop-driver-e2e-specs.js +11 -8
- package/build/test/functional/mobile-driver-e2e-specs.js +14 -10
- package/build/test/unit/utils-specs.js +2 -2
- package/build/test/utils.js +1 -1
- package/gulpfile.js +2 -1
- package/index.js +6 -3
- package/lib/commands/find.js +1 -1
- package/lib/desired-caps.js +3 -0
- package/lib/driver.js +1 -1
- package/lib/gecko.js +26 -9
- package/lib/logger.js +1 -1
- package/lib/server.js +3 -1
- package/lib/utils.js +4 -0
- package/package.json +16 -11
- package/test/functional/desktop-driver-e2e-specs.js +10 -7
- package/test/functional/mobile-driver-e2e-specs.js +13 -8
- package/test/unit/utils-specs.js +1 -1
package/.eslintrc
CHANGED
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
Appium Geckodriver
|
|
2
2
|
====
|
|
3
3
|
|
|
4
4
|
This is Appium driver for automating Firefox on different platforms, including Android.
|
|
@@ -14,22 +14,25 @@ Then you need to decide where the automated test is going to be executed. Gecko
|
|
|
14
14
|
- macOS
|
|
15
15
|
- Windows
|
|
16
16
|
- Linux
|
|
17
|
-
- Android
|
|
17
|
+
- Android (note that `android` *cannot* be passed as a value to `platformName` capability; it should always equal to the *host* platform name)
|
|
18
18
|
|
|
19
19
|
In order to run your automated tests on Android it is necessary to have [Android SDK](https://developer.android.com/studio) installed, so the destination device is marked as `online` in the `adb devices -l` command output.
|
|
20
20
|
|
|
21
|
+
Since the version 1.0.0 this driver is only compatible with Appium 2. Use the `appium driver install gecko` CLI command to add it to your server dist.
|
|
22
|
+
|
|
21
23
|
Gecko driver allows to define multiple criterions for platform selection and also to fine-tune your automation session properties. This could be done via the following session capabilities:
|
|
22
24
|
|
|
23
25
|
Capability Name | Description
|
|
24
26
|
--- | ---
|
|
25
|
-
platformName | Gecko Driver supports the following platforms: `mac`, `linux`, `windows
|
|
27
|
+
platformName | Gecko Driver supports the following platforms: `mac`, `linux`, `windows`. The fact your test must be executed on Android is detected based on `moz:firefoxOptions` entry values. Values of platformName are compared case-insensitively.
|
|
26
28
|
browserName | Any value passed to this capability will be changed to 'firefox'.
|
|
27
29
|
browserVersion | Provide the version number of the browser to automate if there are multiple versions installed on the same machine where the driver is running.
|
|
28
|
-
automationName | Must always be set to `Gecko`.
|
|
29
|
-
noReset | Being set to `true` adds the `--connect-existing` argument to the server, that allows to connect to an existing browser instance instead of starting a new browser instance on session startup.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
appium:automationName | Must always be set to `Gecko`.
|
|
31
|
+
appium:noReset | Being set to `true` adds the `--connect-existing` argument to the server, that allows to connect to an existing browser instance instead of starting a new browser instance on session startup.
|
|
32
|
+
appium:marionettePort | Selects the port for Geckodriver’s connection to the Marionette remote protocol. The existing Firefox instance must have Marionette enabled. To enable the remote protocol in Firefox, you can pass the `-marionette` flag. Unless the `marionette.port` preference has been user-set, Marionette will listen on port `2828`, which is the default value for this capability.
|
|
33
|
+
appium:systemPort | The number of the port for the driver to listen on. Must be unique for each session. If not provided then Appium will try to detect it automatically.
|
|
34
|
+
appium:verbosity | The verbosity level of driver logging. By default minimum verbosity is applied. Possible values are `debug` or `trace`.
|
|
35
|
+
appium:androidStorage | See https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-android-storage-var-android-storage-var-code
|
|
33
36
|
moz:firefoxOptions | See https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
|
|
34
37
|
acceptInsecureCerts | See https://www.w3.org/TR/webdriver/#capabilities
|
|
35
38
|
pageLoadStrategy | See https://www.w3.org/TR/webdriver/#capabilities
|
|
@@ -57,10 +60,11 @@ def generate_caps():
|
|
|
57
60
|
'browserName': 'MozillaFirefox',
|
|
58
61
|
# automationName capability presence is mandatory for this Gecko Driver to be selected
|
|
59
62
|
'automationName': 'Gecko',
|
|
63
|
+
# Should have the name of the host platform, where the geckodriver binary is deployed
|
|
64
|
+
'platformName': 'mac',
|
|
60
65
|
}
|
|
61
66
|
android_caps = {
|
|
62
67
|
**common_caps,
|
|
63
|
-
'platformName': 'Android',
|
|
64
68
|
'moz:firefoxOptions': {
|
|
65
69
|
'androidDeviceSerial': '<device/emulator serial>',
|
|
66
70
|
# These capabilities depend on what you are going to automate
|
|
@@ -70,7 +74,6 @@ def generate_caps():
|
|
|
70
74
|
}
|
|
71
75
|
desktop_browser_caps = {
|
|
72
76
|
**common_caps,
|
|
73
|
-
'platformName': 'Mac',
|
|
74
77
|
}
|
|
75
78
|
return [android_caps, desktop_browser_caps]
|
|
76
79
|
|
package/build/index.js
CHANGED
|
@@ -11,13 +11,13 @@ Object.defineProperty(exports, "GeckoDriver", {
|
|
|
11
11
|
return _driver.default;
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
+
exports.default = void 0;
|
|
14
15
|
Object.defineProperty(exports, "startServer", {
|
|
15
16
|
enumerable: true,
|
|
16
17
|
get: function () {
|
|
17
18
|
return _server.startServer;
|
|
18
19
|
}
|
|
19
20
|
});
|
|
20
|
-
exports.default = void 0;
|
|
21
21
|
|
|
22
22
|
require("source-map-support/register");
|
|
23
23
|
|
|
@@ -25,16 +25,19 @@ var _driver = _interopRequireDefault(require("./lib/driver"));
|
|
|
25
25
|
|
|
26
26
|
var _server = require("./lib/server");
|
|
27
27
|
|
|
28
|
-
var _yargs = _interopRequireDefault(require("yargs"));
|
|
29
|
-
|
|
30
28
|
var _asyncbox = require("asyncbox");
|
|
31
29
|
|
|
32
30
|
const DEFAULT_HOST = 'localhost';
|
|
33
31
|
const DEFAULT_PORT = 4797;
|
|
34
32
|
|
|
35
33
|
async function main() {
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
const getArgValue = argName => {
|
|
35
|
+
const argIndex = process.argv.indexOf(argName);
|
|
36
|
+
return argIndex > 0 ? process.argv[argIndex + 1] : null;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
|
|
40
|
+
const host = getArgValue('--host') || DEFAULT_HOST;
|
|
38
41
|
return await (0, _server.startServer)(port, host);
|
|
39
42
|
}
|
|
40
43
|
|
|
@@ -46,4 +49,4 @@ var _default = _driver.default;
|
|
|
46
49
|
exports.default = _default;require('source-map-support').install();
|
|
47
50
|
|
|
48
51
|
|
|
49
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIm1haW4iLCJnZXRBcmdWYWx1ZSIsImFyZ05hbWUiLCJhcmdJbmRleCIsInByb2Nlc3MiLCJhcmd2IiwiaW5kZXhPZiIsInBvcnQiLCJwYXJzZUludCIsImhvc3QiLCJyZXF1aXJlIiwibW9kdWxlIiwiR2Vja29Ecml2ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCOztBQUVBLGVBQWVDLElBQWYsR0FBdUI7QUFDckIsUUFBTUMsV0FBVyxHQUFJQyxPQUFELElBQWE7QUFDL0IsVUFBTUMsUUFBUSxHQUFHQyxPQUFPLENBQUNDLElBQVIsQ0FBYUMsT0FBYixDQUFxQkosT0FBckIsQ0FBakI7QUFDQSxXQUFPQyxRQUFRLEdBQUcsQ0FBWCxHQUFlQyxPQUFPLENBQUNDLElBQVIsQ0FBYUYsUUFBUSxHQUFHLENBQXhCLENBQWYsR0FBNEMsSUFBbkQ7QUFDRCxHQUhEOztBQUlBLFFBQU1JLElBQUksR0FBR0MsUUFBUSxDQUFDUCxXQUFXLENBQUMsUUFBRCxDQUFaLEVBQXdCLEVBQXhCLENBQVIsSUFBdUNGLFlBQXBEO0FBQ0EsUUFBTVUsSUFBSSxHQUFHUixXQUFXLENBQUMsUUFBRCxDQUFYLElBQXlCSCxZQUF0QztBQUNBLFNBQU8sTUFBTSx5QkFBWVMsSUFBWixFQUFrQkUsSUFBbEIsQ0FBYjtBQUNEOztBQUVELElBQUlDLE9BQU8sQ0FBQ1YsSUFBUixLQUFpQlcsTUFBckIsRUFBNkI7QUFDM0IsMEJBQVNYLElBQVQ7QUFDRDs7ZUFFY1ksZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHZWNrb0RyaXZlciBmcm9tICcuL2xpYi9kcml2ZXInO1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2xpYi9zZXJ2ZXInO1xuaW1wb3J0IHsgYXN5bmNpZnkgfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IERFRkFVTFRfSE9TVCA9ICdsb2NhbGhvc3QnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gNDc5NztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbiAoKSB7XG4gIGNvbnN0IGdldEFyZ1ZhbHVlID0gKGFyZ05hbWUpID0+IHtcbiAgICBjb25zdCBhcmdJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKGFyZ05hbWUpO1xuICAgIHJldHVybiBhcmdJbmRleCA+IDAgPyBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXSA6IG51bGw7XG4gIH07XG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludChnZXRBcmdWYWx1ZSgnLS1wb3J0JyksIDEwKSB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IGhvc3QgPSBnZXRBcmdWYWx1ZSgnLS1ob3N0JykgfHwgREVGQVVMVF9IT1NUO1xuICByZXR1cm4gYXdhaXQgc3RhcnRTZXJ2ZXIocG9ydCwgaG9zdCk7XG59XG5cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICBhc3luY2lmeShtYWluKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgR2Vja29Ecml2ZXI7XG5leHBvcnQgeyBHZWNrb0RyaXZlciwgc3RhcnRTZXJ2ZXIgfTtcbiJdLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4ifQ==
|
|
@@ -7,13 +7,13 @@ exports.default = exports.commands = void 0;
|
|
|
7
7
|
|
|
8
8
|
require("source-map-support/register");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
11
|
|
|
12
12
|
const commands = {};
|
|
13
13
|
exports.commands = commands;
|
|
14
14
|
|
|
15
15
|
commands.findElOrEls = async function findElOrEls(strategy, selector, mult, context) {
|
|
16
|
-
context =
|
|
16
|
+
context = _support.util.unwrapElement(context);
|
|
17
17
|
const endpoint = `/element${context ? `/${context}/element` : ''}${mult ? 's' : ''}`;
|
|
18
18
|
return await this.gecko.proxy.command(endpoint, 'POST', {
|
|
19
19
|
using: strategy,
|
|
@@ -25,4 +25,4 @@ var _default = commands;
|
|
|
25
25
|
exports.default = _default;require('source-map-support').install();
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9maW5kLmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZmluZEVsT3JFbHMiLCJzdHJhdGVneSIsInNlbGVjdG9yIiwibXVsdCIsImNvbnRleHQiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsImVuZHBvaW50IiwiZ2Vja28iLCJwcm94eSIsImNvbW1hbmQiLCJ1c2luZyIsInZhbHVlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7OztBQUdBQSxRQUFRLENBQUNDLFdBQVQsR0FBdUIsZUFBZUEsV0FBZixDQUE0QkMsUUFBNUIsRUFBc0NDLFFBQXRDLEVBQWdEQyxJQUFoRCxFQUFzREMsT0FBdEQsRUFBK0Q7QUFDcEZBLEVBQUFBLE9BQU8sR0FBR0MsY0FBS0MsYUFBTCxDQUFtQkYsT0FBbkIsQ0FBVjtBQUNBLFFBQU1HLFFBQVEsR0FBSSxXQUFVSCxPQUFPLEdBQUksSUFBR0EsT0FBUSxVQUFmLEdBQTJCLEVBQUcsR0FBRUQsSUFBSSxHQUFHLEdBQUgsR0FBUyxFQUFHLEVBQW5GO0FBRUEsU0FBTyxNQUFNLEtBQUtLLEtBQUwsQ0FBV0MsS0FBWCxDQUFpQkMsT0FBakIsQ0FBeUJILFFBQXpCLEVBQW1DLE1BQW5DLEVBQTJDO0FBQ3RESSxJQUFBQSxLQUFLLEVBQUVWLFFBRCtDO0FBRXREVyxJQUFBQSxLQUFLLEVBQUVWO0FBRitDLEdBQTNDLENBQWI7QUFJRCxDQVJEOztlQVllSCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLy8gVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBsb29rdXAgYnkgaW1hZ2Ugd29ya2luZ1xuY29tbWFuZHMuZmluZEVsT3JFbHMgPSBhc3luYyBmdW5jdGlvbiBmaW5kRWxPckVscyAoc3RyYXRlZ3ksIHNlbGVjdG9yLCBtdWx0LCBjb250ZXh0KSB7XG4gIGNvbnRleHQgPSB1dGlsLnVud3JhcEVsZW1lbnQoY29udGV4dCk7XG4gIGNvbnN0IGVuZHBvaW50ID0gYC9lbGVtZW50JHtjb250ZXh0ID8gYC8ke2NvbnRleHR9L2VsZW1lbnRgIDogJyd9JHttdWx0ID8gJ3MnIDogJyd9YDtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5nZWNrby5wcm94eS5jb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHtcbiAgICB1c2luZzogc3RyYXRlZ3ksXG4gICAgdmFsdWU6IHNlbGVjdG9yLFxuICB9KTtcbn07XG5cblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZmluZC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -37,6 +37,9 @@ const desiredCapConstraints = {
|
|
|
37
37
|
systemPort: {
|
|
38
38
|
isNumber: true
|
|
39
39
|
},
|
|
40
|
+
marionettePort: {
|
|
41
|
+
isNumber: true
|
|
42
|
+
},
|
|
40
43
|
verbosity: {
|
|
41
44
|
isString: true,
|
|
42
45
|
inclusionCaseInsensitive: Object.values(_constants.VERBOSITY)
|
|
@@ -52,4 +55,4 @@ const desiredCapConstraints = {
|
|
|
52
55
|
exports.desiredCapConstraints = desiredCapConstraints;require('source-map-support').install();
|
|
53
56
|
|
|
54
57
|
|
|
55
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXNpcmVkLWNhcHMuanMiXSwibmFtZXMiOlsiZGVzaXJlZENhcENvbnN0cmFpbnRzIiwiYnJvd3Nlck5hbWUiLCJpc1N0cmluZyIsImJyb3dzZXJWZXJzaW9uIiwiYWNjZXB0SW5zZWN1cmVDZXJ0cyIsImlzQm9vbGVhbiIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJwcm94eSIsImlzT2JqZWN0Iiwic2V0V2luZG93UmVjdCIsInRpbWVvdXRzIiwidW5oYW5kbGVkUHJvbXB0QmVoYXZpb3IiLCJzeXN0ZW1Qb3J0IiwiaXNOdW1iZXIiLCJtYXJpb25ldHRlUG9ydCIsInZlcmJvc2l0eSIsImluY2x1c2lvbkNhc2VJbnNlbnNpdGl2ZSIsIk9iamVjdCIsInZhbHVlcyIsIlZFUkJPU0lUWSIsImFuZHJvaWRTdG9yYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRztBQUM1QkMsRUFBQUEsV0FBVyxFQUFFO0FBQ1hDLElBQUFBLFFBQVEsRUFBRTtBQURDLEdBRGU7QUFJNUJDLEVBQUFBLGNBQWMsRUFBRTtBQUNkRCxJQUFBQSxRQUFRLEVBQUU7QUFESSxHQUpZO0FBTzVCRSxFQUFBQSxtQkFBbUIsRUFBRTtBQUNuQkMsSUFBQUEsU0FBUyxFQUFFO0FBRFEsR0FQTztBQVU1QkMsRUFBQUEsZ0JBQWdCLEVBQUU7QUFDaEJKLElBQUFBLFFBQVEsRUFBRTtBQURNLEdBVlU7QUFhNUJLLEVBQUFBLEtBQUssRUFBRTtBQUNMQyxJQUFBQSxRQUFRLEVBQUU7QUFETCxHQWJxQjtBQWdCNUJDLEVBQUFBLGFBQWEsRUFBRTtBQUNiSixJQUFBQSxTQUFTLEVBQUU7QUFERSxHQWhCYTtBQW1CNUJLLEVBQUFBLFFBQVEsRUFBRTtBQUNSRixJQUFBQSxRQUFRLEVBQUU7QUFERixHQW5Ca0I7QUFzQjVCRyxFQUFBQSx1QkFBdUIsRUFBRTtBQUN2QlQsSUFBQUEsUUFBUSxFQUFFO0FBRGEsR0F0Qkc7QUF5QjVCVSxFQUFBQSxVQUFVLEVBQUU7QUFDVkMsSUFBQUEsUUFBUSxFQUFFO0FBREEsR0F6QmdCO0FBNEI1QkMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RELElBQUFBLFFBQVEsRUFBRTtBQURJLEdBNUJZO0FBK0I1QkUsRUFBQUEsU0FBUyxFQUFFO0FBQ1RiLElBQUFBLFFBQVEsRUFBRSxJQUREO0FBRVRjLElBQUFBLHdCQUF3QixFQUFFQyxNQUFNLENBQUNDLE1BQVAsQ0FBY0Msb0JBQWQ7QUFGakIsR0EvQmlCO0FBbUM1QkMsRUFBQUEsY0FBYyxFQUFFO0FBQ2RsQixJQUFBQSxRQUFRLEVBQUUsSUFESTtBQUVkYyxJQUFBQSx3QkFBd0IsRUFBRSxDQUFDLE1BQUQsRUFBUyxLQUFULEVBQWdCLFVBQWhCLEVBQTRCLFFBQTVCO0FBRlosR0FuQ1k7QUF1QzVCLHdCQUFzQjtBQUNwQlIsSUFBQUEsUUFBUSxFQUFFO0FBRFU7QUF2Q00sQ0FBOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWRVJCT1NJVFkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlc2lyZWRDYXBDb25zdHJhaW50cyA9IHtcbiAgYnJvd3Nlck5hbWU6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBicm93c2VyVmVyc2lvbjoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFjY2VwdEluc2VjdXJlQ2VydHM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgcGFnZUxvYWRTdHJhdGVneToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHByb3h5OiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgc2V0V2luZG93UmVjdDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICB0aW1lb3V0czoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG4gIHVuaGFuZGxlZFByb21wdEJlaGF2aW9yOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgc3lzdGVtUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIG1hcmlvbmV0dGVQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgdmVyYm9zaXR5OiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gICAgaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlOiBPYmplY3QudmFsdWVzKFZFUkJPU0lUWSlcbiAgfSxcbiAgYW5kcm9pZFN0b3JhZ2U6IHtcbiAgICBpc1N0cmluZzogdHJ1ZSxcbiAgICBpbmNsdXNpb25DYXNlSW5zZW5zaXRpdmU6IFsnYXV0bycsICdhcHAnLCAnaW50ZXJuYWwnLCAnc2RjYXJkJ11cbiAgfSxcbiAgJ21vejpmaXJlZm94T3B0aW9ucyc6IHtcbiAgICBpc09iamVjdDogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgeyBkZXNpcmVkQ2FwQ29uc3RyYWludHMgfTtcbiJdLCJmaWxlIjoibGliL2Rlc2lyZWQtY2Fwcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
package/build/lib/driver.js
CHANGED
|
@@ -11,7 +11,7 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _baseDriver = require("@appium/base-driver");
|
|
15
15
|
|
|
16
16
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
17
17
|
|
|
@@ -25,7 +25,7 @@ var _utils = require("./utils");
|
|
|
25
25
|
|
|
26
26
|
const NO_PROXY = [['GET', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/appium')], ['POST', new RegExp('^/session/[^/]+/element/[^/]+/elements?$')], ['POST', new RegExp('^/session/[^/]+/elements?$')]];
|
|
27
27
|
|
|
28
|
-
class GeckoDriver extends
|
|
28
|
+
class GeckoDriver extends _baseDriver.BaseDriver {
|
|
29
29
|
constructor(opts = {}) {
|
|
30
30
|
super(opts);
|
|
31
31
|
this.desiredCapConstraints = _desiredCaps.desiredCapConstraints;
|
|
@@ -85,4 +85,4 @@ var _default = GeckoDriver;
|
|
|
85
85
|
exports.default = _default;require('source-map-support').install();
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kcml2ZXIuanMiXSwibmFtZXMiOlsiTk9fUFJPWFkiLCJSZWdFeHAiLCJHZWNrb0RyaXZlciIsIkJhc2VEcml2ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJsb2NhdG9yU3RyYXRlZ2llcyIsInJlc2V0U3RhdGUiLCJjbWQiLCJmbiIsIl8iLCJ0b1BhaXJzIiwiY29tbWFuZHMiLCJwcm90b3R5cGUiLCJnZWNrbyIsInByb3h5UmVxUmVzIiwiaXNQcm94eUFjdGl2ZSIsInByb3h5QWN0aXZlIiwiZ2V0UHJveHlBdm9pZExpc3QiLCJjYW5Qcm94eSIsImNyZWF0ZVNlc3Npb24iLCJhcmdzIiwic2Vzc2lvbklkIiwiY2FwcyIsIkdlY2tvRHJpdmVyU2VydmVyIiwic3RhcnQiLCJlIiwiZGVsZXRlU2Vzc2lvbiIsInByb3h5IiwiYmluZCIsImxvZyIsImluZm8iLCJzdG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFFBQVEsR0FBRyxDQUNmLENBQUMsS0FBRCxFQUFRLElBQUlDLE1BQUosQ0FBVyx3QkFBWCxDQUFSLENBRGUsRUFFZixDQUFDLE1BQUQsRUFBUyxJQUFJQSxNQUFKLENBQVcsd0JBQVgsQ0FBVCxDQUZlLEVBR2YsQ0FBQyxNQUFELEVBQVMsSUFBSUEsTUFBSixDQUFXLDBDQUFYLENBQVQsQ0FIZSxFQUlmLENBQUMsTUFBRCxFQUFTLElBQUlBLE1BQUosQ0FBVyw0QkFBWCxDQUFULENBSmUsQ0FBakI7O0FBT0EsTUFBTUMsV0FBTixTQUEwQkMsc0JBQTFCLENBQXFDO0FBQ25DQyxFQUFBQSxXQUFXLENBQUVDLElBQUksR0FBRyxFQUFULEVBQWE7QUFDdEIsVUFBTUEsSUFBTjtBQUNBLFNBQUtDLHFCQUFMLEdBQTZCQSxrQ0FBN0I7QUFDQSxTQUFLQyxpQkFBTCxHQUF5QixDQUN2QixPQUR1QixFQUV2QixVQUZ1QixFQUd2QixXQUh1QixFQUl2QixtQkFKdUIsRUFLdkIsY0FMdUIsRUFPdkIsSUFQdUIsRUFRdkIsTUFSdUIsQ0FBekI7QUFVQSxTQUFLQyxVQUFMOztBQUVBLFNBQUssTUFBTSxDQUFDQyxHQUFELEVBQU1DLEVBQU4sQ0FBWCxJQUF3QkMsZ0JBQUVDLE9BQUYsQ0FBVUMsY0FBVixDQUF4QixFQUE2QztBQUMzQ1gsTUFBQUEsV0FBVyxDQUFDWSxTQUFaLENBQXNCTCxHQUF0QixJQUE2QkMsRUFBN0I7QUFDRDtBQUNGOztBQUVERixFQUFBQSxVQUFVLEdBQUk7QUFDWixTQUFLTyxLQUFMLEdBQWEsSUFBYjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0Q7O0FBRURDLEVBQUFBLFdBQVcsR0FBSTtBQUNiLFdBQU8sS0FBS0QsYUFBWjtBQUNEOztBQUVERSxFQUFBQSxpQkFBaUIsR0FBSTtBQUNuQixXQUFPbkIsUUFBUDtBQUNEOztBQUVEb0IsRUFBQUEsUUFBUSxHQUFJO0FBQ1YsV0FBTyxJQUFQO0FBQ0Q7O0FBRWtCLFFBQWJDLGFBQWEsQ0FBRSxHQUFHQyxJQUFMLEVBQVc7QUFDNUIsVUFBTSxDQUFDQyxTQUFELEVBQVlDLElBQVosSUFBb0IsTUFBTSxNQUFNSCxhQUFOLENBQW9CLEdBQUdDLElBQXZCLENBQWhDO0FBQ0EsU0FBS1AsS0FBTCxHQUFhLElBQUlVLGNBQUosQ0FBc0JELElBQXRCLENBQWI7O0FBQ0EsUUFBSTtBQUNGLFlBQU0sS0FBS1QsS0FBTCxDQUFXVyxLQUFYLENBQWlCLGdDQUFvQkYsSUFBcEIsQ0FBakIsQ0FBTjtBQUNELEtBRkQsQ0FFRSxPQUFPRyxDQUFQLEVBQVU7QUFDVixZQUFNLEtBQUtDLGFBQUwsRUFBTjtBQUNBLFlBQU1ELENBQU47QUFDRDs7QUFDRCxTQUFLWCxXQUFMLEdBQW1CLEtBQUtELEtBQUwsQ0FBV2MsS0FBWCxDQUFpQmIsV0FBakIsQ0FBNkJjLElBQTdCLENBQWtDLEtBQUtmLEtBQUwsQ0FBV2MsS0FBN0MsQ0FBbkI7QUFDQSxTQUFLWixhQUFMLEdBQXFCLElBQXJCO0FBQ0EsV0FBTyxDQUFDTSxTQUFELEVBQVlDLElBQVosQ0FBUDtBQUNEOztBQUVrQixRQUFiSSxhQUFhLEdBQUk7QUFDckJHLG9CQUFJQyxJQUFKLENBQVMsNkJBQVQ7O0FBQ0EsVUFBTSxLQUFLakIsS0FBTCxDQUFXa0IsSUFBWCxFQUFOO0FBQ0EsU0FBS3pCLFVBQUw7QUFFQSxVQUFNLE1BQU1vQixhQUFOLEVBQU47QUFDRDs7QUEzRGtDOztlQThEdEIxQixXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJhc2VEcml2ZXIgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IEdlY2tvRHJpdmVyU2VydmVyIGZyb20gJy4vZ2Vja28nO1xuaW1wb3J0IHsgZGVzaXJlZENhcENvbnN0cmFpbnRzIH0gZnJvbSAnLi9kZXNpcmVkLWNhcHMnO1xuaW1wb3J0IGNvbW1hbmRzIGZyb20gJy4vY29tbWFuZHMvaW5kZXgnO1xuaW1wb3J0IHsgZm9ybWF0Q2Fwc0ZvclNlcnZlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBOT19QUk9YWSA9IFtcbiAgWydHRVQnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvYXBwaXVtJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudC9bXi9dKy9lbGVtZW50cz8kJyldLFxuICBbJ1BPU1QnLCBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vW14vXSsvZWxlbWVudHM/JCcpXSxcbl07XG5cbmNsYXNzIEdlY2tvRHJpdmVyIGV4dGVuZHMgQmFzZURyaXZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBzdXBlcihvcHRzKTtcbiAgICB0aGlzLmRlc2lyZWRDYXBDb25zdHJhaW50cyA9IGRlc2lyZWRDYXBDb25zdHJhaW50cztcbiAgICB0aGlzLmxvY2F0b3JTdHJhdGVnaWVzID0gW1xuICAgICAgJ3hwYXRoJyxcbiAgICAgICd0YWcgbmFtZScsXG4gICAgICAnbGluayB0ZXh0JyxcbiAgICAgICdwYXJ0aWFsIGxpbmsgdGV4dCcsXG4gICAgICAnY3NzIHNlbGVjdG9yJyxcbiAgICAgIC8vIExldCB0aGVzZSB0d28gcmVhY2ggR2Vja28gRHJpdmVyIGFuZCBmYWlsIHRoZXJlIHdpdGggYSBwcm9wZXIgZXJyb3IgbWVzc2FnZVxuICAgICAgJ2lkJyxcbiAgICAgICduYW1lJyxcbiAgICBdO1xuICAgIHRoaXMucmVzZXRTdGF0ZSgpO1xuXG4gICAgZm9yIChjb25zdCBbY21kLCBmbl0gb2YgXy50b1BhaXJzKGNvbW1hbmRzKSkge1xuICAgICAgR2Vja29Ecml2ZXIucHJvdG90eXBlW2NtZF0gPSBmbjtcbiAgICB9XG4gIH1cblxuICByZXNldFN0YXRlICgpIHtcbiAgICB0aGlzLmdlY2tvID0gbnVsbDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gbnVsbDtcbiAgICB0aGlzLmlzUHJveHlBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIHByb3h5QWN0aXZlICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3h5QWN0aXZlO1xuICB9XG5cbiAgZ2V0UHJveHlBdm9pZExpc3QgKCkge1xuICAgIHJldHVybiBOT19QUk9YWTtcbiAgfVxuXG4gIGNhblByb3h5ICgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlc3Npb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBbc2Vzc2lvbklkLCBjYXBzXSA9IGF3YWl0IHN1cGVyLmNyZWF0ZVNlc3Npb24oLi4uYXJncyk7XG4gICAgdGhpcy5nZWNrbyA9IG5ldyBHZWNrb0RyaXZlclNlcnZlcihjYXBzKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5nZWNrby5zdGFydChmb3JtYXRDYXBzRm9yU2VydmVyKGNhcHMpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmdlY2tvLnByb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5nZWNrby5wcm94eSk7XG4gICAgdGhpcy5pc1Byb3h5QWN0aXZlID0gdHJ1ZTtcbiAgICByZXR1cm4gW3Nlc3Npb25JZCwgY2Fwc107XG4gIH1cblxuICBhc3luYyBkZWxldGVTZXNzaW9uICgpIHtcbiAgICBsb2cuaW5mbygnRW5kaW5nIEdlY2tvIERyaXZlciBzZXNzaW9uJyk7XG4gICAgYXdhaXQgdGhpcy5nZWNrby5zdG9wKCk7XG4gICAgdGhpcy5yZXNldFN0YXRlKCk7XG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGVTZXNzaW9uKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR2Vja29Ecml2ZXI7XG4iXSwiZmlsZSI6ImxpYi9kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/gecko.js
CHANGED
|
@@ -15,9 +15,9 @@ var _os = _interopRequireDefault(require("os"));
|
|
|
15
15
|
|
|
16
16
|
var _path = _interopRequireDefault(require("path"));
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _baseDriver = require("@appium/base-driver");
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _support = require("@appium/support");
|
|
21
21
|
|
|
22
22
|
var _teen_process = require("teen_process");
|
|
23
23
|
|
|
@@ -29,21 +29,30 @@ var _child_process = require("child_process");
|
|
|
29
29
|
|
|
30
30
|
var _constants = require("./constants");
|
|
31
31
|
|
|
32
|
-
const log =
|
|
32
|
+
const log = _support.logger.getLogger('GeckoDriverServer');
|
|
33
33
|
|
|
34
|
-
const GD_BINARY = `geckodriver${
|
|
34
|
+
const GD_BINARY = `geckodriver${_support.system.isWindows() ? '.exe' : ''}`;
|
|
35
35
|
const STARTUP_TIMEOUT_MS = 10000;
|
|
36
36
|
const GECKO_PORT_RANGE = [5200, 5300];
|
|
37
37
|
|
|
38
|
-
const GECKO_SERVER_GUARD =
|
|
38
|
+
const GECKO_SERVER_GUARD = _support.util.getLockFileGuard(_path.default.resolve(_os.default.tmpdir(), 'gecko_server_guard.lock'), {
|
|
39
39
|
timeout: 5,
|
|
40
40
|
tryRecovery: true
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
const DEFAULT_MARIONETTE_PORT = 2828;
|
|
44
|
+
const PROCESS_SPECIFIC_OPTION_NAMES_MAP = Object.freeze({
|
|
45
|
+
noReset: 'noReset',
|
|
46
|
+
verbosity: 'verbosity',
|
|
47
|
+
androidStorage: 'androidStorage',
|
|
48
|
+
marionettePort: 'marionettePort',
|
|
49
|
+
systemPort: 'port'
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
class GeckoProxy extends _baseDriver.JWProxy {
|
|
44
53
|
async proxyCommand(url, method, body = null) {
|
|
45
54
|
if (this.didProcessExit) {
|
|
46
|
-
throw new
|
|
55
|
+
throw new _baseDriver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to Gecko Driver server because ` + 'its process is not running (probably crashed). Check the Appium log for more details');
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
return await super.proxyCommand(url, method, body);
|
|
@@ -53,18 +62,17 @@ class GeckoProxy extends _appiumBaseDriver.JWProxy {
|
|
|
53
62
|
|
|
54
63
|
class GeckoDriverProcess {
|
|
55
64
|
constructor(opts = {}) {
|
|
56
|
-
for (const optName of
|
|
57
|
-
this[
|
|
65
|
+
for (const [optName, propName] of _lodash.default.toPairs(PROCESS_SPECIFIC_OPTION_NAMES_MAP)) {
|
|
66
|
+
this[propName] = opts[optName];
|
|
58
67
|
}
|
|
59
68
|
|
|
60
|
-
this.port = opts.systemPort;
|
|
61
69
|
this.proc = null;
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
get isRunning() {
|
|
65
73
|
var _this$proc;
|
|
66
74
|
|
|
67
|
-
return !!((_this$proc = this.proc)
|
|
75
|
+
return !!((_this$proc = this.proc) !== null && _this$proc !== void 0 && _this$proc.isRunning);
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
async init() {
|
|
@@ -87,12 +95,12 @@ class GeckoDriverProcess {
|
|
|
87
95
|
let driverBin;
|
|
88
96
|
|
|
89
97
|
try {
|
|
90
|
-
driverBin = await
|
|
98
|
+
driverBin = await _support.fs.which(GD_BINARY);
|
|
91
99
|
} catch (e) {
|
|
92
100
|
throw new Error(`${GD_BINARY} binary cannot be found in PATH. ` + `Please make sure it is present on your system`);
|
|
93
101
|
}
|
|
94
102
|
|
|
95
|
-
const args = [
|
|
103
|
+
const args = [];
|
|
96
104
|
|
|
97
105
|
switch (_lodash.default.toLower(this.verbosity)) {
|
|
98
106
|
case _constants.VERBOSITY.DEBUG:
|
|
@@ -105,11 +113,24 @@ class GeckoDriverProcess {
|
|
|
105
113
|
}
|
|
106
114
|
|
|
107
115
|
if (this.noReset) {
|
|
116
|
+
var _this$marionettePort;
|
|
117
|
+
|
|
108
118
|
args.push('--connect-existing');
|
|
119
|
+
|
|
120
|
+
if (_lodash.default.isNil(this.marionettePort)) {
|
|
121
|
+
log.info(`'marionettePort' capability value is not provided while 'noReset' is enabled`);
|
|
122
|
+
log.info(`Assigning 'marionettePort' to the default value (${DEFAULT_MARIONETTE_PORT})`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
args.push('--marionette-port', (_this$marionettePort = this.marionettePort) !== null && _this$marionettePort !== void 0 ? _this$marionettePort : DEFAULT_MARIONETTE_PORT);
|
|
126
|
+
} else if (!_lodash.default.isNil(this.marionettePort)) {
|
|
127
|
+
args.push('--marionette-port', this.marionettePort);
|
|
109
128
|
}
|
|
110
129
|
|
|
130
|
+
args.push('-p', this.port);
|
|
131
|
+
|
|
111
132
|
if (this.androidStorage) {
|
|
112
|
-
args.push('
|
|
133
|
+
args.push('--android-storage', this.androidStorage);
|
|
113
134
|
}
|
|
114
135
|
|
|
115
136
|
this.proc = new _teen_process.SubProcess(driverBin, args);
|
|
@@ -146,7 +167,7 @@ class GeckoDriverProcess {
|
|
|
146
167
|
const RUNNING_PROCESS_IDS = [];
|
|
147
168
|
process.once('exit', () => {
|
|
148
169
|
for (const pid of RUNNING_PROCESS_IDS) {
|
|
149
|
-
const command =
|
|
170
|
+
const command = _support.system.isWindows() ? `taskkill.exe /PID ${pid}` : `kill ${pid}`;
|
|
150
171
|
|
|
151
172
|
try {
|
|
152
173
|
(0, _child_process.execSync)(command);
|
|
@@ -163,7 +184,7 @@ class GeckoDriverServer {
|
|
|
163
184
|
get isRunning() {
|
|
164
185
|
var _this$process;
|
|
165
186
|
|
|
166
|
-
return !!((_this$process = this.process)
|
|
187
|
+
return !!((_this$process = this.process) !== null && _this$process !== void 0 && _this$process.isRunning);
|
|
167
188
|
}
|
|
168
189
|
|
|
169
190
|
async start(geckoCaps) {
|
|
@@ -226,7 +247,7 @@ class GeckoDriverServer {
|
|
|
226
247
|
return;
|
|
227
248
|
}
|
|
228
249
|
|
|
229
|
-
if ((_this$proxy = this.proxy)
|
|
250
|
+
if ((_this$proxy = this.proxy) !== null && _this$proxy !== void 0 && _this$proxy.sessionId) {
|
|
230
251
|
try {
|
|
231
252
|
await this.proxy.command(`/session/${this.proxy.sessionId}`, 'DELETE');
|
|
232
253
|
} catch (e) {
|
|
@@ -248,4 +269,4 @@ var _default = GeckoDriverServer;
|
|
|
248
269
|
exports.default = _default;require('source-map-support').install();
|
|
249
270
|
|
|
250
271
|
|
|
251
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9nZWNrby5qcyJdLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJHRF9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJHRUNLT19QT1JUX1JBTkdFIiwiR0VDS09fU0VSVkVSX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiR2Vja29Qcm94eSIsIkpXUHJveHkiLCJwcm94eUNvbW1hbmQiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiZGlkUHJvY2Vzc0V4aXQiLCJlcnJvcnMiLCJJbnZhbGlkQ29udGV4dEVycm9yIiwiR2Vja29Ecml2ZXJQcm9jZXNzIiwiY29uc3RydWN0b3IiLCJvcHRzIiwib3B0TmFtZSIsInBvcnQiLCJzeXN0ZW1Qb3J0IiwicHJvYyIsImlzUnVubmluZyIsImluaXQiLCJzdGFydFBvcnQiLCJlbmRQb3J0IiwiZSIsIkVycm9yIiwiZHJpdmVyQmluIiwiZnMiLCJ3aGljaCIsImFyZ3MiLCJfIiwidG9Mb3dlciIsInZlcmJvc2l0eSIsIlZFUkJPU0lUWSIsIkRFQlVHIiwicHVzaCIsIlRSQUNFIiwibm9SZXNldCIsImFuZHJvaWRTdG9yYWdlIiwiU3ViUHJvY2VzcyIsIm9uIiwic3Rkb3V0Iiwic3RkZXJyIiwibGluZSIsInRyaW0iLCJkZWJ1ZyIsImNvZGUiLCJzaWduYWwiLCJpbmZvIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0Iiwic3RvcCIsImtpbGwiLCJpZ24iLCJSVU5OSU5HX1BST0NFU1NfSURTIiwicHJvY2VzcyIsIm9uY2UiLCJwaWQiLCJjb21tYW5kIiwiR2Vja29Ecml2ZXJTZXJ2ZXIiLCJjYXBzIiwicHJveHkiLCJnZWNrb0NhcHMiLCJzZXJ2ZXIiLCJiYXNlIiwia2VlcEFsaXZlIiwiZXJyIiwibWVzc2FnZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJ0ZXN0IiwicHVsbCIsImNhcGFiaWxpdGllcyIsImZpcnN0TWF0Y2giLCJhbHdheXNNYXRjaCIsInNlc3Npb25JZCIsIndhcm4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixtQkFBakIsQ0FBWjs7QUFFQSxNQUFNQyxTQUFTLEdBQUksY0FBYUMsc0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUFqRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLEtBQTNCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBR0Msb0JBQUtDLGdCQUFMLENBQ3pCQyxjQUFLQyxPQUFMLENBQWFDLFlBQUdDLE1BQUgsRUFBYixFQUEwQix5QkFBMUIsQ0FEeUIsRUFFekI7QUFBQ0MsRUFBQUEsT0FBTyxFQUFFLENBQVY7QUFBYUMsRUFBQUEsV0FBVyxFQUFFO0FBQTFCLENBRnlCLENBQTNCOztBQU1BLE1BQU1DLFVBQU4sU0FBeUJDLHlCQUF6QixDQUFpQztBQUMvQixRQUFNQyxZQUFOLENBQW9CQyxHQUFwQixFQUF5QkMsTUFBekIsRUFBaUNDLElBQUksR0FBRyxJQUF4QyxFQUE4QztBQUM1QyxRQUFJLEtBQUtDLGNBQVQsRUFBeUI7QUFDdkIsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0Esc0ZBRkksQ0FBTjtBQUdEOztBQUNELFdBQU8sTUFBTSxNQUFNRCxZQUFOLENBQW1CQyxHQUFuQixFQUF3QkMsTUFBeEIsRUFBZ0NDLElBQWhDLENBQWI7QUFDRDs7QUFSOEI7O0FBV2pDLE1BQU1JLGtCQUFOLENBQXlCO0FBQ3ZCQyxFQUFBQSxXQUFXLENBQUVDLElBQUksR0FBRyxF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QUFMLENBQWFKLElBQWIsRUFBTjtBQUNELEtBRkQsQ0FFRSxPQUFPNUIsQ0FBUCxFQUFVO0FBQ1ZyQyxNQUFBQSxHQUFHLENBQUMwRixJQUFKLENBQVUsMkNBQTBDckQsQ0FBQyxDQUFDNEMsT0FBUSwwQkFBOUQ7QUFDQSxZQUFNLEtBQUtaLE9BQUwsQ0FBYUgsSUFBYixFQUFOO0FBQ0Q7QUFDRjs7QUFsRnFCOztlQXFGVE8saUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCBsb2dnZXIsIHV0aWwsIHN5c3RlbSB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IFZFUkJPU0lUWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignR2Vja29Ecml2ZXJTZXJ2ZXInKTtcblxuY29uc3QgR0RfQklOQVJZID0gYGdlY2tvZHJpdmVyJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgU1RBUlRVUF9USU1FT1VUX01TID0gMTAwMDA7IC8vIDEwIHNlY29uZHNcbmNvbnN0IEdFQ0tPX1BPUlRfUkFOR0UgPSBbNTIwMCwgNTMwMF07XG5jb25zdCBHRUNLT19TRVJWRVJfR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2dlY2tvX3NlcnZlcl9ndWFyZC5sb2NrJyksXG4gIHt0aW1lb3V0OiA1LCB0cnlSZWNvdmVyeTogdHJ1ZX1cbik7XG5cblxuY2xhc3MgR2Vja29Qcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZFByb2Nlc3NFeGl0KSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRDb250ZXh0RXJyb3IoXG4gICAgICAgIGAnJHttZXRob2R9ICR7dXJsfScgY2Fubm90IGJlIHByb3hpZWQgdG8gR2Vja28gRHJpdmVyIHNlcnZlciBiZWNhdXNlIGAgK1xuICAgICAgICAnaXRzIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiBDaGVjayB0aGUgQXBwaXVtIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIEdlY2tvRHJpdmVyUHJvY2VzcyB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgWydub1Jlc2V0JywgJ3ZlcmJvc2l0eScsICdhbmRyb2lkU3RvcmFnZSddKSB7XG4gICAgICB0aGlzW29wdE5hbWVdID0gb3B0c1tvcHROYW1lXTtcbiAgICB9XG4gICAgdGhpcy5wb3J0ID0gb3B0cy5zeXN0ZW1Qb3J0O1xuICAgIHRoaXMucHJvYyA9IG51bGw7XG4gIH1cblxuICBnZXQgaXNSdW5uaW5nICgpIHtcbiAgICByZXR1cm4gISEodGhpcy5wcm9jPy5pc1J1bm5pbmcpO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAoKSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBvcnQpIHtcbiAgICAgIGF3YWl0IEdFQ0tPX1NFUlZFUl9HVUFSRChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtzdGFydFBvcnQsIGVuZFBvcnRdID0gR0VDS09fUE9SVF9SQU5HRTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnBvcnQgPSBhd2FpdCBmaW5kQVBvcnROb3RJblVzZShzdGFydFBvcnQsIGVuZFBvcnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBmcmVlIHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9LiBgICtcbiAgICAgICAgICAgIGBEb3VibGUgY2hlY2sgdGhlIHByb2Nlc3NlcyB0aGF0IGFyZSBsb2NraW5nIHBvcnRzIHdpdGhpbiB0aGlzIHJhbmdlIGFuZCB0ZXJtaW5hdGUgYCArXG4gICAgICAgICAgICBgdGhlc2Ugd2hpY2ggYXJlIG5vdCBuZWVkZWQgYW55bW9yZSBvciBzZXQgYW55IGZyZWUgcG9ydCBudW1iZXIgdG8gdGhlICdzeXN0ZW1Qb3J0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkcml2ZXJCaW47XG4gICAgdHJ5IHtcbiAgICAgIGRyaXZlckJpbiA9IGF3YWl0IGZzLndoaWNoKEdEX0JJTkFSWSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0dEX0JJTkFSWX0gYmluYXJ5IGNhbm5vdCBiZSBmb3VuZCBpbiBQQVRILiBgICtcbiAgICAgICAgYFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgcHJlc2VudCBvbiB5b3VyIHN5c3RlbWApO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJy1wJywgdGhpcy5wb3J0LFxuICAgIF07XG4gICAgc3dpdGNoIChfLnRvTG93ZXIodGhpcy52ZXJib3NpdHkpKSB7XG4gICAgICBjYXNlIFZFUkJPU0lUWS5ERUJVRzpcbiAgICAgICAgYXJncy5wdXNoKCctdicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVkVSQk9TSVRZLlRSQUNFOlxuICAgICAgICBhcmdzLnB1c2goJy12dicpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMubm9SZXNldCkge1xuICAgICAgYXJncy5wdXNoKCctLWNvbm5lY3QtZXhpc3RpbmcnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYW5kcm9pZFN0b3JhZ2UpIHtcbiAgICAgIGFyZ3MucHVzaCgn4oCTLWFuZHJvaWQtc3RvcmFnZScsIHRoaXMuYW5kcm9pZFN0b3JhZ2UpO1xuICAgIH1cbiAgICB0aGlzLnByb2MgPSBuZXcgU3ViUHJvY2Vzcyhkcml2ZXJCaW4sIGFyZ3MpO1xuICAgIHRoaXMucHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBsaW5lID0gXy50cmltKHN0ZG91dCB8fCBzdGRlcnIpO1xuICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBbJHtHRF9CSU5BUll9XSAke2xpbmV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgbG9nLmluZm8oYCR7R0RfQklOQVJZfSBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gICAgfSk7XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nICcke2RyaXZlckJpbn0nIHdpdGggYXJncyAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0b3AoJ1NJR1RFUk0nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsICgpIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IFJVTk5JTkdfUFJPQ0VTU19JRFMgPSBbXTtcbnByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgZm9yIChjb25zdCBwaWQgb2YgUlVOTklOR19QUk9DRVNTX0lEUykge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBzeXN0ZW0uaXNXaW5kb3dzKCkgPyBgdGFza2tpbGwuZXhlIC9QSUQgJHtwaWR9YCA6IGBraWxsICR7cGlkfWA7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKGNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgfVxufSk7XG5cbmNsYXNzIEdlY2tvRHJpdmVyU2VydmVyIHtcbiAgY29uc3RydWN0b3IgKGNhcHMpIHtcbiAgICB0aGlzLnByb2Nlc3MgPSBuZXcgR2Vja29Ecml2ZXJQcm9jZXNzKGNhcHMpO1xuICAgIHRoaXMucHJveHkgPSBudWxsO1xuICB9XG5cbiAgZ2V0IGlzUnVubmluZyAoKSB7XG4gICAgcmV0dXJuICEhKHRoaXMucHJvY2Vzcz8uaXNSdW5uaW5nKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChnZWNrb0NhcHMpIHtcbiAgICBhd2FpdCB0aGlzLnByb2Nlc3MuaW5pdCgpO1xuXG4gICAgdGhpcy5wcm94eSA9IG5ldyBHZWNrb1Byb3h5KHtcbiAgICAgIHNlcnZlcjogJzEyNy4wLjAuMScsXG4gICAgICBwb3J0OiB0aGlzLnByb2Nlc3MucG9ydCxcbiAgICAgIGJhc2U6ICcnLFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveHkuZGlkUHJvY2Vzc0V4aXQgPSBmYWxzZTtcbiAgICB0aGlzLnByb2Nlc3MucHJvYy5vbignZXhpdCcsICgpID0+IHtcbiAgICAgIHRoaXMucHJveHkuZGlkUHJvY2Vzc0V4aXQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKHRoaXMucHJveHkuZGlkUHJvY2Vzc0V4aXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICB3YWl0TXM6IFNUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnByb2Nlc3MuaXNSdW5uaW5nKSB7XG4gICAgICAgIC8vIGF2b2lkIFwiZnJvemVuXCIgcHJvY2Vzc2VzLFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3Mua2lsbCgpO1xuICAgICAgfVxuICAgICAgaWYgKC9Db25kaXRpb24gdW5tZXQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdlY2tvIERyaXZlciBzZXJ2ZXIgaXMgbm90IGxpc3RlbmluZyB3aXRoaW4gJHtTVEFSVFVQX1RJTUVPVVRfTVN9bXMgdGltZW91dC4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBpdCBjb3VsZCBiZSBzdGFydGVkIG1hbnVhbGx5IGZyb20gYSB0ZXJtaW5hbGApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgY29uc3QgcGlkID0gdGhpcy5wcm9jZXNzLnByb2MucGlkO1xuICAgIFJVTk5JTkdfUFJPQ0VTU19JRFMucHVzaChwaWQpO1xuICAgIHRoaXMucHJvY2Vzcy5wcm9jLm9uKCdleGl0JywgKCkgPT4gdm9pZCBfLnB1bGwoUlVOTklOR19QUk9DRVNTX0lEUywgcGlkKSk7XG5cbiAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoJy9zZXNzaW9uJywgJ1BPU1QnLCB7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IGdlY2tvQ2FwcyxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AgKCkge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIGxvZy5pbmZvKGBHZWNrbyBEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgc3RvcHBlZCwgYmVjYXVzZSB0aGUgc2VydmVyIGlzIG5vdCBydW5uaW5nYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJveHk/LnNlc3Npb25JZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKGAvc2Vzc2lvbi8ke3RoaXMucHJveHkuc2Vzc2lvbklkfWAsICdERUxFVEUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmluZm8oYEdlY2tvIERyaXZlciBzZXNzaW9uIGNhbm5vdCBiZSBkZWxldGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5zdG9wKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oYEdlY2tvIERyaXZlciBwcm9jZXNzIGNhbm5vdCBiZSBzdG9wcGVkICgke2UubWVzc2FnZX0pLiBLaWxsaW5nIGl0IGZvcmNlZnVsbHlgKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5raWxsKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlY2tvRHJpdmVyU2VydmVyO1xuIl0sImZpbGUiOiJsaWIvZ2Vja28uanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
|
272
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9nZWNrby5qcyJdLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJHRF9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJTVEFSVFVQX1RJTUVPVVRfTVMiLCJHRUNLT19QT1JUX1JBTkdFIiwiR0VDS09fU0VSVkVSX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiREVGQVVMVF9NQVJJT05FVFRFX1BPUlQiLCJQUk9DRVNTX1NQRUNJRklDX09QVElPTl9OQU1FU19NQVAiLCJPYmplY3QiLCJmcmVlemUiLCJub1Jlc2V0IiwidmVyYm9zaXR5IiwiYW5kcm9pZFN0b3JhZ2UiLCJtYXJpb25ldHRlUG9ydCIsInN5c3RlbVBvcnQiLCJHZWNrb1Byb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRQcm9jZXNzRXhpdCIsImVycm9ycyIsIkludmFsaWRDb250ZXh0RXJyb3IiLCJHZWNrb0RyaXZlclByb2Nlc3MiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJvcHROYW1lIiwicHJvcE5hbWUiLCJfIiwidG9QYWlycyIsInByb2MiLCJpc1J1bm5pbmciLCJpbml0IiwicG9ydCIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJlIiwiRXJyb3IiLCJkcml2ZXJCaW4iLCJmcyIsIndoaWNoIiwiYXJncyIsInRvTG93ZXIiLCJWRVJCT1NJVFkiLCJERUJVRyIsInB1c2giLCJUUkFDRSIsImlzTmlsIiwiaW5mbyIsIlN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImxpbmUiLCJ0cmltIiwiZGVidWciLCJjb2RlIiwic2lnbmFsIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0Iiwic3RvcCIsImtpbGwiLCJpZ24iLCJSVU5OSU5HX1BST0NFU1NfSURTIiwicHJvY2VzcyIsIm9uY2UiLCJwaWQiLCJjb21tYW5kIiwiR2Vja29Ecml2ZXJTZXJ2ZXIiLCJjYXBzIiwicHJveHkiLCJnZWNrb0NhcHMiLCJzZXJ2ZXIiLCJiYXNlIiwia2VlcEFsaXZlIiwiZXJyIiwibWVzc2FnZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJ0ZXN0IiwicHVsbCIsImNhcGFiaWxpdGllcyIsImZpcnN0TWF0Y2giLCJhbHdheXNNYXRjaCIsInNlc3Npb25JZCIsIndhcm4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixtQkFBakIsQ0FBWjs7QUFFQSxNQUFNQyxTQUFTLEdBQUksY0FBYUMsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUFqRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLEtBQTNCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBR0MsY0FBS0MsZ0JBQUwsQ0FDekJDLGNBQUtDLE9BQUwsQ0FBYUMsWUFBR0MsTUFBSCxFQUFiLEVBQTBCLHlCQUExQixDQUR5QixFQUV6QjtBQUFDQyxFQUFBQSxPQUFPLEVBQUUsQ0FBVjtBQUFhQyxFQUFBQSxXQUFXLEVBQUU7QUFBMUIsQ0FGeUIsQ0FBM0I7O0FBSUEsTUFBTUMsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyxpQ0FBaUMsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDdERDLEVBQUFBLE9BQU8sRUFBRSxTQUQ2QztBQUV0REMsRUFBQUEsU0FBUyxFQUFFLFdBRjJDO0FBR3REQyxFQUFBQSxjQUFjLEVBQUUsZ0JBSHNDO0FBSXREQyxFQUFBQSxjQUFjLEVBQUUsZ0JBSnNDO0FBS3REQyxFQUFBQSxVQUFVLEVBQUU7QUFMMEMsQ0FBZCxDQUExQzs7QUFTQSxN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OztBQWxGcUI7O2VBcUZUTyxpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBKV1Byb3h5LCBlcnJvcnMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCBsb2dnZXIsIHV0aWwsIHN5c3RlbSB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBmaW5kQVBvcnROb3RJblVzZSB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBWRVJCT1NJVFkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0dlY2tvRHJpdmVyU2VydmVyJyk7XG5cbmNvbnN0IEdEX0JJTkFSWSA9IGBnZWNrb2RyaXZlciR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbmNvbnN0IFNUQVJUVVBfVElNRU9VVF9NUyA9IDEwMDAwOyAvLyAxMCBzZWNvbmRzXG5jb25zdCBHRUNLT19QT1JUX1JBTkdFID0gWzUyMDAsIDUzMDBdO1xuY29uc3QgR0VDS09fU0VSVkVSX0dVQVJEID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKFxuICBwYXRoLnJlc29sdmUob3MudG1wZGlyKCksICdnZWNrb19zZXJ2ZXJfZ3VhcmQubG9jaycpLFxuICB7dGltZW91dDogNSwgdHJ5UmVjb3Zlcnk6IHRydWV9XG4pO1xuY29uc3QgREVGQVVMVF9NQVJJT05FVFRFX1BPUlQgPSAyODI4O1xuY29uc3QgUFJPQ0VTU19TUEVDSUZJQ19PUFRJT05fTkFNRVNfTUFQID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG5vUmVzZXQ6ICdub1Jlc2V0JyxcbiAgdmVyYm9zaXR5OiAndmVyYm9zaXR5JyxcbiAgYW5kcm9pZFN0b3JhZ2U6ICdhbmRyb2lkU3RvcmFnZScsXG4gIG1hcmlvbmV0dGVQb3J0OiAnbWFyaW9uZXR0ZVBvcnQnLFxuICBzeXN0ZW1Qb3J0OiAncG9ydCcsXG59KTtcblxuXG5jbGFzcyBHZWNrb1Byb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuZGlkUHJvY2Vzc0V4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBHZWNrbyBEcml2ZXIgc2VydmVyIGJlY2F1c2UgYCArXG4gICAgICAgICdpdHMgcHJvY2VzcyBpcyBub3QgcnVubmluZyAocHJvYmFibHkgY3Jhc2hlZCkuIENoZWNrIHRoZSBBcHBpdW0gbG9nIGZvciBtb3JlIGRldGFpbHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLnByb3h5Q29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cbn1cblxuY2xhc3MgR2Vja29Ecml2ZXJQcm9jZXNzIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIGZvciAoY29uc3QgW29wdE5hbWUsIHByb3BOYW1lXSBvZiBfLnRvUGFpcnMoUFJPQ0VTU19TUEVDSUZJQ19PUFRJT05fTkFNRVNfTUFQKSkge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBvcHRzW29wdE5hbWVdO1xuICAgIH1cbiAgICB0aGlzLnByb2MgPSBudWxsO1xuICB9XG5cbiAgZ2V0IGlzUnVubmluZyAoKSB7XG4gICAgcmV0dXJuICEhKHRoaXMucHJvYz8uaXNSdW5uaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQgKCkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wb3J0KSB7XG4gICAgICBhd2FpdCBHRUNLT19TRVJWRVJfR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBbc3RhcnRQb3J0LCBlbmRQb3J0XSA9IEdFQ0tPX1BPUlRfUkFOR0U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5wb3J0ID0gYXdhaXQgZmluZEFQb3J0Tm90SW5Vc2Uoc3RhcnRQb3J0LCBlbmRQb3J0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fS4gYCArXG4gICAgICAgICAgICBgRG91YmxlIGNoZWNrIHRoZSBwcm9jZXNzZXMgdGhhdCBhcmUgbG9ja2luZyBwb3J0cyB3aXRoaW4gdGhpcyByYW5nZSBhbmQgdGVybWluYXRlIGAgK1xuICAgICAgICAgICAgYHRoZXNlIHdoaWNoIGFyZSBub3QgbmVlZGVkIGFueW1vcmUgb3Igc2V0IGFueSBmcmVlIHBvcnQgbnVtYmVyIHRvIHRoZSAnc3lzdGVtUG9ydCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgZHJpdmVyQmluO1xuICAgIHRyeSB7XG4gICAgICBkcml2ZXJCaW4gPSBhd2FpdCBmcy53aGljaChHRF9CSU5BUlkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtHRF9CSU5BUll9IGJpbmFyeSBjYW5ub3QgYmUgZm91bmQgaW4gUEFUSC4gYCArXG4gICAgICAgIGBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIHByZXNlbnQgb24geW91ciBzeXN0ZW1gKTtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIC8qICNyZWdpb24gT3B0aW9ucyAqL1xuICAgIHN3aXRjaCAoXy50b0xvd2VyKHRoaXMudmVyYm9zaXR5KSkge1xuICAgICAgY2FzZSBWRVJCT1NJVFkuREVCVUc6XG4gICAgICAgIGFyZ3MucHVzaCgnLXYnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZFUkJPU0lUWS5UUkFDRTpcbiAgICAgICAgYXJncy5wdXNoKCctdnYnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLm5vUmVzZXQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1jb25uZWN0LWV4aXN0aW5nJyk7XG4gICAgICAvLyBodHRwczovL2ZpcmVmb3gtc291cmNlLWRvY3MubW96aWxsYS5vcmcvdGVzdGluZy9nZWNrb2RyaXZlci9GbGFncy5odG1sI2NvZGUtY29ubmVjdC1leGlzdGluZy1jb2RlXG4gICAgICBpZiAoXy5pc05pbCh0aGlzLm1hcmlvbmV0dGVQb3J0KSkge1xuICAgICAgICBsb2cuaW5mbyhgJ21hcmlvbmV0dGVQb3J0JyBjYXBhYmlsaXR5IHZhbHVlIGlzIG5vdCBwcm92aWRlZCB3aGlsZSAnbm9SZXNldCcgaXMgZW5hYmxlZGApO1xuICAgICAgICBsb2cuaW5mbyhgQXNzaWduaW5nICdtYXJpb25ldHRlUG9ydCcgdG8gdGhlIGRlZmF1bHQgdmFsdWUgKCR7REVGQVVMVF9NQVJJT05FVFRFX1BPUlR9KWApO1xuICAgICAgfVxuICAgICAgYXJncy5wdXNoKCctLW1hcmlvbmV0dGUtcG9ydCcsIHRoaXMubWFyaW9uZXR0ZVBvcnQgPz8gREVGQVVMVF9NQVJJT05FVFRFX1BPUlQpO1xuICAgIH0gZWxzZSBpZiAoIV8uaXNOaWwodGhpcy5tYXJpb25ldHRlUG9ydCkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1tYXJpb25ldHRlLXBvcnQnLCB0aGlzLm1hcmlvbmV0dGVQb3J0KTtcbiAgICB9XG4gICAgLyogI2VuZHJlZ2lvbiAqL1xuXG4gICAgYXJncy5wdXNoKCctcCcsIHRoaXMucG9ydCk7XG4gICAgaWYgKHRoaXMuYW5kcm9pZFN0b3JhZ2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1hbmRyb2lkLXN0b3JhZ2UnLCB0aGlzLmFuZHJvaWRTdG9yYWdlKTtcbiAgICB9XG4gICAgdGhpcy5wcm9jID0gbmV3IFN1YlByb2Nlc3MoZHJpdmVyQmluLCBhcmdzKTtcbiAgICB0aGlzLnByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgY29uc3QgbGluZSA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgWyR7R0RfQklOQVJZfV0gJHtsaW5lfWApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucHJvYy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGxvZy5pbmZvKGAke0dEX0JJTkFSWX0gaGFzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICAgIH0pO1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyAnJHtkcml2ZXJCaW59JyB3aXRoIGFyZ3MgJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgICBhd2FpdCB0aGlzLnByb2Muc3RhcnQoMCk7XG4gIH1cblxuICBhc3luYyBzdG9wICgpIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCAoKSB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgnU0lHS0lMTCcpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBSVU5OSU5HX1BST0NFU1NfSURTID0gW107XG5wcm9jZXNzLm9uY2UoJ2V4aXQnLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgcGlkIG9mIFJVTk5JTkdfUFJPQ0VTU19JRFMpIHtcbiAgICBjb25zdCBjb21tYW5kID0gc3lzdGVtLmlzV2luZG93cygpID8gYHRhc2traWxsLmV4ZSAvUElEICR7cGlkfWAgOiBga2lsbCAke3BpZH1gO1xuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyhjb21tYW5kKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gIH1cbn0pO1xuXG5jbGFzcyBHZWNrb0RyaXZlclNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChjYXBzKSB7XG4gICAgdGhpcy5wcm9jZXNzID0gbmV3IEdlY2tvRHJpdmVyUHJvY2VzcyhjYXBzKTtcbiAgICB0aGlzLnByb3h5ID0gbnVsbDtcbiAgfVxuXG4gIGdldCBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhISh0aGlzLnByb2Nlc3M/LmlzUnVubmluZyk7XG4gIH1cblxuICBhc3luYyBzdGFydCAoZ2Vja29DYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5wcm9jZXNzLmluaXQoKTtcblxuICAgIHRoaXMucHJveHkgPSBuZXcgR2Vja29Qcm94eSh7XG4gICAgICBzZXJ2ZXI6ICcxMjcuMC4wLjEnLFxuICAgICAgcG9ydDogdGhpcy5wcm9jZXNzLnBvcnQsXG4gICAgICBiYXNlOiAnJyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0ID0gZmFsc2U7XG4gICAgdGhpcy5wcm9jZXNzLnByb2Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgICB0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0ID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICh0aGlzLnByb3h5LmRpZFByb2Nlc3NFeGl0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wcm9jZXNzLmlzUnVubmluZykge1xuICAgICAgICAvLyBhdm9pZCBcImZyb3plblwiIHByb2Nlc3NlcyxcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmtpbGwoKTtcbiAgICAgIH1cbiAgICAgIGlmICgvQ29uZGl0aW9uIHVubWV0Ly50ZXN0KGUubWVzc2FnZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZWNrbyBEcml2ZXIgc2VydmVyIGlzIG5vdCBsaXN0ZW5pbmcgd2l0aGluICR7U1RBUlRVUF9USU1FT1VUX01TfW1zIHRpbWVvdXQuIGAgK1xuICAgICAgICAgIGBNYWtlIHN1cmUgaXQgY291bGQgYmUgc3RhcnRlZCBtYW51YWxseSBmcm9tIGEgdGVybWluYWxgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHBpZCA9IHRoaXMucHJvY2Vzcy5wcm9jLnBpZDtcbiAgICBSVU5OSU5HX1BST0NFU1NfSURTLnB1c2gocGlkKTtcbiAgICB0aGlzLnByb2Nlc3MucHJvYy5vbignZXhpdCcsICgpID0+IHZvaWQgXy5wdWxsKFJVTk5JTkdfUFJPQ0VTU19JRFMsIHBpZCkpO1xuXG4gICAgYXdhaXQgdGhpcy5wcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFt7fV0sXG4gICAgICAgIGFsd2F5c01hdGNoOiBnZWNrb0NhcHMsXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzdG9wICgpIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICBsb2cuaW5mbyhgR2Vja28gRHJpdmVyIHNlc3Npb24gY2Fubm90IGJlIHN0b3BwZWQsIGJlY2F1c2UgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZ2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3h5Py5zZXNzaW9uSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJveHkuY29tbWFuZChgL3Nlc3Npb24vJHt0aGlzLnByb3h5LnNlc3Npb25JZH1gLCAnREVMRVRFJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5pbmZvKGBHZWNrbyBEcml2ZXIgc2Vzc2lvbiBjYW5ub3QgYmUgZGVsZXRlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3Muc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy53YXJuKGBHZWNrbyBEcml2ZXIgcHJvY2VzcyBjYW5ub3QgYmUgc3RvcHBlZCAoJHtlLm1lc3NhZ2V9KS4gS2lsbGluZyBpdCBmb3JjZWZ1bGx5YCk7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3Mua2lsbCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHZWNrb0RyaXZlclNlcnZlcjtcbiJdLCJmaWxlIjoibGliL2dlY2tvLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
package/build/lib/logger.js
CHANGED
|
@@ -7,12 +7,12 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
require("source-map-support/register");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _support = require("@appium/support");
|
|
11
11
|
|
|
12
|
-
const log =
|
|
12
|
+
const log = _support.logger.getLogger('GeckoDriver');
|
|
13
13
|
|
|
14
14
|
var _default = log;
|
|
15
15
|
exports.default = _default;require('source-map-support').install();
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLGFBQWpCLENBQVo7O2VBRWVGLEciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdHZWNrb0RyaXZlcicpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7XG4iXSwiZmlsZSI6ImxpYi9sb2dnZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/server.js
CHANGED
|
@@ -11,7 +11,7 @@ require("source-map-support/register");
|
|
|
11
11
|
|
|
12
12
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _baseDriver = require("@appium/base-driver");
|
|
15
15
|
|
|
16
16
|
var _driver = _interopRequireDefault(require("./driver"));
|
|
17
17
|
|
|
@@ -20,8 +20,8 @@ async function startServer(port, address) {
|
|
|
20
20
|
port,
|
|
21
21
|
address
|
|
22
22
|
});
|
|
23
|
-
let routeConfiguringFunction = (0,
|
|
24
|
-
let server = await (0,
|
|
23
|
+
let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(d);
|
|
24
|
+
let server = await (0, _baseDriver.server)({
|
|
25
25
|
routeConfiguringFunction,
|
|
26
26
|
port,
|
|
27
27
|
hostname: address
|
|
@@ -33,4 +33,4 @@ async function startServer(port, address) {
|
|
|
33
33
|
}require('source-map-support').install();
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXIuanMiXSwibmFtZXMiOlsic3RhcnRTZXJ2ZXIiLCJwb3J0IiwiYWRkcmVzcyIsImQiLCJHZWNrb0RyaXZlciIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlcnZlciIsImhvc3RuYW1lIiwibG9nIiwiaW5mbyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFHQTs7QUFFQSxlQUFlQSxXQUFmLENBQTRCQyxJQUE1QixFQUFrQ0MsT0FBbEMsRUFBMkM7QUFDekMsTUFBSUMsQ0FBQyxHQUFHLElBQUlDLGVBQUosQ0FBZ0I7QUFBQ0gsSUFBQUEsSUFBRDtBQUFPQyxJQUFBQTtBQUFQLEdBQWhCLENBQVI7QUFDQSxNQUFJRyx3QkFBd0IsR0FBRywwQ0FBV0YsQ0FBWCxDQUEvQjtBQUNBLE1BQUlHLE1BQU0sR0FBRyxNQUFNLHdCQUFXO0FBQUNELElBQUFBLHdCQUFEO0FBQTJCSixJQUFBQSxJQUEzQjtBQUFpQ00sSUFBQUEsUUFBUSxFQUFFTDtBQUEzQyxHQUFYLENBQW5COztBQUNBTSxrQkFBSUMsSUFBSixDQUFVLDJDQUEwQ1AsT0FBUSxJQUFHRCxJQUFLLEVBQXBFOztBQUNBLFNBQU9LLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgc2VydmVyIGFzIGJhc2VTZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyXG59IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuaW1wb3J0IEdlY2tvRHJpdmVyIGZyb20gJy4vZHJpdmVyJztcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXIgKHBvcnQsIGFkZHJlc3MpIHtcbiAgbGV0IGQgPSBuZXcgR2Vja29Ecml2ZXIoe3BvcnQsIGFkZHJlc3N9KTtcbiAgbGV0IHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiA9IG1ha2VSb3V0ZXIoZCk7XG4gIGxldCBzZXJ2ZXIgPSBhd2FpdCBiYXNlU2VydmVyKHtyb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sIHBvcnQsIGhvc3RuYW1lOiBhZGRyZXNzfSk7XG4gIGxvZy5pbmZvKGBHZWNrbyBEcml2ZXIgc2VydmVyIGxpc3RlbmluZyBvbiBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9YCk7XG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbmV4cG9ydCB7IHN0YXJ0U2VydmVyIH07XG4iXSwiZmlsZSI6ImxpYi9zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/utils.js
CHANGED
|
@@ -27,8 +27,12 @@ function formatCapsForServer(caps) {
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
if (result.platformName) {
|
|
31
|
+
result.platformName = _lodash.default.toLower(result.platformName);
|
|
32
|
+
}
|
|
33
|
+
|
|
30
34
|
return result;
|
|
31
35
|
}require('source-map-support').install();
|
|
32
36
|
|
|
33
37
|
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJHRUNLT19DQVBfUFJFRklYRVMiLCJTVEFOREFSRF9DQVBTIiwiZm9ybWF0Q2Fwc0ZvclNlcnZlciIsImNhcHMiLCJyZXN1bHQiLCJicm93c2VyTmFtZSIsIm5hbWUiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwic29tZSIsInByZWZpeCIsInN0YXJ0c1dpdGgiLCJpbmNsdWRlcyIsInBsYXRmb3JtTmFtZSIsInRvTG93ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsQ0FBQyxNQUFELENBQTNCO0FBRUEsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLGdCQURvQixFQUVwQixjQUZvQixFQUdwQixxQkFIb0IsRUFJcEIsa0JBSm9CLEVBS3BCLE9BTG9CLEVBTXBCLGVBTm9CLEVBT3BCLFVBUG9CLEVBUXBCLHlCQVJvQixDQUF0Qjs7QUFXQSxTQUFTQyxtQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0M7QUFDbEMsUUFBTUMsTUFBTSxHQUFHLEVBQWY7O0FBQ0EsTUFBSUQsSUFBSSxDQUFDRSxXQUFULEVBQXNCO0FBQ3BCRCxJQUFBQSxNQUFNLENBQUNDLFdBQVAsR0FBcUIsU0FBckI7QUFDRDs7QUFDRCxPQUFLLE1BQU0sQ0FBQ0MsSUFBRCxFQUFPQyxLQUFQLENBQVgsSUFBNEJDLGdCQUFFQyxPQUFGLENBQVVOLElBQVYsQ0FBNUIsRUFBNkM7QUFDM0MsUUFBSUgsa0JBQWtCLENBQUNVLElBQW5CLENBQXlCQyxNQUFELElBQVlMLElBQUksQ0FBQ00sVUFBTCxDQUFnQkQsTUFBaEIsQ0FBcEMsS0FBZ0VWLGFBQWEsQ0FBQ1ksUUFBZCxDQUF1QlAsSUFBdkIsQ0FBcEUsRUFBa0c7QUFDaEdGLE1BQUFBLE1BQU0sQ0FBQ0UsSUFBRCxDQUFOLEdBQWVDLEtBQWY7QUFDRDtBQUNGOztBQUNELE1BQUlILE1BQU0sQ0FBQ1UsWUFBWCxFQUF5QjtBQUV2QlYsSUFBQUEsTUFBTSxDQUFDVSxZQUFQLEdBQXNCTixnQkFBRU8sT0FBRixDQUFVWCxNQUFNLENBQUNVLFlBQWpCLENBQXRCO0FBQ0Q7O0FBQ0QsU0FBT1YsTUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuY29uc3QgR0VDS09fQ0FQX1BSRUZJWEVTID0gWydtb3o6J107XG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNjYXBhYmlsaXRpZXNcbmNvbnN0IFNUQU5EQVJEX0NBUFMgPSBbXG4gICdicm93c2VyVmVyc2lvbicsXG4gICdwbGF0Zm9ybU5hbWUnLFxuICAnYWNjZXB0SW5zZWN1cmVDZXJ0cycsXG4gICdwYWdlTG9hZFN0cmF0ZWd5JyxcbiAgJ3Byb3h5JyxcbiAgJ3NldFdpbmRvd1JlY3QnLFxuICAndGltZW91dHMnLFxuICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InLFxuXTtcblxuZnVuY3Rpb24gZm9ybWF0Q2Fwc0ZvclNlcnZlciAoY2Fwcykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgaWYgKGNhcHMuYnJvd3Nlck5hbWUpIHtcbiAgICByZXN1bHQuYnJvd3Nlck5hbWUgPSAnZmlyZWZveCc7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGlmIChHRUNLT19DQVBfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkgfHwgU1RBTkRBUkRfQ0FQUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGlmIChyZXN1bHQucGxhdGZvcm1OYW1lKSB7XG4gICAgLy8gR2Vja29kcml2ZXIgb25seSBzdXBwb3J0cyBsb3dlcmNhc2UgcGxhdGZvcm0gbmFtZXNcbiAgICByZXN1bHQucGxhdGZvcm1OYW1lID0gXy50b0xvd2VyKHJlc3VsdC5wbGF0Zm9ybU5hbWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IGZvcm1hdENhcHNGb3JTZXJ2ZXIgfTtcbiJdLCJmaWxlIjoibGliL3V0aWxzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
|
|
5
5
|
require("source-map-support/register");
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _webdriverio = require("webdriverio");
|
|
8
8
|
|
|
9
9
|
var _ = require("../..");
|
|
10
10
|
|
|
@@ -36,21 +36,24 @@ describe('Desktop Gecko Driver', function () {
|
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
38
|
beforeEach(async function () {
|
|
39
|
-
driver =
|
|
40
|
-
|
|
39
|
+
driver = await (0, _webdriverio.remote)({
|
|
40
|
+
hostname: _utils.HOST,
|
|
41
|
+
port: _utils.PORT,
|
|
42
|
+
capabilities: CAPS
|
|
43
|
+
});
|
|
41
44
|
});
|
|
42
45
|
afterEach(async function () {
|
|
43
46
|
if (driver) {
|
|
44
|
-
await driver.
|
|
47
|
+
await driver.deleteSession();
|
|
45
48
|
driver = null;
|
|
46
49
|
}
|
|
47
50
|
});
|
|
48
51
|
it('should start and stop a session', async function () {
|
|
49
|
-
await driver.
|
|
50
|
-
const button = await driver
|
|
51
|
-
await button.
|
|
52
|
+
await driver.url('https://appium.io/');
|
|
53
|
+
const button = await driver.$('#downloadLink');
|
|
54
|
+
await button.getText().should.eventually.eql('Download Appium');
|
|
52
55
|
});
|
|
53
56
|
});require('source-map-support').install();
|
|
54
57
|
|
|
55
58
|
|
|
56
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnVuY3Rpb25hbC9kZXNrdG9wLWRyaXZlci1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiY2hhaSIsInNob3VsZCIsInVzZSIsImNoYWlBc1Byb21pc2VkIiwiQ0FQUyIsImJyb3dzZXJOYW1lIiwicGxhdGZvcm1OYW1lIiwiZGVzY3JpYmUiLCJ0aW1lb3V0IiwiTU9DSEFfVElNRU9VVCIsInNlcnZlciIsImRyaXZlciIsImJlZm9yZSIsIlBPUlQiLCJIT1NUIiwiYWZ0ZXIiLCJjbG9zZSIsImJlZm9yZUVhY2giLCJob3N0bmFtZSIsInBvcnQiLCJjYXBhYmlsaXRpZXMiLCJhZnRlckVhY2giLCJkZWxldGVTZXNzaW9uIiwiaXQiLCJ1cmwiLCJidXR0b24iLCIkIiwiZ2V0VGV4dCIsImV2ZW50dWFsbHkiLCJlcWwiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBQSxjQUFLQyxNQUFMOztBQUNBRCxjQUFLRSxHQUFMLENBQVNDLHVCQUFUOztBQUVBLE1BQU1DLElBQUksR0FBRztBQUNYQyxFQUFBQSxXQUFXLEVBQUUsZ0JBREY7QUFFWEMsRUFBQUEsWUFBWSxFQUFFO0FBRkgsQ0FBYjtBQUtBQyxRQUFRLENBQUMsc0JBQUQsRUFBeUIsWUFBWTtBQUMzQyxPQUFLQyxPQUFMLENBQWFDLG9CQUFiO0FBRUEsTUFBSUMsTUFBSjtBQUNBLE1BQUlDLE1BQUo7QUFDQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkYsSUFBQUEsTUFBTSxHQUFHLE1BQU0sbUJBQVlHLFdBQVosRUFBa0JDLFdBQWxCLENBQWY7QUFDRCxHQUZLLENBQU47QUFHQUMsRUFBQUEsS0FBSyxDQUFDLGtCQUFrQjtBQUN0QixRQUFJTCxNQUFKLEVBQVk7QUFDVixZQUFNQSxNQUFNLENBQUNNLEtBQVAsRUFBTjtBQUNBTixNQUFBQSxNQUFNLEdBQUcsSUFBVDtBQUNEO0FBQ0YsR0FMSSxDQUFMO0FBTUFPLEVBQUFBLFVBQVUsQ0FBQyxrQkFBa0I7QUFDM0JOLElBQUFBLE1BQU0sR0FBRyxNQUFNLHlCQUFPO0FBQ3BCTyxNQUFBQSxRQUFRLEVBQUVKLFdBRFU7QUFFcEJLLE1BQUFBLElBQUksRUFBRU4sV0FGYztBQUdwQk8sTUFBQUEsWUFBWSxFQUFFaEI7QUFITSxLQUFQLENBQWY7QUFLRCxHQU5TLENBQVY7QUFPQWlCLEVBQUFBLFNBQVMsQ0FBQyxrQkFBa0I7QUFDMUIsUUFBSVYsTUFBSixFQUFZO0FBQ1YsWUFBTUEsTUFBTSxDQUFDVyxhQUFQLEVBQU47QUFDQVgsTUFBQUEsTUFBTSxHQUFHLElBQVQ7QUFDRDtBQUNGLEdBTFEsQ0FBVDtBQU9BWSxFQUFBQSxFQUFFLENBQUMsaUNBQUQsRUFBb0Msa0JBQWtCO0FBQ3RELFVBQU1aLE1BQU0sQ0FBQ2EsR0FBUCxDQUFXLG9CQUFYLENBQU47QUFDQSxVQUFNQyxNQUFNLEdBQUcsTUFBTWQsTUFBTSxDQUFDZSxDQUFQLENBQVMsZUFBVCxDQUFyQjtBQUNBLFVBQU1ELE1BQU0sQ0FBQ0UsT0FBUCxHQUFpQjFCLE1BQWpCLENBQXdCMkIsVUFBeEIsQ0FBbUNDLEdBQW5DLENBQXVDLGlCQUF2QyxDQUFOO0FBQ0QsR0FKQyxDQUFGO0FBS0QsQ0FqQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlbW90ZSB9IGZyb20gJ3dlYmRyaXZlcmlvJztcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IGNoYWlBc1Byb21pc2VkIGZyb20gJ2NoYWktYXMtcHJvbWlzZWQnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5pbXBvcnQgeyBIT1NULCBQT1JULCBNT0NIQV9USU1FT1VUIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jaGFpLnNob3VsZCgpO1xuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xuXG5jb25zdCBDQVBTID0ge1xuICBicm93c2VyTmFtZTogJ01vemlsbGFGaXJlZm94JyxcbiAgcGxhdGZvcm1OYW1lOiAnbGludXgnLFxufTtcblxuZGVzY3JpYmUoJ0Rlc2t0b3AgR2Vja28gRHJpdmVyJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnRpbWVvdXQoTU9DSEFfVElNRU9VVCk7XG5cbiAgbGV0IHNlcnZlcjtcbiAgbGV0IGRyaXZlcjtcbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcihQT1JULCBIT1NUKTtcbiAgfSk7XG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHNlcnZlciA9IG51bGw7XG4gICAgfVxuICB9KTtcbiAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgZHJpdmVyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgIGhvc3RuYW1lOiBIT1NULFxuICAgICAgcG9ydDogUE9SVCxcbiAgICAgIGNhcGFiaWxpdGllczogQ0FQUyxcbiAgICB9KTtcbiAgfSk7XG4gIGFmdGVyRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRyaXZlcikge1xuICAgICAgYXdhaXQgZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICAgIGRyaXZlciA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHN0YXJ0IGFuZCBzdG9wIGEgc2Vzc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBkcml2ZXIudXJsKCdodHRwczovL2FwcGl1bS5pby8nKTtcbiAgICBjb25zdCBidXR0b24gPSBhd2FpdCBkcml2ZXIuJCgnI2Rvd25sb2FkTGluaycpO1xuICAgIGF3YWl0IGJ1dHRvbi5nZXRUZXh0KCkuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKCdEb3dubG9hZCBBcHBpdW0nKTtcbiAgfSk7XG59KTtcblxuXG4iXSwiZmlsZSI6InRlc3QvZnVuY3Rpb25hbC9kZXNrdG9wLWRyaXZlci1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
|
|
5
5
|
require("source-map-support/register");
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _webdriverio = require("webdriverio");
|
|
8
8
|
|
|
9
9
|
var _ = require("../..");
|
|
10
10
|
|
|
@@ -20,12 +20,13 @@ _chai.default.use(_chaiAsPromised.default);
|
|
|
20
20
|
|
|
21
21
|
const DEVICE_NAME = process.env.DEVICE_NAME || 'emulator-5554';
|
|
22
22
|
const CAPS = {
|
|
23
|
-
platformName: '
|
|
23
|
+
platformName: 'linux',
|
|
24
24
|
verbosity: 'trace',
|
|
25
25
|
'moz:firefoxOptions': {
|
|
26
26
|
androidDeviceSerial: DEVICE_NAME,
|
|
27
27
|
androidPackage: 'org.mozilla.firefox'
|
|
28
|
-
}
|
|
28
|
+
},
|
|
29
|
+
androidStorage: 'internal'
|
|
29
30
|
};
|
|
30
31
|
describe('Mobile GeckoDriver', function () {
|
|
31
32
|
this.timeout(_utils.MOCHA_TIMEOUT);
|
|
@@ -45,21 +46,24 @@ describe('Mobile GeckoDriver', function () {
|
|
|
45
46
|
}
|
|
46
47
|
});
|
|
47
48
|
beforeEach(async function () {
|
|
48
|
-
driver =
|
|
49
|
-
|
|
49
|
+
driver = await (0, _webdriverio.remote)({
|
|
50
|
+
hostname: _utils.HOST,
|
|
51
|
+
port: _utils.PORT,
|
|
52
|
+
capabilities: CAPS
|
|
53
|
+
});
|
|
50
54
|
});
|
|
51
55
|
afterEach(async function () {
|
|
52
56
|
if (driver) {
|
|
53
|
-
await driver.
|
|
57
|
+
await driver.deleteSession();
|
|
54
58
|
driver = null;
|
|
55
59
|
}
|
|
56
60
|
});
|
|
57
61
|
it('should start and stop a session', async function () {
|
|
58
|
-
await driver.
|
|
59
|
-
const button = await driver
|
|
60
|
-
await button.
|
|
62
|
+
await driver.url('https://appium.io/');
|
|
63
|
+
const button = await driver.$('#downloadLink');
|
|
64
|
+
await button.getText().should.eventually.eql('Download Appium');
|
|
61
65
|
});
|
|
62
66
|
});require('source-map-support').install();
|
|
63
67
|
|
|
64
68
|
|
|
65
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnVuY3Rpb25hbC9tb2JpbGUtZHJpdmVyLWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJjaGFpIiwic2hvdWxkIiwidXNlIiwiY2hhaUFzUHJvbWlzZWQiLCJERVZJQ0VfTkFNRSIsInByb2Nlc3MiLCJlbnYiLCJDQVBTIiwicGxhdGZvcm1OYW1lIiwidmVyYm9zaXR5IiwiYW5kcm9pZERldmljZVNlcmlhbCIsImFuZHJvaWRQYWNrYWdlIiwiYW5kcm9pZFN0b3JhZ2UiLCJkZXNjcmliZSIsInRpbWVvdXQiLCJNT0NIQV9USU1FT1VUIiwic2VydmVyIiwiZHJpdmVyIiwiYmVmb3JlIiwiQ0kiLCJza2lwIiwiUE9SVCIsIkhPU1QiLCJhZnRlciIsImNsb3NlIiwiYmVmb3JlRWFjaCIsImhvc3RuYW1lIiwicG9ydCIsImNhcGFiaWxpdGllcyIsImFmdGVyRWFjaCIsImRlbGV0ZVNlc3Npb24iLCJpdCIsInVybCIsImJ1dHRvbiIsIiQiLCJnZXRUZXh0IiwiZXZlbnR1YWxseSIsImVxbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUFBLGNBQUtDLE1BQUw7O0FBQ0FELGNBQUtFLEdBQUwsQ0FBU0MsdUJBQVQ7O0FBRUEsTUFBTUMsV0FBVyxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsV0FBWixJQUEyQixlQUEvQztBQUVBLE1BQU1HLElBQUksR0FBRztBQUNYQyxFQUFBQSxZQUFZLEVBQUUsT0FESDtBQUdYQyxFQUFBQSxTQUFTLEVBQUUsT0FIQTtBQUlYLHdCQUFzQjtBQUNwQkMsSUFBQUEsbUJBQW1CLEVBQUVOLFdBREQ7QUFFcEJPLElBQUFBLGNBQWMsRUFBRTtBQUZJLEdBSlg7QUFRWEMsRUFBQUEsY0FBYyxFQUFFO0FBUkwsQ0FBYjtBQVdBQyxRQUFRLENBQUMsb0JBQUQsRUFBdUIsWUFBWTtBQUN6QyxPQUFLQyxPQUFMLENBQWFDLG9CQUFiO0FBRUEsTUFBSUMsTUFBSjtBQUNBLE1BQUlDLE1BQUo7QUFDQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QixRQUFJYixPQUFPLENBQUNDLEdBQVIsQ0FBWWEsRUFBaEIsRUFBb0I7QUFFbEIsYUFBTyxLQUFLQyxJQUFMLEVBQVA7QUFDRDs7QUFDREosSUFBQUEsTUFBTSxHQUFHLE1BQU0sbUJBQVlLLFdBQVosRUFBa0JDLFdBQWxCLENBQWY7QUFDRCxHQU5LLENBQU47QUFPQUMsRUFBQUEsS0FBSyxDQUFDLGtCQUFrQjtBQUN0QixRQUFJUCxNQUFKLEVBQVk7QUFDVixZQUFNQSxNQUFNLENBQUNRLEtBQVAsRUFBTjtBQUNBUixNQUFBQSxNQUFNLEdBQUcsSUFBVDtBQUNEO0FBQ0YsR0FMSSxDQUFMO0FBTUFTLEVBQUFBLFVBQVUsQ0FBQyxrQkFBa0I7QUFDM0JSLElBQUFBLE1BQU0sR0FBRyxNQUFNLHlCQUFPO0FBQ3BCUyxNQUFBQSxRQUFRLEVBQUVKLFdBRFU7QUFFcEJLLE1BQUFBLElBQUksRUFBRU4sV0FGYztBQUdwQk8sTUFBQUEsWUFBWSxFQUFFckI7QUFITSxLQUFQLENBQWY7QUFLRCxHQU5TLENBQVY7QUFPQXNCLEVBQUFBLFNBQVMsQ0FBQyxrQkFBa0I7QUFDMUIsUUFBSVosTUFBSixFQUFZO0FBQ1YsWUFBTUEsTUFBTSxDQUFDYSxhQUFQLEVBQU47QUFDQWIsTUFBQUEsTUFBTSxHQUFHLElBQVQ7QUFDRDtBQUNGLEdBTFEsQ0FBVDtBQU9BYyxFQUFBQSxFQUFFLENBQUMsaUNBQUQsRUFBb0Msa0JBQWtCO0FBQ3RELFVBQU1kLE1BQU0sQ0FBQ2UsR0FBUCxDQUFXLG9CQUFYLENBQU47QUFDQSxVQUFNQyxNQUFNLEdBQUcsTUFBTWhCLE1BQU0sQ0FBQ2lCLENBQVAsQ0FBUyxlQUFULENBQXJCO0FBQ0EsVUFBTUQsTUFBTSxDQUFDRSxPQUFQLEdBQWlCbEMsTUFBakIsQ0FBd0JtQyxVQUF4QixDQUFtQ0MsR0FBbkMsQ0FBdUMsaUJBQXZDLENBQU47QUFDRCxHQUpDLENBQUY7QUFLRCxDQXJDTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgY2hhaUFzUHJvbWlzZWQgZnJvbSAnY2hhaS1hcy1wcm9taXNlZCc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCB7IEhPU1QsIFBPUlQsIE1PQ0hBX1RJTUVPVVQgfSBmcm9tICcuLi91dGlscyc7XG5cbmNoYWkuc2hvdWxkKCk7XG5jaGFpLnVzZShjaGFpQXNQcm9taXNlZCk7XG5cbmNvbnN0IERFVklDRV9OQU1FID0gcHJvY2Vzcy5lbnYuREVWSUNFX05BTUUgfHwgJ2VtdWxhdG9yLTU1NTQnO1xuLy8gVGhlIEZpcmVmb3ggYmluYXJ5IGNvdWxkIGJlIHJldHJpZXZlZCBmcm9tIGh0dHBzOi8vd3d3Lm1vemlsbGEub3JnL2VuLUdCL2ZpcmVmb3gvYWxsLyNwcm9kdWN0LWFuZHJvaWQtcmVsZWFzZVxuY29uc3QgQ0FQUyA9IHtcbiAgcGxhdGZvcm1OYW1lOiAnbGludXgnLFxuICAvLyBwbGF0Zm9ybU5hbWU6ICdtYWMnLFxuICB2ZXJib3NpdHk6ICd0cmFjZScsXG4gICdtb3o6ZmlyZWZveE9wdGlvbnMnOiB7XG4gICAgYW5kcm9pZERldmljZVNlcmlhbDogREVWSUNFX05BTUUsXG4gICAgYW5kcm9pZFBhY2thZ2U6ICdvcmcubW96aWxsYS5maXJlZm94JyxcbiAgfSxcbiAgYW5kcm9pZFN0b3JhZ2U6ICdpbnRlcm5hbCcsXG59O1xuXG5kZXNjcmliZSgnTW9iaWxlIEdlY2tvRHJpdmVyJywgZnVuY3Rpb24gKCkge1xuICB0aGlzLnRpbWVvdXQoTU9DSEFfVElNRU9VVCk7XG5cbiAgbGV0IHNlcnZlcjtcbiAgbGV0IGRyaXZlcjtcbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIC8vIEZpZ3VyZSBvdXQgYSB3YXkgdG8gcnVuIHRoaXMgb24gQXp1cmVcbiAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG4gICAgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoUE9SVCwgSE9TVCk7XG4gIH0pO1xuICBhZnRlcihhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlcnZlcikge1xuICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICBzZXJ2ZXIgPSBudWxsO1xuICAgIH1cbiAgfSk7XG4gIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGRyaXZlciA9IGF3YWl0IHJlbW90ZSh7XG4gICAgICBob3N0bmFtZTogSE9TVCxcbiAgICAgIHBvcnQ6IFBPUlQsXG4gICAgICBjYXBhYmlsaXRpZXM6IENBUFMsXG4gICAgfSk7XG4gIH0pO1xuICBhZnRlckVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGlmIChkcml2ZXIpIHtcbiAgICAgIGF3YWl0IGRyaXZlci5kZWxldGVTZXNzaW9uKCk7XG4gICAgICBkcml2ZXIgPSBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdGFydCBhbmQgc3RvcCBhIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgZHJpdmVyLnVybCgnaHR0cHM6Ly9hcHBpdW0uaW8vJyk7XG4gICAgY29uc3QgYnV0dG9uID0gYXdhaXQgZHJpdmVyLiQoJyNkb3dubG9hZExpbmsnKTtcbiAgICBhd2FpdCBidXR0b24uZ2V0VGV4dCgpLnNob3VsZC5ldmVudHVhbGx5LmVxbCgnRG93bmxvYWQgQXBwaXVtJyk7XG4gIH0pO1xufSk7XG5cblxuIl0sImZpbGUiOiJ0ZXN0L2Z1bmN0aW9uYWwvbW9iaWxlLWRyaXZlci1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -19,7 +19,7 @@ describe('formatCapsForServer', function () {
|
|
|
19
19
|
const result = (0, _utils.formatCapsForServer)({
|
|
20
20
|
browserName: 'yolo',
|
|
21
21
|
browserVersion: '52',
|
|
22
|
-
platformName: '
|
|
22
|
+
platformName: 'Mac'
|
|
23
23
|
});
|
|
24
24
|
result.should.eql({
|
|
25
25
|
browserName: 'firefox',
|
|
@@ -43,4 +43,4 @@ describe('formatCapsForServer', function () {
|
|
|
43
43
|
});require('source-map-support').install();
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdW5pdC91dGlscy1zcGVjcy5qcyJdLCJuYW1lcyI6WyJjaGFpIiwic2hvdWxkIiwiZGVzY3JpYmUiLCJpdCIsInJlc3VsdCIsImVxbCIsImJyb3dzZXJOYW1lIiwiYnJvd3NlclZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJiYXIiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOztBQUVBQSxjQUFLQyxNQUFMOztBQUVBQyxRQUFRLENBQUMscUJBQUQsRUFBd0IsWUFBWTtBQUMxQ0MsRUFBQUEsRUFBRSxDQUFDLDBCQUFELEVBQTZCLFlBQVk7QUFDekMsVUFBTUMsTUFBTSxHQUFHLGdDQUFvQixFQUFwQixDQUFmO0FBQ0FBLElBQUFBLE1BQU0sQ0FBQ0gsTUFBUCxDQUFjSSxHQUFkLENBQWtCLEVBQWxCO0FBQ0QsR0FIQyxDQUFGO0FBS0FGLEVBQUFBLEVBQUUsQ0FBQyw0QkFBRCxFQUErQixZQUFZO0FBQzNDLFVBQU1DLE1BQU0sR0FBRyxnQ0FBb0I7QUFDakNFLE1BQUFBLFdBQVcsRUFBRSxNQURvQjtBQUVqQ0MsTUFBQUEsY0FBYyxFQUFFLElBRmlCO0FBR2pDQyxNQUFBQSxZQUFZLEVBQUU7QUFIbUIsS0FBcEIsQ0FBZjtBQUtBSixJQUFBQSxNQUFNLENBQUNILE1BQVAsQ0FBY0ksR0FBZCxDQUFrQjtBQUNoQkMsTUFBQUEsV0FBVyxFQUFFLFNBREc7QUFFaEJDLE1BQUFBLGNBQWMsRUFBRSxJQUZBO0FBR2hCQyxNQUFBQSxZQUFZLEVBQUU7QUFIRSxLQUFsQjtBQUtELEdBWEMsQ0FBRjtBQWFBTCxFQUFBQSxFQUFFLENBQUMsK0NBQUQsRUFBa0QsWUFBWTtBQUM5RCxVQUFNQyxNQUFNLEdBQUcsZ0NBQW9CO0FBQ2pDRyxNQUFBQSxjQUFjLEVBQUUsSUFEaUI7QUFFakNFLE1BQUFBLEdBQUcsRUFBRSxJQUY0QjtBQUdqQyxpQkFBVyxNQUhzQjtBQUlqQyxxQkFBZSxLQUprQjtBQUtqQyxvQkFBYztBQUxtQixLQUFwQixDQUFmO0FBT0FMLElBQUFBLE1BQU0sQ0FBQ0gsTUFBUCxDQUFjSSxHQUFkLENBQWtCO0FBQ2hCRSxNQUFBQSxjQUFjLEVBQUUsSUFEQTtBQUVoQixpQkFBVztBQUZLLEtBQWxCO0FBSUQsR0FaQyxDQUFGO0FBYUQsQ0FoQ08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdENhcHNGb3JTZXJ2ZXIgfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XG5cbmNoYWkuc2hvdWxkKCk7XG5cbmRlc2NyaWJlKCdmb3JtYXRDYXBzRm9yU2VydmVyJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGZvcm1hdCBlbXB0eSBjYXBzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdENhcHNGb3JTZXJ2ZXIoe30pO1xuICAgIHJlc3VsdC5zaG91bGQuZXFsKHt9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhc3NpZ24gZGVmYXVsdCBjYXBzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdENhcHNGb3JTZXJ2ZXIoe1xuICAgICAgYnJvd3Nlck5hbWU6ICd5b2xvJyxcbiAgICAgIGJyb3dzZXJWZXJzaW9uOiAnNTInLFxuICAgICAgcGxhdGZvcm1OYW1lOiAnTWFjJyxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxbCh7XG4gICAgICBicm93c2VyTmFtZTogJ2ZpcmVmb3gnLFxuICAgICAgYnJvd3NlclZlcnNpb246ICc1MicsXG4gICAgICBwbGF0Zm9ybU5hbWU6ICdtYWMnLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG9ubHkgcGFzcyBjYXBzIHdpdGggc3VwcG9ydGVkIHByZWZpeGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZvcm1hdENhcHNGb3JTZXJ2ZXIoe1xuICAgICAgYnJvd3NlclZlcnNpb246ICc1MicsXG4gICAgICBiYXI6ICc2NycsXG4gICAgICAnbW96OmZvbyc6ICcxMjM0JyxcbiAgICAgICd3ZWJraXQ6eW9sbyc6ICc1NjcnLFxuICAgICAgJ2FwcGl1bTpiYXInOiAnNzg5JyxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxbCh7XG4gICAgICBicm93c2VyVmVyc2lvbjogJzUyJyxcbiAgICAgICdtb3o6Zm9vJzogJzEyMzQnLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L3VuaXQvdXRpbHMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
package/build/test/utils.js
CHANGED
package/gulpfile.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
let gulp = require('gulp');
|
|
4
|
-
let boilerplate = require('appium
|
|
4
|
+
let boilerplate = require('@appium/gulp-plugins').boilerplate.use(gulp);
|
|
5
5
|
|
|
6
6
|
boilerplate({
|
|
7
7
|
build: 'appium-geckodriver',
|
|
8
|
+
files: ['index.js', 'lib/**/*.js', 'test/**/*.js', '!gulpfile.js'],
|
|
8
9
|
coverage: {
|
|
9
10
|
files: ['./test/unit/**/*-specs.js', '!./test/functional/**'],
|
|
10
11
|
verbose: true
|
package/index.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import GeckoDriver from './lib/driver';
|
|
2
2
|
import { startServer } from './lib/server';
|
|
3
|
-
import yargs from 'yargs';
|
|
4
3
|
import { asyncify } from 'asyncbox';
|
|
5
4
|
|
|
6
5
|
const DEFAULT_HOST = 'localhost';
|
|
7
6
|
const DEFAULT_PORT = 4797;
|
|
8
7
|
|
|
9
8
|
async function main () {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const getArgValue = (argName) => {
|
|
10
|
+
const argIndex = process.argv.indexOf(argName);
|
|
11
|
+
return argIndex > 0 ? process.argv[argIndex + 1] : null;
|
|
12
|
+
};
|
|
13
|
+
const port = parseInt(getArgValue('--port'), 10) || DEFAULT_PORT;
|
|
14
|
+
const host = getArgValue('--host') || DEFAULT_HOST;
|
|
12
15
|
return await startServer(port, host);
|
|
13
16
|
}
|
|
14
17
|
|
package/lib/commands/find.js
CHANGED
package/lib/desired-caps.js
CHANGED
package/lib/driver.js
CHANGED
package/lib/gecko.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
2
|
import os from 'os';
|
|
3
3
|
import path from 'path';
|
|
4
|
-
import { JWProxy, errors } from 'appium
|
|
5
|
-
import { fs, logger, util, system } from 'appium
|
|
4
|
+
import { JWProxy, errors } from '@appium/base-driver';
|
|
5
|
+
import { fs, logger, util, system } from '@appium/support';
|
|
6
6
|
import { SubProcess } from 'teen_process';
|
|
7
7
|
import { waitForCondition } from 'asyncbox';
|
|
8
8
|
import { findAPortNotInUse } from 'portscanner';
|
|
@@ -18,6 +18,14 @@ const GECKO_SERVER_GUARD = util.getLockFileGuard(
|
|
|
18
18
|
path.resolve(os.tmpdir(), 'gecko_server_guard.lock'),
|
|
19
19
|
{timeout: 5, tryRecovery: true}
|
|
20
20
|
);
|
|
21
|
+
const DEFAULT_MARIONETTE_PORT = 2828;
|
|
22
|
+
const PROCESS_SPECIFIC_OPTION_NAMES_MAP = Object.freeze({
|
|
23
|
+
noReset: 'noReset',
|
|
24
|
+
verbosity: 'verbosity',
|
|
25
|
+
androidStorage: 'androidStorage',
|
|
26
|
+
marionettePort: 'marionettePort',
|
|
27
|
+
systemPort: 'port',
|
|
28
|
+
});
|
|
21
29
|
|
|
22
30
|
|
|
23
31
|
class GeckoProxy extends JWProxy {
|
|
@@ -33,10 +41,9 @@ class GeckoProxy extends JWProxy {
|
|
|
33
41
|
|
|
34
42
|
class GeckoDriverProcess {
|
|
35
43
|
constructor (opts = {}) {
|
|
36
|
-
for (const optName of
|
|
37
|
-
this[
|
|
44
|
+
for (const [optName, propName] of _.toPairs(PROCESS_SPECIFIC_OPTION_NAMES_MAP)) {
|
|
45
|
+
this[propName] = opts[optName];
|
|
38
46
|
}
|
|
39
|
-
this.port = opts.systemPort;
|
|
40
47
|
this.proc = null;
|
|
41
48
|
}
|
|
42
49
|
|
|
@@ -70,9 +77,8 @@ class GeckoDriverProcess {
|
|
|
70
77
|
throw new Error(`${GD_BINARY} binary cannot be found in PATH. ` +
|
|
71
78
|
`Please make sure it is present on your system`);
|
|
72
79
|
}
|
|
73
|
-
const args = [
|
|
74
|
-
|
|
75
|
-
];
|
|
80
|
+
const args = [];
|
|
81
|
+
/* #region Options */
|
|
76
82
|
switch (_.toLower(this.verbosity)) {
|
|
77
83
|
case VERBOSITY.DEBUG:
|
|
78
84
|
args.push('-v');
|
|
@@ -83,9 +89,20 @@ class GeckoDriverProcess {
|
|
|
83
89
|
}
|
|
84
90
|
if (this.noReset) {
|
|
85
91
|
args.push('--connect-existing');
|
|
92
|
+
// https://firefox-source-docs.mozilla.org/testing/geckodriver/Flags.html#code-connect-existing-code
|
|
93
|
+
if (_.isNil(this.marionettePort)) {
|
|
94
|
+
log.info(`'marionettePort' capability value is not provided while 'noReset' is enabled`);
|
|
95
|
+
log.info(`Assigning 'marionettePort' to the default value (${DEFAULT_MARIONETTE_PORT})`);
|
|
96
|
+
}
|
|
97
|
+
args.push('--marionette-port', this.marionettePort ?? DEFAULT_MARIONETTE_PORT);
|
|
98
|
+
} else if (!_.isNil(this.marionettePort)) {
|
|
99
|
+
args.push('--marionette-port', this.marionettePort);
|
|
86
100
|
}
|
|
101
|
+
/* #endregion */
|
|
102
|
+
|
|
103
|
+
args.push('-p', this.port);
|
|
87
104
|
if (this.androidStorage) {
|
|
88
|
-
args.push('
|
|
105
|
+
args.push('--android-storage', this.androidStorage);
|
|
89
106
|
}
|
|
90
107
|
this.proc = new SubProcess(driverBin, args);
|
|
91
108
|
this.proc.on('output', (stdout, stderr) => {
|
package/lib/logger.js
CHANGED
package/lib/server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import log from './logger';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
server as baseServer, routeConfiguringFunction as makeRouter
|
|
4
|
+
} from '@appium/base-driver';
|
|
3
5
|
import GeckoDriver from './driver';
|
|
4
6
|
|
|
5
7
|
async function startServer (port, address) {
|
package/lib/utils.js
CHANGED
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"seamonkey",
|
|
8
8
|
"firefox"
|
|
9
9
|
],
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "1.0.0",
|
|
11
11
|
"author": "appium",
|
|
12
12
|
"license": "Apache-2.0",
|
|
13
13
|
"repository": {
|
|
@@ -37,16 +37,15 @@
|
|
|
37
37
|
"lib": "lib"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"@appium/base-driver": "^8.2.3",
|
|
41
|
+
"@appium/support": "^2.55.3",
|
|
40
42
|
"@babel/runtime": "^7.0.0",
|
|
41
|
-
"appium-base-driver": "^7.1.0",
|
|
42
|
-
"appium-support": "^2.46.0",
|
|
43
43
|
"asyncbox": "^2.0.2",
|
|
44
44
|
"bluebird": "^3.5.1",
|
|
45
45
|
"lodash": "^4.17.4",
|
|
46
46
|
"portscanner": "2.2.0",
|
|
47
|
-
"source-map-support": "^0.
|
|
48
|
-
"teen_process": "^1.15.0"
|
|
49
|
-
"yargs": "^16.1.0"
|
|
47
|
+
"source-map-support": "^0.x",
|
|
48
|
+
"teen_process": "^1.15.0"
|
|
50
49
|
},
|
|
51
50
|
"scripts": {
|
|
52
51
|
"build": "gulp transpile",
|
|
@@ -67,14 +66,20 @@
|
|
|
67
66
|
"precommit-test"
|
|
68
67
|
],
|
|
69
68
|
"devDependencies": {
|
|
70
|
-
"appium
|
|
69
|
+
"@appium/gulp-plugins": "^6.0.0",
|
|
70
|
+
"@appium/eslint-config-appium": "^5.0.0",
|
|
71
|
+
"@babel/core": "^7.16.0",
|
|
72
|
+
"@babel/eslint-parser": "^7.16.3",
|
|
71
73
|
"chai": "^4.1.2",
|
|
72
74
|
"chai-as-promised": "^7.1.1",
|
|
73
|
-
"eslint
|
|
75
|
+
"eslint": "^7.32.0",
|
|
76
|
+
"eslint-plugin-import": "^2.25.3",
|
|
77
|
+
"eslint-plugin-mocha": "^9.0.0",
|
|
78
|
+
"eslint-plugin-promise": "^6.0.0",
|
|
74
79
|
"gulp": "^4.0.0",
|
|
75
|
-
"mocha": "^
|
|
80
|
+
"mocha": "^9.0.0",
|
|
76
81
|
"pre-commit": "^1.1.3",
|
|
77
|
-
"sinon": "^
|
|
78
|
-
"
|
|
82
|
+
"sinon": "^12.0.0",
|
|
83
|
+
"webdriverio": "^7.0.0"
|
|
79
84
|
}
|
|
80
85
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { remote } from 'webdriverio';
|
|
2
2
|
import { startServer } from '../..';
|
|
3
3
|
import chaiAsPromised from 'chai-as-promised';
|
|
4
4
|
import chai from 'chai';
|
|
@@ -27,20 +27,23 @@ describe('Desktop Gecko Driver', function () {
|
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
29
|
beforeEach(async function () {
|
|
30
|
-
driver =
|
|
31
|
-
|
|
30
|
+
driver = await remote({
|
|
31
|
+
hostname: HOST,
|
|
32
|
+
port: PORT,
|
|
33
|
+
capabilities: CAPS,
|
|
34
|
+
});
|
|
32
35
|
});
|
|
33
36
|
afterEach(async function () {
|
|
34
37
|
if (driver) {
|
|
35
|
-
await driver.
|
|
38
|
+
await driver.deleteSession();
|
|
36
39
|
driver = null;
|
|
37
40
|
}
|
|
38
41
|
});
|
|
39
42
|
|
|
40
43
|
it('should start and stop a session', async function () {
|
|
41
|
-
await driver.
|
|
42
|
-
const button = await driver
|
|
43
|
-
await button.
|
|
44
|
+
await driver.url('https://appium.io/');
|
|
45
|
+
const button = await driver.$('#downloadLink');
|
|
46
|
+
await button.getText().should.eventually.eql('Download Appium');
|
|
44
47
|
});
|
|
45
48
|
});
|
|
46
49
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { remote } from 'webdriverio';
|
|
2
2
|
import { startServer } from '../..';
|
|
3
3
|
import chaiAsPromised from 'chai-as-promised';
|
|
4
4
|
import chai from 'chai';
|
|
@@ -10,12 +10,14 @@ chai.use(chaiAsPromised);
|
|
|
10
10
|
const DEVICE_NAME = process.env.DEVICE_NAME || 'emulator-5554';
|
|
11
11
|
// The Firefox binary could be retrieved from https://www.mozilla.org/en-GB/firefox/all/#product-android-release
|
|
12
12
|
const CAPS = {
|
|
13
|
-
platformName: '
|
|
13
|
+
platformName: 'linux',
|
|
14
|
+
// platformName: 'mac',
|
|
14
15
|
verbosity: 'trace',
|
|
15
16
|
'moz:firefoxOptions': {
|
|
16
17
|
androidDeviceSerial: DEVICE_NAME,
|
|
17
18
|
androidPackage: 'org.mozilla.firefox',
|
|
18
19
|
},
|
|
20
|
+
androidStorage: 'internal',
|
|
19
21
|
};
|
|
20
22
|
|
|
21
23
|
describe('Mobile GeckoDriver', function () {
|
|
@@ -37,20 +39,23 @@ describe('Mobile GeckoDriver', function () {
|
|
|
37
39
|
}
|
|
38
40
|
});
|
|
39
41
|
beforeEach(async function () {
|
|
40
|
-
driver =
|
|
41
|
-
|
|
42
|
+
driver = await remote({
|
|
43
|
+
hostname: HOST,
|
|
44
|
+
port: PORT,
|
|
45
|
+
capabilities: CAPS,
|
|
46
|
+
});
|
|
42
47
|
});
|
|
43
48
|
afterEach(async function () {
|
|
44
49
|
if (driver) {
|
|
45
|
-
await driver.
|
|
50
|
+
await driver.deleteSession();
|
|
46
51
|
driver = null;
|
|
47
52
|
}
|
|
48
53
|
});
|
|
49
54
|
|
|
50
55
|
it('should start and stop a session', async function () {
|
|
51
|
-
await driver.
|
|
52
|
-
const button = await driver
|
|
53
|
-
await button.
|
|
56
|
+
await driver.url('https://appium.io/');
|
|
57
|
+
const button = await driver.$('#downloadLink');
|
|
58
|
+
await button.getText().should.eventually.eql('Download Appium');
|
|
54
59
|
});
|
|
55
60
|
});
|
|
56
61
|
|
package/test/unit/utils-specs.js
CHANGED