appium-android-driver 5.13.0 → 5.13.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/CHANGELOG.md +14 -0
- package/build/index.js +43 -40
- package/build/lib/android-helpers.d.ts +136 -0
- package/build/lib/android-helpers.d.ts.map +1 -0
- package/build/lib/android-helpers.js +760 -679
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.d.ts +29 -0
- package/build/lib/bootstrap.d.ts.map +1 -0
- package/build/lib/bootstrap.js +192 -179
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.d.ts +209 -0
- package/build/lib/commands/actions.d.ts.map +1 -0
- package/build/lib/commands/actions.js +327 -265
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.d.ts +10 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +12 -18
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.d.ts +314 -0
- package/build/lib/commands/app-management.d.ts.map +1 -0
- package/build/lib/commands/app-management.js +278 -110
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.d.ts +94 -0
- package/build/lib/commands/context.d.ts.map +1 -0
- package/build/lib/commands/context.js +412 -260
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.d.ts +5 -0
- package/build/lib/commands/coverage.d.ts.map +1 -0
- package/build/lib/commands/coverage.js +14 -17
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.d.ts +36 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +97 -127
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.d.ts +49 -0
- package/build/lib/commands/emu-console.d.ts.map +1 -0
- package/build/lib/commands/emu-console.js +36 -25
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.d.ts +6 -0
- package/build/lib/commands/execute.d.ts.map +1 -0
- package/build/lib/commands/execute.js +68 -69
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.d.ts +129 -0
- package/build/lib/commands/file-actions.d.ts.map +1 -0
- package/build/lib/commands/file-actions.js +321 -178
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.d.ts +13 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +69 -51
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.d.ts +133 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +275 -216
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.d.ts +11 -0
- package/build/lib/commands/ime.d.ts.map +1 -0
- package/build/lib/commands/ime.js +27 -33
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.d.ts +3 -0
- package/build/lib/commands/index.d.ts.map +1 -0
- package/build/lib/commands/index.js +32 -35
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.d.ts +418 -0
- package/build/lib/commands/intent.d.ts.map +1 -0
- package/build/lib/commands/intent.js +281 -151
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.d.ts +6 -0
- package/build/lib/commands/keyboard.d.ts.map +1 -0
- package/build/lib/commands/keyboard.js +6 -14
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.d.ts +45 -0
- package/build/lib/commands/log.d.ts.map +1 -0
- package/build/lib/commands/log.js +117 -103
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.d.ts +144 -0
- package/build/lib/commands/media-projection.d.ts.map +1 -0
- package/build/lib/commands/media-projection.js +228 -171
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.d.ts +139 -0
- package/build/lib/commands/network.d.ts.map +1 -0
- package/build/lib/commands/network.js +249 -181
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.d.ts +101 -0
- package/build/lib/commands/performance.d.ts.map +1 -0
- package/build/lib/commands/performance.js +390 -236
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.d.ts +93 -0
- package/build/lib/commands/permissions.d.ts.map +1 -0
- package/build/lib/commands/permissions.js +133 -93
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.d.ts +194 -0
- package/build/lib/commands/recordscreen.d.ts.map +1 -0
- package/build/lib/commands/recordscreen.js +293 -224
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.d.ts +8 -0
- package/build/lib/commands/shell.d.ts.map +1 -0
- package/build/lib/commands/shell.js +38 -43
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.d.ts +104 -0
- package/build/lib/commands/streamscreen.d.ts.map +1 -0
- package/build/lib/commands/streamscreen.js +364 -305
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.d.ts +100 -0
- package/build/lib/commands/system-bars.d.ts.map +1 -0
- package/build/lib/commands/system-bars.js +148 -90
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.d.ts +30 -0
- package/build/lib/commands/touch.d.ts.map +1 -0
- package/build/lib/commands/touch.js +311 -287
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.d.ts +353 -0
- package/build/lib/desired-caps.d.ts.map +1 -0
- package/build/lib/desired-caps.js +291 -292
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.d.ts +430 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +449 -384
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -11
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.d.ts +389 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +220 -394
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/stubs.d.ts +8 -0
- package/build/lib/stubs.d.ts.map +1 -0
- package/build/lib/stubs.js +5 -0
- package/build/lib/stubs.js.map +1 -0
- package/build/lib/uiautomator.d.ts +24 -0
- package/build/lib/uiautomator.d.ts.map +1 -0
- package/build/lib/uiautomator.js +86 -82
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.d.ts +38 -0
- package/build/lib/unlock-helpers.d.ts.map +1 -0
- package/build/lib/unlock-helpers.js +228 -204
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.d.ts +11 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +23 -18
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.d.ts +223 -0
- package/build/lib/webview-helpers.d.ts.map +1 -0
- package/build/lib/webview-helpers.js +476 -298
- package/build/lib/webview-helpers.js.map +1 -1
- package/index.js +3 -1
- package/lib/android-helpers.js +2 -1
- package/lib/stubs.ts +8 -0
- package/lib/unlock-helpers.js +2 -2
- package/package.json +23 -14
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export default extensions;
|
|
2
|
+
export namespace commands {
|
|
3
|
+
/**
|
|
4
|
+
* Starts Android logcat broadcast websocket on the same host and port
|
|
5
|
+
* where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method
|
|
6
|
+
* will return immediately if the web socket is already listening.
|
|
7
|
+
*
|
|
8
|
+
* Each connected websocket listener will receive logcat log lines
|
|
9
|
+
* as soon as they are visible to Appium.
|
|
10
|
+
*/
|
|
11
|
+
function mobileStartLogsBroadcast(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Stops the previously started logcat broadcasting wesocket server.
|
|
14
|
+
* This method will return immediately if no server is running.
|
|
15
|
+
*/
|
|
16
|
+
function mobileStopLogsBroadcast(): Promise<void>;
|
|
17
|
+
function getLogTypes(): Promise<any>;
|
|
18
|
+
function getLog(logType: any): Promise<any>;
|
|
19
|
+
}
|
|
20
|
+
export let helpers: {};
|
|
21
|
+
declare namespace extensions {
|
|
22
|
+
namespace supportedLogTypes {
|
|
23
|
+
namespace logcat {
|
|
24
|
+
const description: string;
|
|
25
|
+
function getter(self: any): Promise<any>;
|
|
26
|
+
}
|
|
27
|
+
namespace bugreport {
|
|
28
|
+
const description_1: string;
|
|
29
|
+
export { description_1 as description };
|
|
30
|
+
export function getter_1(self: any): Promise<any>;
|
|
31
|
+
export { getter_1 as getter };
|
|
32
|
+
}
|
|
33
|
+
namespace server {
|
|
34
|
+
const description_2: string;
|
|
35
|
+
export { description_2 as description };
|
|
36
|
+
export function getter_2(self: any): {
|
|
37
|
+
timestamp: any;
|
|
38
|
+
level: any;
|
|
39
|
+
message: any;
|
|
40
|
+
}[];
|
|
41
|
+
export { getter_2 as getter };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../../lib/commands/log.js"],"names":[],"mappings":";;IAiDA;;;;;;;OAOG;IACH,mDAmDC;IAED;;;OAGG;IACH,kDASC;IAED,qCAOC;IAED,4CAKC;;AAnIkB,uBAAY;;;;;YAgBnB,yCAA8C;;;;;YAI9C,kDAKP;;;;;;YAIO;;;;gBAQP"}
|
|
@@ -1,122 +1,136 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _ws = _interopRequireDefault(require("ws"));
|
|
13
|
-
var _driver = require("appium/driver");
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.helpers = exports.commands = void 0;
|
|
7
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
+
const ws_1 = __importDefault(require("ws"));
|
|
11
|
+
const driver_1 = require("appium/driver");
|
|
14
12
|
const GET_SERVER_LOGS_FEATURE = 'get_server_logs';
|
|
15
|
-
let commands = {},
|
|
16
|
-
helpers = {},
|
|
17
|
-
extensions = {};
|
|
18
|
-
exports.helpers = helpers;
|
|
13
|
+
let commands = {}, helpers = {}, extensions = {};
|
|
19
14
|
exports.commands = commands;
|
|
20
|
-
|
|
15
|
+
exports.helpers = helpers;
|
|
16
|
+
const WEBSOCKET_ENDPOINT = (sessionId) => `${driver_1.DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;
|
|
17
|
+
// https://github.com/SeleniumHQ/selenium/blob/0d425676b3c9df261dd641917f867d4d5ce7774d/java/client/src/org/openqa/selenium/logging/LogEntry.java
|
|
21
18
|
function toLogRecord(timestamp, level, message) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
return {
|
|
20
|
+
timestamp,
|
|
21
|
+
level,
|
|
22
|
+
message,
|
|
23
|
+
};
|
|
27
24
|
}
|
|
28
25
|
extensions.supportedLogTypes = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
26
|
+
logcat: {
|
|
27
|
+
description: 'Logs for Android applications on real device and emulators via ADB',
|
|
28
|
+
getter: async (self) => await self.adb.getLogcatLogs(),
|
|
29
|
+
},
|
|
30
|
+
bugreport: {
|
|
31
|
+
description: `'adb bugreport' output for advanced issues diagnostic`,
|
|
32
|
+
getter: async (self) => {
|
|
33
|
+
const output = await self.adb.bugreport();
|
|
34
|
+
const timestamp = Date.now();
|
|
35
|
+
return output.split(os_1.default.EOL)
|
|
36
|
+
.map((x) => toLogRecord(timestamp, 'ALL', x));
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
server: {
|
|
40
|
+
description: 'Appium server logs',
|
|
41
|
+
getter: (self) => {
|
|
42
|
+
self.ensureFeatureEnabled(GET_SERVER_LOGS_FEATURE);
|
|
43
|
+
const timestamp = Date.now();
|
|
44
|
+
return logger_1.default.unwrap().record
|
|
45
|
+
.map((x) => toLogRecord(timestamp, 'ALL', lodash_1.default.isEmpty(x.prefix) ? x.message : `[${x.prefix}] ${x.message}`));
|
|
46
|
+
},
|
|
47
|
+
},
|
|
49
48
|
};
|
|
49
|
+
/**
|
|
50
|
+
* Starts Android logcat broadcast websocket on the same host and port
|
|
51
|
+
* where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method
|
|
52
|
+
* will return immediately if the web socket is already listening.
|
|
53
|
+
*
|
|
54
|
+
* Each connected websocket listener will receive logcat log lines
|
|
55
|
+
* as soon as they are visible to Appium.
|
|
56
|
+
*/
|
|
50
57
|
commands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
_logger.default.info(`Starting logcat broadcasting on web socket server ` + `${JSON.stringify(this.server.address())} to ${pathname}`);
|
|
57
|
-
const wss = new _ws.default.Server({
|
|
58
|
-
noServer: true
|
|
59
|
-
});
|
|
60
|
-
wss.on('connection', (ws, req) => {
|
|
61
|
-
if (req) {
|
|
62
|
-
var _req$connection;
|
|
63
|
-
const remoteIp = _lodash.default.isEmpty(req.headers['x-forwarded-for']) ? (_req$connection = req.connection) === null || _req$connection === void 0 ? void 0 : _req$connection.remoteAddress : req.headers['x-forwarded-for'];
|
|
64
|
-
_logger.default.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);
|
|
65
|
-
} else {
|
|
66
|
-
_logger.default.debug('Established a new logcat listener web socket connection');
|
|
58
|
+
const pathname = WEBSOCKET_ENDPOINT(this.sessionId);
|
|
59
|
+
if (!lodash_1.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) {
|
|
60
|
+
logger_1.default.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);
|
|
61
|
+
return;
|
|
67
62
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
63
|
+
logger_1.default.info(`Starting logcat broadcasting on web socket server ` +
|
|
64
|
+
`${JSON.stringify(this.server.address())} to ${pathname}`);
|
|
65
|
+
// https://github.com/websockets/ws/blob/master/doc/ws.md
|
|
66
|
+
const wss = new ws_1.default.Server({
|
|
67
|
+
noServer: true,
|
|
68
|
+
});
|
|
69
|
+
wss.on('connection', (ws, req) => {
|
|
70
|
+
if (req) {
|
|
71
|
+
const remoteIp = lodash_1.default.isEmpty(req.headers['x-forwarded-for'])
|
|
72
|
+
? req.connection?.remoteAddress
|
|
73
|
+
: req.headers['x-forwarded-for'];
|
|
74
|
+
logger_1.default.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);
|
|
72
75
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
76
|
+
else {
|
|
77
|
+
logger_1.default.debug('Established a new logcat listener web socket connection');
|
|
78
|
+
}
|
|
79
|
+
if (lodash_1.default.isEmpty(this._logcatWebsocketListener)) {
|
|
80
|
+
this._logcatWebsocketListener = (logRecord) => {
|
|
81
|
+
if (ws?.readyState === ws_1.default.OPEN) {
|
|
82
|
+
ws.send(logRecord.message);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
this.adb.setLogcatListener(this._logcatWebsocketListener);
|
|
87
|
+
ws.on('close', (code, reason) => {
|
|
88
|
+
if (!lodash_1.default.isEmpty(this._logcatWebsocketListener)) {
|
|
89
|
+
try {
|
|
90
|
+
this.adb.removeLogcatListener(this._logcatWebsocketListener);
|
|
91
|
+
}
|
|
92
|
+
catch (ign) { }
|
|
93
|
+
this._logcatWebsocketListener = null;
|
|
94
|
+
}
|
|
95
|
+
let closeMsg = 'Logcat listener web socket is closed.';
|
|
96
|
+
if (!lodash_1.default.isEmpty(code)) {
|
|
97
|
+
closeMsg += ` Code: ${code}.`;
|
|
98
|
+
}
|
|
99
|
+
if (!lodash_1.default.isEmpty(reason)) {
|
|
100
|
+
closeMsg += ` Reason: ${reason.toString()}.`;
|
|
101
|
+
}
|
|
102
|
+
logger_1.default.debug(closeMsg);
|
|
103
|
+
});
|
|
91
104
|
});
|
|
92
|
-
|
|
93
|
-
await this.server.addWebSocketHandler(pathname, wss);
|
|
105
|
+
await this.server.addWebSocketHandler(pathname, wss);
|
|
94
106
|
};
|
|
107
|
+
/**
|
|
108
|
+
* Stops the previously started logcat broadcasting wesocket server.
|
|
109
|
+
* This method will return immediately if no server is running.
|
|
110
|
+
*/
|
|
95
111
|
commands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast() {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
112
|
+
const pathname = WEBSOCKET_ENDPOINT(this.sessionId);
|
|
113
|
+
if (lodash_1.default.isEmpty(await this.server.getWebSocketHandlers(pathname))) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
logger_1.default.debug(`Stopping logcat broadcasting on web socket server ` +
|
|
117
|
+
`${JSON.stringify(this.server.address())} to ${pathname}`);
|
|
118
|
+
await this.server.removeWebSocketHandler(pathname);
|
|
102
119
|
};
|
|
103
120
|
commands.getLogTypes = async function getLogTypes() {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
121
|
+
const nativeLogTypes = await driver_1.BaseDriver.prototype.getLogTypes.call(this);
|
|
122
|
+
if (this.isWebContext()) {
|
|
123
|
+
const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');
|
|
124
|
+
return [...nativeLogTypes, ...webLogTypes];
|
|
125
|
+
}
|
|
126
|
+
return nativeLogTypes;
|
|
110
127
|
};
|
|
111
128
|
commands.getLog = async function getLog(logType) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
return await _driver.BaseDriver.prototype.getLog.call(this, logType);
|
|
129
|
+
if (this.isWebContext() && !lodash_1.default.keys(this.supportedLogTypes).includes(logType)) {
|
|
130
|
+
return await this.chromedriver.jwproxy.command('/log', 'POST', { type: logType });
|
|
131
|
+
}
|
|
132
|
+
return await driver_1.BaseDriver.prototype.getLog.call(this, logType);
|
|
118
133
|
};
|
|
119
134
|
Object.assign(extensions, commands, helpers);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfb3MiLCJfbG9kYXNoIiwiX3dzIiwiX2RyaXZlciIsIkdFVF9TRVJWRVJfTE9HU19GRUFUVVJFIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJXRUJTT0NLRVRfRU5EUE9JTlQiLCJzZXNzaW9uSWQiLCJERUZBVUxUX1dTX1BBVEhOQU1FX1BSRUZJWCIsInRvTG9nUmVjb3JkIiwidGltZXN0YW1wIiwibGV2ZWwiLCJtZXNzYWdlIiwic3VwcG9ydGVkTG9nVHlwZXMiLCJsb2djYXQiLCJkZXNjcmlwdGlvbiIsImdldHRlciIsInNlbGYiLCJhZGIiLCJnZXRMb2djYXRMb2dzIiwiYnVncmVwb3J0Iiwib3V0cHV0IiwiRGF0ZSIsIm5vdyIsInNwbGl0Iiwib3MiLCJFT0wiLCJtYXAiLCJ4Iiwic2VydmVyIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJsb2ciLCJ1bndyYXAiLCJyZWNvcmQiLCJfIiwiaXNFbXB0eSIsInByZWZpeCIsIm1vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCIsInBhdGhuYW1lIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJkZWJ1ZyIsImluZm8iLCJKU09OIiwic3RyaW5naWZ5IiwiYWRkcmVzcyIsIndzcyIsIldlYlNvY2tldCIsIlNlcnZlciIsIm5vU2VydmVyIiwib24iLCJ3cyIsInJlcSIsIl9yZXEkY29ubmVjdGlvbiIsInJlbW90ZUlwIiwiaGVhZGVycyIsImNvbm5lY3Rpb24iLCJyZW1vdGVBZGRyZXNzIiwiX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyIiwibG9nUmVjb3JkIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJzZW5kIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJjb2RlIiwicmVhc29uIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJpZ24iLCJjbG9zZU1zZyIsInRvU3RyaW5nIiwiYWRkV2ViU29ja2V0SGFuZGxlciIsIm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0IiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsImdldExvZ1R5cGVzIiwibmF0aXZlTG9nVHlwZXMiLCJCYXNlRHJpdmVyIiwicHJvdG90eXBlIiwiY2FsbCIsImlzV2ViQ29udGV4dCIsIndlYkxvZ1R5cGVzIiwiY2hyb21lZHJpdmVyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRMb2ciLCJsb2dUeXBlIiwia2V5cyIsImluY2x1ZGVzIiwidHlwZSIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9sb2cuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IERFRkFVTFRfV1NfUEFUSE5BTUVfUFJFRklYLCBCYXNlRHJpdmVyIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEdFVF9TRVJWRVJfTE9HU19GRUFUVVJFID0gJ2dldF9zZXJ2ZXJfbG9ncyc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29uc3QgV0VCU09DS0VUX0VORFBPSU5UID0gKHNlc3Npb25JZCkgPT4gYCR7REVGQVVMVF9XU19QQVRITkFNRV9QUkVGSVh9L3Nlc3Npb24vJHtzZXNzaW9uSWR9L2FwcGl1bS9kZXZpY2UvbG9nY2F0YDtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbGVuaXVtSFEvc2VsZW5pdW0vYmxvYi8wZDQyNTY3NmIzYzlkZjI2MWRkNjQxOTE3Zjg2N2Q0ZDVjZTc3NzRkL2phdmEvY2xpZW50L3NyYy9vcmcvb3BlbnFhL3NlbGVuaXVtL2xvZ2dpbmcvTG9nRW50cnkuamF2YVxuZnVuY3Rpb24gdG9Mb2dSZWNvcmQgKHRpbWVzdGFtcCwgbGV2ZWwsIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXAsXG4gICAgbGV2ZWwsXG4gICAgbWVzc2FnZSxcbiAgfTtcbn1cblxuZXh0ZW5zaW9ucy5zdXBwb3J0ZWRMb2dUeXBlcyA9IHtcbiAgbG9nY2F0OiB7XG4gICAgZGVzY3JpcHRpb246ICdMb2dzIGZvciBBbmRyb2lkIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZSBhbmQgZW11bGF0b3JzIHZpYSBBREInLFxuICAgIGdldHRlcjogYXN5bmMgKHNlbGYpID0+IGF3YWl0IHNlbGYuYWRiLmdldExvZ2NhdExvZ3MoKSxcbiAgfSxcbiAgYnVncmVwb3J0OiB7XG4gICAgZGVzY3JpcHRpb246IGAnYWRiIGJ1Z3JlcG9ydCcgb3V0cHV0IGZvciBhZHZhbmNlZCBpc3N1ZXMgZGlhZ25vc3RpY2AsXG4gICAgZ2V0dGVyOiBhc3luYyAoc2VsZikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2VsZi5hZGIuYnVncmVwb3J0KCk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgcmV0dXJuIG91dHB1dC5zcGxpdChvcy5FT0wpXG4gICAgICAgIC5tYXAoKHgpID0+IHRvTG9nUmVjb3JkKHRpbWVzdGFtcCwgJ0FMTCcsIHgpKTtcbiAgICB9LFxuICB9LFxuICBzZXJ2ZXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FwcGl1bSBzZXJ2ZXIgbG9ncycsXG4gICAgZ2V0dGVyOiAoc2VsZikgPT4ge1xuICAgICAgc2VsZi5lbnN1cmVGZWF0dXJlRW5hYmxlZChHRVRfU0VSVkVSX0xPR1NfRkVBVFVSRSk7XG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgcmV0dXJuIGxvZy51bndyYXAoKS5yZWNvcmRcbiAgICAgICAgLm1hcCgoeCkgPT4gdG9Mb2dSZWNvcmQodGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUxMJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5pc0VtcHR5KHgucHJlZml4KSA/IHgubWVzc2FnZSA6IGBbJHt4LnByZWZpeH1dICR7eC5tZXNzYWdlfWApXG4gICAgICAgICk7XG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogU3RhcnRzIEFuZHJvaWQgbG9nY2F0IGJyb2FkY2FzdCB3ZWJzb2NrZXQgb24gdGhlIHNhbWUgaG9zdCBhbmQgcG9ydFxuICogd2hlcmUgQXBwaXVtIHNlcnZlciBpcyBydW5uaW5nIGF0IGAvd3Mvc2Vzc2lvbi86c2Vzc2lvbklkOi9hcHBpdW0vbG9nY2F0YCBlbmRwb2ludC4gVGhlIG1ldGhvZFxuICogd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHdlYiBzb2NrZXQgaXMgYWxyZWFkeSBsaXN0ZW5pbmcuXG4gKlxuICogRWFjaCBjb25uZWN0ZWQgd2Vic29ja2V0IGxpc3RlbmVyIHdpbGwgcmVjZWl2ZSBsb2djYXQgbG9nIGxpbmVzXG4gKiBhcyBzb29uIGFzIHRoZXkgYXJlIHZpc2libGUgdG8gQXBwaXVtLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmICghXy5pc0VtcHR5KGF3YWl0IHRoaXMuc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHBhdGhuYW1lKSkpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBsb2djYXQgYnJvYWRjYXN0aW5nIHdlYiBzb2NrZXQgc2VydmVyIGlzIGFscmVhZHkgbGlzdGVuaW5nIGF0ICR7cGF0aG5hbWV9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nLmluZm8oYFN0YXJ0aW5nIGxvZ2NhdCBicm9hZGNhc3Rpbmcgb24gd2ViIHNvY2tldCBzZXJ2ZXIgYCArXG4gICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2ZXIuYWRkcmVzcygpKX0gdG8gJHtwYXRobmFtZX1gKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kXG4gIGNvbnN0IHdzcyA9IG5ldyBXZWJTb2NrZXQuU2VydmVyKHtcbiAgICBub1NlcnZlcjogdHJ1ZSxcbiAgfSk7XG4gIHdzcy5vbignY29ubmVjdGlvbicsICh3cywgcmVxKSA9PiB7XG4gICAgaWYgKHJlcSkge1xuICAgICAgY29uc3QgcmVtb3RlSXAgPSBfLmlzRW1wdHkocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddKVxuICAgICAgICA/IHJlcS5jb25uZWN0aW9uPy5yZW1vdGVBZGRyZXNzXG4gICAgICAgIDogcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddO1xuICAgICAgbG9nLmRlYnVnKGBFc3RhYmxpc2hlZCBhIG5ldyBsb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uIGZyb20gJHtyZW1vdGVJcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdFc3RhYmxpc2hlZCBhIG5ldyBsb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBjb25uZWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lcikpIHtcbiAgICAgIHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyID0gKGxvZ1JlY29yZCkgPT4ge1xuICAgICAgICBpZiAod3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgd3Muc2VuZChsb2dSZWNvcmQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuYWRiLnNldExvZ2NhdExpc3RlbmVyKHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKTtcblxuICAgIHdzLm9uKCdjbG9zZScsIChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuYWRiLnJlbW92ZUxvZ2NhdExpc3RlbmVyKHRoaXMuX2xvZ2NhdFdlYnNvY2tldExpc3RlbmVyKTtcbiAgICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgICB0aGlzLl9sb2djYXRXZWJzb2NrZXRMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGxldCBjbG9zZU1zZyA9ICdMb2djYXQgbGlzdGVuZXIgd2ViIHNvY2tldCBpcyBjbG9zZWQuJztcbiAgICAgIGlmICghXy5pc0VtcHR5KGNvZGUpKSB7XG4gICAgICAgIGNsb3NlTXNnICs9IGAgQ29kZTogJHtjb2RlfS5gO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkocmVhc29uKSkge1xuICAgICAgICBjbG9zZU1zZyArPSBgIFJlYXNvbjogJHtyZWFzb24udG9TdHJpbmcoKX0uYDtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhjbG9zZU1zZyk7XG4gICAgfSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLnNlcnZlci5hZGRXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lLCB3c3MpO1xufTtcblxuLyoqXG4gKiBTdG9wcyB0aGUgcHJldmlvdXNseSBzdGFydGVkIGxvZ2NhdCBicm9hZGNhc3Rpbmcgd2Vzb2NrZXQgc2VydmVyLlxuICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgbm8gc2VydmVyIGlzIHJ1bm5pbmcuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BMb2dzQnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QgKCkge1xuICBjb25zdCBwYXRobmFtZSA9IFdFQlNPQ0tFVF9FTkRQT0lOVCh0aGlzLnNlc3Npb25JZCk7XG4gIGlmIChfLmlzRW1wdHkoYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMocGF0aG5hbWUpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgU3RvcHBpbmcgbG9nY2F0IGJyb2FkY2FzdGluZyBvbiB3ZWIgc29ja2V0IHNlcnZlciBgICtcbiAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnNlcnZlci5hZGRyZXNzKCkpfSB0byAke3BhdGhuYW1lfWApO1xuICBhd2FpdCB0aGlzLnNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbn07XG5cbmNvbW1hbmRzLmdldExvZ1R5cGVzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9nVHlwZXMgKCkge1xuICBjb25zdCBuYXRpdmVMb2dUeXBlcyA9IGF3YWl0IEJhc2VEcml2ZXIucHJvdG90eXBlLmdldExvZ1R5cGVzLmNhbGwodGhpcyk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3Qgd2ViTG9nVHlwZXMgPSBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoJy9sb2cvdHlwZXMnLCAnR0VUJyk7XG4gICAgcmV0dXJuIFsuLi5uYXRpdmVMb2dUeXBlcywgLi4ud2ViTG9nVHlwZXNdO1xuICB9XG4gIHJldHVybiBuYXRpdmVMb2dUeXBlcztcbn07XG5cbmNvbW1hbmRzLmdldExvZyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvZyAobG9nVHlwZSkge1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSAmJiAhXy5rZXlzKHRoaXMuc3VwcG9ydGVkTG9nVHlwZXMpLmluY2x1ZGVzKGxvZ1R5cGUpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZCgnL2xvZycsICdQT1NUJywge3R5cGU6IGxvZ1R5cGV9KTtcbiAgfVxuICByZXR1cm4gYXdhaXQgQmFzZURyaXZlci5wcm90b3R5cGUuZ2V0TG9nLmNhbGwodGhpcywgbG9nVHlwZSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLEdBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUVBLE1BQU1LLHVCQUF1QixHQUFHLGlCQUFpQjtBQUVqRCxJQUFJQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqRCxNQUFNSSxrQkFBa0IsR0FBSUMsU0FBUyxJQUFNLEdBQUVDLGtDQUEyQixZQUFXRCxTQUFVLHVCQUFzQjtBQUduSCxTQUFTRSxXQUFXQSxDQUFFQyxTQUFTLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxFQUFFO0VBQy9DLE9BQU87SUFDTEYsU0FBUztJQUNUQyxLQUFLO0lBQ0xDO0VBQ0YsQ0FBQztBQUNIO0FBRUFSLFVBQVUsQ0FBQ1MsaUJBQWlCLEdBQUc7RUFDN0JDLE1BQU0sRUFBRTtJQUNOQyxXQUFXLEVBQUUsb0VBQW9FO0lBQ2pGQyxNQUFNLEVBQUUsTUFBT0MsSUFBSSxJQUFLLE1BQU1BLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxhQUFhLENBQUM7RUFDdkQsQ0FBQztFQUNEQyxTQUFTLEVBQUU7SUFDVEwsV0FBVyxFQUFHLHVEQUFzRDtJQUNwRUMsTUFBTSxFQUFFLE1BQU9DLElBQUksSUFBSztNQUN0QixNQUFNSSxNQUFNLEdBQUcs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
|
|
135
|
+
exports.default = extensions;
|
|
136
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","names":["_logger","_interopRequireDefault","require","_os","_lodash","_ws","_driver","GET_SERVER_LOGS_FEATURE","commands","helpers","extensions","exports","WEBSOCKET_ENDPOINT","sessionId","DEFAULT_WS_PATHNAME_PREFIX","toLogRecord","timestamp","level","message","supportedLogTypes","logcat","description","getter","self","adb","getLogcatLogs","bugreport","output","Date","now","split","os","EOL","map","x","server","ensureFeatureEnabled","log","unwrap","record","_","isEmpty","prefix","mobileStartLogsBroadcast","pathname","getWebSocketHandlers","debug","info","JSON","stringify","address","wss","WebSocket","Server","noServer","on","ws","req","_req$connection","remoteIp","headers","connection","remoteAddress","_logcatWebsocketListener","logRecord","readyState","OPEN","send","setLogcatListener","code","reason","removeLogcatListener","ign","closeMsg","toString","addWebSocketHandler","mobileStopLogsBroadcast","removeWebSocketHandler","getLogTypes","nativeLogTypes","BaseDriver","prototype","call","isWebContext","webLogTypes","chromedriver","jwproxy","command","getLog","logType","keys","includes","type","Object","assign","_default","default"],"sources":["../../../lib/commands/log.js"],"sourcesContent":["import log from '../logger';\nimport os from 'os';\nimport _ from 'lodash';\nimport WebSocket from 'ws';\nimport { DEFAULT_WS_PATHNAME_PREFIX, BaseDriver } from 'appium/driver';\n\nconst GET_SERVER_LOGS_FEATURE = 'get_server_logs';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst WEBSOCKET_ENDPOINT = (sessionId) => `${DEFAULT_WS_PATHNAME_PREFIX}/session/${sessionId}/appium/device/logcat`;\n\n// https://github.com/SeleniumHQ/selenium/blob/0d425676b3c9df261dd641917f867d4d5ce7774d/java/client/src/org/openqa/selenium/logging/LogEntry.java\nfunction toLogRecord (timestamp, level, message) {\n return {\n timestamp,\n level,\n message,\n };\n}\n\nextensions.supportedLogTypes = {\n logcat: {\n description: 'Logs for Android applications on real device and emulators via ADB',\n getter: async (self) => await self.adb.getLogcatLogs(),\n },\n bugreport: {\n description: `'adb bugreport' output for advanced issues diagnostic`,\n getter: async (self) => {\n const output = await self.adb.bugreport();\n const timestamp = Date.now();\n return output.split(os.EOL)\n .map((x) => toLogRecord(timestamp, 'ALL', x));\n },\n },\n server: {\n description: 'Appium server logs',\n getter: (self) => {\n self.ensureFeatureEnabled(GET_SERVER_LOGS_FEATURE);\n const timestamp = Date.now();\n return log.unwrap().record\n .map((x) => toLogRecord(timestamp,\n 'ALL',\n _.isEmpty(x.prefix) ? x.message : `[${x.prefix}] ${x.message}`)\n );\n },\n },\n};\n\n/**\n * Starts Android logcat broadcast websocket on the same host and port\n * where Appium server is running at `/ws/session/:sessionId:/appium/logcat` endpoint. The method\n * will return immediately if the web socket is already listening.\n *\n * Each connected websocket listener will receive logcat log lines\n * as soon as they are visible to Appium.\n */\ncommands.mobileStartLogsBroadcast = async function mobileStartLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (!_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n log.debug(`The logcat broadcasting web socket server is already listening at ${pathname}`);\n return;\n }\n\n log.info(`Starting logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n // https://github.com/websockets/ws/blob/master/doc/ws.md\n const wss = new WebSocket.Server({\n noServer: true,\n });\n wss.on('connection', (ws, req) => {\n if (req) {\n const remoteIp = _.isEmpty(req.headers['x-forwarded-for'])\n ? req.connection?.remoteAddress\n : req.headers['x-forwarded-for'];\n log.debug(`Established a new logcat listener web socket connection from ${remoteIp}`);\n } else {\n log.debug('Established a new logcat listener web socket connection');\n }\n\n if (_.isEmpty(this._logcatWebsocketListener)) {\n this._logcatWebsocketListener = (logRecord) => {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(logRecord.message);\n }\n };\n }\n this.adb.setLogcatListener(this._logcatWebsocketListener);\n\n ws.on('close', (code, reason) => {\n if (!_.isEmpty(this._logcatWebsocketListener)) {\n try {\n this.adb.removeLogcatListener(this._logcatWebsocketListener);\n } catch (ign) {}\n this._logcatWebsocketListener = null;\n }\n\n let closeMsg = 'Logcat listener web socket is closed.';\n if (!_.isEmpty(code)) {\n closeMsg += ` Code: ${code}.`;\n }\n if (!_.isEmpty(reason)) {\n closeMsg += ` Reason: ${reason.toString()}.`;\n }\n log.debug(closeMsg);\n });\n });\n await this.server.addWebSocketHandler(pathname, wss);\n};\n\n/**\n * Stops the previously started logcat broadcasting wesocket server.\n * This method will return immediately if no server is running.\n */\ncommands.mobileStopLogsBroadcast = async function mobileStopLogsBroadcast () {\n const pathname = WEBSOCKET_ENDPOINT(this.sessionId);\n if (_.isEmpty(await this.server.getWebSocketHandlers(pathname))) {\n return;\n }\n\n log.debug(`Stopping logcat broadcasting on web socket server ` +\n `${JSON.stringify(this.server.address())} to ${pathname}`);\n await this.server.removeWebSocketHandler(pathname);\n};\n\ncommands.getLogTypes = async function getLogTypes () {\n const nativeLogTypes = await BaseDriver.prototype.getLogTypes.call(this);\n if (this.isWebContext()) {\n const webLogTypes = await this.chromedriver.jwproxy.command('/log/types', 'GET');\n return [...nativeLogTypes, ...webLogTypes];\n }\n return nativeLogTypes;\n};\n\ncommands.getLog = async function getLog (logType) {\n if (this.isWebContext() && !_.keys(this.supportedLogTypes).includes(logType)) {\n return await this.chromedriver.jwproxy.command('/log', 'POST', {type: logType});\n }\n return await BaseDriver.prototype.getLog.call(this, logType);\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../lib/commands/log.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export default commands;
|
|
2
|
+
export type StartRecordingOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Maximum supported resolution on-device (Detected
|
|
5
|
+
* automatically by the app itself), which usually equals to Full HD 1920x1080 on most
|
|
6
|
+
* phones however you can change it to following supported resolutions
|
|
7
|
+
* as well: "1920x1080", "1280x720", "720x480", "320x240", "176x144".
|
|
8
|
+
*/
|
|
9
|
+
resolution: string | null;
|
|
10
|
+
/**
|
|
11
|
+
* [900] Default value: 900 seconds which means
|
|
12
|
+
* maximum allowed duration is 15 minute, you can increase it if your test takes
|
|
13
|
+
* longer than that.
|
|
14
|
+
*/
|
|
15
|
+
maxDurationSec: number | null;
|
|
16
|
+
/**
|
|
17
|
+
* [high] Means recording thread priority is maximum
|
|
18
|
+
* however if you face performance drops during testing with recording enabled, you
|
|
19
|
+
* can reduce recording priority to "normal" or "low".
|
|
20
|
+
*/
|
|
21
|
+
priority: string | null;
|
|
22
|
+
/**
|
|
23
|
+
* You can type recording video file name as you want,
|
|
24
|
+
* but recording currently supports only "mp4" format so your filename must end with ".mp4".
|
|
25
|
+
* An invalid file name will fail to start the recording.
|
|
26
|
+
* If not provided then the current timestamp will be used as file name.
|
|
27
|
+
*/
|
|
28
|
+
filename: string | null;
|
|
29
|
+
};
|
|
30
|
+
export type StopRecordingOptions = {
|
|
31
|
+
/**
|
|
32
|
+
* The path to the remote location, where the resulting video should be uploaded.
|
|
33
|
+
* The following protocols are supported: http/https, ftp.
|
|
34
|
+
* Null or empty string value (the default setting) means the content of resulting
|
|
35
|
+
* file should be encoded as Base64 and passed as the endpoont response value.
|
|
36
|
+
* An exception will be thrown if the generated media file is too big to
|
|
37
|
+
* fit into the available process memory.
|
|
38
|
+
*/
|
|
39
|
+
remotePath: string | null;
|
|
40
|
+
/**
|
|
41
|
+
* The name of the user for the remote authentication.
|
|
42
|
+
*/
|
|
43
|
+
user: string | null;
|
|
44
|
+
/**
|
|
45
|
+
* The password for the remote authentication.
|
|
46
|
+
*/
|
|
47
|
+
pass: string | null;
|
|
48
|
+
/**
|
|
49
|
+
* The http multipart upload method name. The 'PUT' one is used by default.
|
|
50
|
+
*/
|
|
51
|
+
method: string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Additional headers mapping for multipart http(s) uploads
|
|
54
|
+
*/
|
|
55
|
+
headers: any | null;
|
|
56
|
+
/**
|
|
57
|
+
* [file] The name of the form field, where the file content BLOB should be stored for
|
|
58
|
+
* http(s) uploads
|
|
59
|
+
*/
|
|
60
|
+
fileFieldName: string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Additional form fields for multipart http(s) uploads
|
|
63
|
+
*/
|
|
64
|
+
formFields: any | (Array<Pair> | null);
|
|
65
|
+
/**
|
|
66
|
+
* - The actual media upload request timeout in milliseconds;
|
|
67
|
+
* defaults to
|
|
68
|
+
*/
|
|
69
|
+
uploadTimeout: number | null;
|
|
70
|
+
};
|
|
71
|
+
export namespace commands {
|
|
72
|
+
/**
|
|
73
|
+
* @typedef {Object} StartRecordingOptions
|
|
74
|
+
*
|
|
75
|
+
* @property {string?} resolution Maximum supported resolution on-device (Detected
|
|
76
|
+
* automatically by the app itself), which usually equals to Full HD 1920x1080 on most
|
|
77
|
+
* phones however you can change it to following supported resolutions
|
|
78
|
+
* as well: "1920x1080", "1280x720", "720x480", "320x240", "176x144".
|
|
79
|
+
* @property {number?} maxDurationSec [900] Default value: 900 seconds which means
|
|
80
|
+
* maximum allowed duration is 15 minute, you can increase it if your test takes
|
|
81
|
+
* longer than that.
|
|
82
|
+
* @property {string?} priority [high] Means recording thread priority is maximum
|
|
83
|
+
* however if you face performance drops during testing with recording enabled, you
|
|
84
|
+
* can reduce recording priority to "normal" or "low".
|
|
85
|
+
* @property {string?} filename You can type recording video file name as you want,
|
|
86
|
+
* but recording currently supports only "mp4" format so your filename must end with ".mp4".
|
|
87
|
+
* An invalid file name will fail to start the recording.
|
|
88
|
+
* If not provided then the current timestamp will be used as file name.
|
|
89
|
+
*/
|
|
90
|
+
/**
|
|
91
|
+
* Record the display of a real devices running Android 10 (API level 29) and higher.
|
|
92
|
+
* The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default
|
|
93
|
+
* (only for apps that allow it in their manifests).
|
|
94
|
+
* If another recording has been already started then the command will exit silently.
|
|
95
|
+
* The previously recorded video file is deleted when a new recording session is started.
|
|
96
|
+
* Recording continues it is stopped explicitly or until the timeout happens.
|
|
97
|
+
*
|
|
98
|
+
* @param {?StartRecordingOptions} options Available options.
|
|
99
|
+
* @returns {boolean} True if a new recording has successfully started.
|
|
100
|
+
* @throws {Error} If recording has failed to start or is not supported on the device under test.
|
|
101
|
+
*/
|
|
102
|
+
function mobileStartMediaProjectionRecording(options?: StartRecordingOptions | null): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Checks if a media projection-based recording is currently running.
|
|
105
|
+
*
|
|
106
|
+
* @returns {boolean} True if a recording is in progress.
|
|
107
|
+
* @throws {Error} If a recording is not supported on the device under test.
|
|
108
|
+
*/
|
|
109
|
+
function mobileIsMediaProjectionRecordingRunning(): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* @typedef {Object} StopRecordingOptions
|
|
112
|
+
*
|
|
113
|
+
* @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.
|
|
114
|
+
* The following protocols are supported: http/https, ftp.
|
|
115
|
+
* Null or empty string value (the default setting) means the content of resulting
|
|
116
|
+
* file should be encoded as Base64 and passed as the endpoont response value.
|
|
117
|
+
* An exception will be thrown if the generated media file is too big to
|
|
118
|
+
* fit into the available process memory.
|
|
119
|
+
* @property {string?} user The name of the user for the remote authentication.
|
|
120
|
+
* @property {string?} pass The password for the remote authentication.
|
|
121
|
+
* @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.
|
|
122
|
+
* @property {Object?} headers Additional headers mapping for multipart http(s) uploads
|
|
123
|
+
* @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for
|
|
124
|
+
* http(s) uploads
|
|
125
|
+
* @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads
|
|
126
|
+
* @property {number?} uploadTimeout - The actual media upload request timeout in milliseconds;
|
|
127
|
+
* defaults to @appium/support net DEFAULT_TIMEOUT_MS
|
|
128
|
+
*/
|
|
129
|
+
/**
|
|
130
|
+
* Stop a media projection-based recording.
|
|
131
|
+
* If no recording has been started before then an error is thrown.
|
|
132
|
+
* If the recording has been already finished before this API has been called
|
|
133
|
+
* then the most recent recorded file is returned.
|
|
134
|
+
*
|
|
135
|
+
* @param {?StopRecordingOptions} options Available options.
|
|
136
|
+
* @returns {string} Base64-encoded content of the recorded media file if 'remotePath'
|
|
137
|
+
* parameter is falsy or an empty string.
|
|
138
|
+
* @throws {Error} If there was an error while stopping a recording,
|
|
139
|
+
* fetching the content of the remote media file,
|
|
140
|
+
* or if a recording is not supported on the device under test.
|
|
141
|
+
*/
|
|
142
|
+
function mobileStopMediaProjectionRecording(options?: StopRecordingOptions | null): string;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=media-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-projection.d.ts","sourceRoot":"","sources":["../../../lib/commands/media-projection.js"],"names":[],"mappings":";;;;;;;;gBAsKc,MAAM;;;;;;oBAIN,MAAM;;;;;;cAGN,MAAM;;;;;;;cAGN,MAAM;;;;;;;;;;;gBAsDN,MAAM;;;;UAMN,MAAM;;;;UACN,MAAM;;;;YACN,MAAM;;;;;;;;;mBAEN,MAAM;;;;gBAEN,OAAO,WAAW,QAAC;;;;;mBACnB,MAAM;;;IAhFpB;;;;;;;;;;;;;;;;;OAiBG;IAEH;;;;;;;;;;;OAWG;IACH,8FAkBC;IAED;;;;;OAKG;IACH,4DAKC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IAEH;;;;;;;;;;;;OAYG;IACH,2FAwBC"}
|