appium-xcuitest-driver 10.2.2 → 10.3.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/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "10.2.2",
11
+ "version": "10.3.0",
12
12
  "author": "Appium Contributors",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {
@@ -98,6 +98,7 @@
98
98
  "lru-cache": "^11.1.0",
99
99
  "moment": "^2.29.4",
100
100
  "moment-timezone": "^0.x",
101
+ "node-devicectl": "^1.0.1",
101
102
  "node-simctl": "^8.0.0",
102
103
  "portscanner": "^2.2.0",
103
104
  "semver": "^7.5.4",
@@ -1,204 +0,0 @@
1
- /**
2
- * @typedef {Object} ProcessInfo
3
- * @property {number} processIdentifier
4
- * @property {string} executable
5
- */
6
- /**
7
- * @typedef {Object} AppInfo
8
- * @property {boolean} appClip
9
- * @property {boolean} builtByDeveloper
10
- * @property {string} bundleIdentifier
11
- * @property {string} bundleVersion
12
- * @property {boolean} defaultApp
13
- * @property {boolean} hidden
14
- * @property {boolean} internalApp
15
- * @property {string} name
16
- * @property {boolean} removable
17
- * @property {string} url
18
- * @property {string} version
19
- */
20
- /**
21
- * @typedef {Object} ExecuteOptions
22
- * @property {boolean} [logStdout=false]
23
- * @property {boolean} [asJson=true]
24
- * @property {boolean} [asynchronous=false]
25
- * @property {string[]|string} [subcommandOptions]
26
- * @property {number} [timeout]
27
- */
28
- /**
29
- * @typedef {{asynchronous: true}} TAsyncOpts
30
- */
31
- /**
32
- * @typedef {Object} ListFilesOptions
33
- * @property {string} [username] The username of the user we should target. Only relevant for certain domains.
34
- * @property {string} [subdirectory] A subdirectory within the domain. If not specified, defaults to the root.
35
- */
36
- /**
37
- * @typedef {Object} PullFileOptions
38
- * @property {string} [username] The username of the user we should target. Only relevant for certain domains.
39
- * @property {string} domainType The file service domain. Valid values are: temporary, rootStaging, appDataContainer, appGroupDataContainer,
40
- * systemCrashLogs. You must specify a valid domain and identifier pair. Each domain is accompanied by an identifier
41
- * that provides additional context. For example, if the domain is an app data container, the identifier is the bundle
42
- * ID of the app. For temporary directories and root staging areas, the identifier is a unique client-provided string
43
- * which is used to get your own space, separate from those of other clients.
44
- * @property {string} domainIdentifier A unique string used to provide additional context to the domain.
45
- * @property {number} [timeout=120000] The timeout for pulling a file in milliseconds.
46
- */
47
- /**
48
- * An option for launchApp method by devicectl.
49
- * @typedef {Object} LaunchAppOptions
50
- * @property {import('@appium/types').StringRecord<string|number>} [env] Bundle id to Environment variables for the launching app process.
51
- * @property {boolean} [terminateExisting=false] Whether terminating the already running app.
52
- */
53
- export class Devicectl {
54
- /**
55
- * @since Xcode 15, iOS 17
56
- * @param {string} udid
57
- * @param {import('@appium/types').AppiumLogger} log
58
- */
59
- constructor(udid: string, log: import("@appium/types").AppiumLogger);
60
- udid: string;
61
- log: import("@appium/types").AppiumLogger;
62
- /**
63
- * @template {ExecuteOptions} TExecOpts
64
- * @param {string[]} subcommand
65
- * @param {TExecOpts} [opts]
66
- * @return {Promise<TExecOpts extends TAsyncOpts ? import('teen_process').SubProcess : import('teen_process').TeenProcessExecResult>}
67
- */
68
- execute<TExecOpts extends ExecuteOptions>(subcommand: string[], opts?: TExecOpts): Promise<TExecOpts extends TAsyncOpts ? any : any>;
69
- /**
70
- * Simulates memory warning for the process with the given PID
71
- *
72
- * @param {number|string} pid The process identifier to simulate the Low Memory warning for
73
- * @return {Promise<void>}
74
- */
75
- sendMemoryWarning(pid: number | string): Promise<void>;
76
- /**
77
- * Lists running processes on the device
78
- *
79
- * @returns {Promise<ProcessInfo[]>}
80
- */
81
- listProcesses(): Promise<ProcessInfo[]>;
82
- /**
83
- * Lists files at a specified path on the device
84
- *
85
- * @param {string} domainType The file service domain. Valid values are: temporary, rootStaging, appDataContainer, appGroupDataContainer,
86
- * systemCrashLogs. You must specify a valid domain and identifier pair. Each domain is accompanied by an identifier
87
- * that provides additional context. For example, if the domain is an app data container, the identifier is the bundle
88
- * ID of the app. For temporary directories and root staging areas, the identifier is a unique client-provided string
89
- * which is used to get your own space, separate from those of other clients.
90
- * @param {string} domainIdentifier A unique string used to provide additional context to the domain.
91
- * @param {ListFilesOptions} [opts={}]
92
- * @returns {Promise<string[]>} List of file names (could be empty)
93
- */
94
- listFiles(domainType: string, domainIdentifier: string, opts?: ListFilesOptions): Promise<string[]>;
95
- /**
96
- * Pulls a file from the specified path on the device to a local file system
97
- *
98
- * @param {string} from The item which should be copied.
99
- * @param {string} to The location to which the item should be copied.
100
- * @param {PullFileOptions} opts
101
- * @returns {Promise<string>} The destination path (same as `to`)
102
- */
103
- pullFile(from: string, to: string, opts: PullFileOptions): Promise<string>;
104
- /**
105
- * Send POSIX signal to the running process
106
- *
107
- * @param {number|string} pid The process identifier to send a signal to
108
- * @param {number|string} signal The signal to send to a process. See 'man signal' for a list of signals
109
- * @returns {Promise<void>}
110
- */
111
- sendSignalToProcess(pid: number | string, signal: number | string): Promise<void>;
112
- /**
113
- * Retrieves the list of installed apps from the device
114
- *
115
- * @param {string?} [bundleId=null] Provide the target bundle identifier
116
- * to speed up the lookup.
117
- * @returns {Promise<AppInfo[]>} Empty array is returned if no matching apps are found
118
- */
119
- listApps(bundleId?: string | null): Promise<AppInfo[]>;
120
- /**
121
- * Launch the given bundle id application with the given environment variable.
122
- * This method is over devicectl command, this it may take additional seconds to launch the app.
123
- * Please use via WDA or via appium-ios-device as primary method to launch app if possible.
124
- *
125
- * @param {string} bundleId Bundle id to launch.
126
- * @param {LaunchAppOptions} opts launching app with devicectl command options.
127
- * @returns {Promise<void>}
128
- * @throws {Error} If the launching app command fails. For example, the given bundle id did not exist.
129
- */
130
- launchApp(bundleId: string, opts: LaunchAppOptions): Promise<void>;
131
- }
132
- export type ProcessInfo = {
133
- processIdentifier: number;
134
- executable: string;
135
- };
136
- export type AppInfo = {
137
- appClip: boolean;
138
- builtByDeveloper: boolean;
139
- bundleIdentifier: string;
140
- bundleVersion: string;
141
- defaultApp: boolean;
142
- hidden: boolean;
143
- internalApp: boolean;
144
- name: string;
145
- removable: boolean;
146
- url: string;
147
- version: string;
148
- };
149
- export type ExecuteOptions = {
150
- logStdout?: boolean | undefined;
151
- asJson?: boolean | undefined;
152
- asynchronous?: boolean | undefined;
153
- subcommandOptions?: string | string[] | undefined;
154
- timeout?: number | undefined;
155
- };
156
- export type TAsyncOpts = {
157
- asynchronous: true;
158
- };
159
- export type ListFilesOptions = {
160
- /**
161
- * The username of the user we should target. Only relevant for certain domains.
162
- */
163
- username?: string | undefined;
164
- /**
165
- * A subdirectory within the domain. If not specified, defaults to the root.
166
- */
167
- subdirectory?: string | undefined;
168
- };
169
- export type PullFileOptions = {
170
- /**
171
- * The username of the user we should target. Only relevant for certain domains.
172
- */
173
- username?: string | undefined;
174
- /**
175
- * The file service domain. Valid values are: temporary, rootStaging, appDataContainer, appGroupDataContainer,
176
- * systemCrashLogs. You must specify a valid domain and identifier pair. Each domain is accompanied by an identifier
177
- * that provides additional context. For example, if the domain is an app data container, the identifier is the bundle
178
- * ID of the app. For temporary directories and root staging areas, the identifier is a unique client-provided string
179
- * which is used to get your own space, separate from those of other clients.
180
- */
181
- domainType: string;
182
- /**
183
- * A unique string used to provide additional context to the domain.
184
- */
185
- domainIdentifier: string;
186
- /**
187
- * The timeout for pulling a file in milliseconds.
188
- */
189
- timeout?: number | undefined;
190
- };
191
- /**
192
- * An option for launchApp method by devicectl.
193
- */
194
- export type LaunchAppOptions = {
195
- /**
196
- * Bundle id to Environment variables for the launching app process.
197
- */
198
- env?: import("@appium/types").StringRecord<string | number> | undefined;
199
- /**
200
- * Whether terminating the already running app.
201
- */
202
- terminateExisting?: boolean | undefined;
203
- };
204
- //# sourceMappingURL=devicectl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"devicectl.d.ts","sourceRoot":"","sources":["../../../lib/real-device-clients/devicectl.js"],"names":[],"mappings":"AAMA;;;;GAIG;AAUH;;;;;;;;;;;;;GAaG;AAmBH;;;;;;;GAOG;AAEH;;GAEG;AAEH;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAGH;;;;;GAKG;AAEH;IACE;;;;OAIG;IACH,kBAHW,MAAM,OACN,OAAO,eAAe,EAAE,YAAY,EAK9C;IAFC,aAAgB;IAChB,0CAAc;IAGhB;;;;;OAKG;IACH,QAL8B,SAAS,SAAzB,cAAe,cAClB,MAAM,EAAE,SACR,SAAS,GACR,OAAO,CAAC,SAAS,SAAS,UAAU,GAAG,GAAiC,GAAG,GAA4C,CAAC,CA6CnI;IAED;;;;;OAKG;IACH,uBAHW,MAAM,GAAC,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAMxB;IAED;;;;OAIG;IACH,iBAFa,OAAO,CAAC,WAAW,EAAE,CAAC,CAKlC;IAED;;;;;;;;;;;OAWG;IACH,sBATW,MAAM,oBAKN,MAAM,SACN,gBAAgB,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB7B;IAED;;;;;;;OAOG;IACH,eALW,MAAM,MACN,MAAM,QACN,eAAe,GACb,OAAO,CAAC,MAAM,CAAC,CAkB3B;IAED;;;;;;OAMG;IACH,yBAJW,MAAM,GAAC,MAAM,UACb,MAAM,GAAC,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;;;;OAMG;IACH,oBAJW,MAAM,OAAC,GAEL,OAAO,CAAC,OAAO,EAAE,CAAC,CAW9B;IAED;;;;;;;;;OASG;IACH,oBALW,MAAM,QACN,gBAAgB,GACd,OAAO,CAAC,IAAI,CAAC,CAqBzB;CACF;;uBA1Ra,MAAM;gBACN,MAAM;;;aAaN,OAAO;sBACP,OAAO;sBACP,MAAM;mBACN,MAAM;gBACN,OAAO;YACP,OAAO;iBACP,OAAO;UACP,MAAM;eACN,OAAO;SACP,MAAM;aACN,MAAM;;;;;;;;;yBA8BP;IAAC,YAAY,EAAE,IAAI,CAAA;CAAC;;;;;;;;;;;;;;;;;;;;;;;gBAYnB,MAAM;;;;sBAKN,MAAM"}
@@ -1,264 +0,0 @@
1
- "use strict";
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.Devicectl = void 0;
7
- const teen_process_1 = require("teen_process");
8
- const support_1 = require("appium/support");
9
- const lodash_1 = __importDefault(require("lodash"));
10
- const XCRUN = 'xcrun';
11
- /**
12
- * @typedef {Object} ProcessInfo
13
- * @property {number} processIdentifier
14
- * @property {string} executable
15
- */
16
- /*
17
- Example:
18
- {
19
- "executable" : "file:///sbin/launchd",
20
- "processIdentifier" : 1
21
- },
22
- */
23
- /**
24
- * @typedef {Object} AppInfo
25
- * @property {boolean} appClip
26
- * @property {boolean} builtByDeveloper
27
- * @property {string} bundleIdentifier
28
- * @property {string} bundleVersion
29
- * @property {boolean} defaultApp
30
- * @property {boolean} hidden
31
- * @property {boolean} internalApp
32
- * @property {string} name
33
- * @property {boolean} removable
34
- * @property {string} url
35
- * @property {string} version
36
- */
37
- /*
38
- Example:
39
- {
40
- "appClip" : false,
41
- "builtByDeveloper" : false,
42
- "bundleIdentifier" : "com.apple.mobilesafari",
43
- "bundleVersion" : "8617.1.17.10.9",
44
- "defaultApp" : true,
45
- "hidden" : false,
46
- "internalApp" : false,
47
- "name" : "Safari",
48
- "removable" : false,
49
- "url" : "file:///Applications/MobileSafari.app/",
50
- "version" : "17.2"
51
- }
52
- */
53
- /**
54
- * @typedef {Object} ExecuteOptions
55
- * @property {boolean} [logStdout=false]
56
- * @property {boolean} [asJson=true]
57
- * @property {boolean} [asynchronous=false]
58
- * @property {string[]|string} [subcommandOptions]
59
- * @property {number} [timeout]
60
- */
61
- /**
62
- * @typedef {{asynchronous: true}} TAsyncOpts
63
- */
64
- /**
65
- * @typedef {Object} ListFilesOptions
66
- * @property {string} [username] The username of the user we should target. Only relevant for certain domains.
67
- * @property {string} [subdirectory] A subdirectory within the domain. If not specified, defaults to the root.
68
- */
69
- /**
70
- * @typedef {Object} PullFileOptions
71
- * @property {string} [username] The username of the user we should target. Only relevant for certain domains.
72
- * @property {string} domainType The file service domain. Valid values are: temporary, rootStaging, appDataContainer, appGroupDataContainer,
73
- * systemCrashLogs. You must specify a valid domain and identifier pair. Each domain is accompanied by an identifier
74
- * that provides additional context. For example, if the domain is an app data container, the identifier is the bundle
75
- * ID of the app. For temporary directories and root staging areas, the identifier is a unique client-provided string
76
- * which is used to get your own space, separate from those of other clients.
77
- * @property {string} domainIdentifier A unique string used to provide additional context to the domain.
78
- * @property {number} [timeout=120000] The timeout for pulling a file in milliseconds.
79
- */
80
- /**
81
- * An option for launchApp method by devicectl.
82
- * @typedef {Object} LaunchAppOptions
83
- * @property {import('@appium/types').StringRecord<string|number>} [env] Bundle id to Environment variables for the launching app process.
84
- * @property {boolean} [terminateExisting=false] Whether terminating the already running app.
85
- */
86
- class Devicectl {
87
- /**
88
- * @since Xcode 15, iOS 17
89
- * @param {string} udid
90
- * @param {import('@appium/types').AppiumLogger} log
91
- */
92
- constructor(udid, log) {
93
- this.udid = udid;
94
- this.log = log;
95
- }
96
- /**
97
- * @template {ExecuteOptions} TExecOpts
98
- * @param {string[]} subcommand
99
- * @param {TExecOpts} [opts]
100
- * @return {Promise<TExecOpts extends TAsyncOpts ? import('teen_process').SubProcess : import('teen_process').TeenProcessExecResult>}
101
- */
102
- async execute(subcommand, opts) {
103
- const { logStdout = false, asynchronous = false, asJson = true, subcommandOptions, timeout, } = opts ?? {};
104
- const finalArgs = [
105
- 'devicectl', ...subcommand,
106
- '--device', this.udid,
107
- ];
108
- if (subcommandOptions && !lodash_1.default.isEmpty(subcommandOptions)) {
109
- finalArgs.push(...(Array.isArray(subcommandOptions) ? subcommandOptions : [subcommandOptions]));
110
- }
111
- if (asJson) {
112
- finalArgs.push('--quiet', '--json-output', '-');
113
- }
114
- const cmdStr = support_1.util.quote([XCRUN, ...finalArgs]);
115
- this.log.debug(`Executing ${cmdStr}`);
116
- try {
117
- if (asynchronous) {
118
- const result = new teen_process_1.SubProcess(XCRUN, finalArgs);
119
- await result.start(0);
120
- // @ts-ignore TS does not understand it
121
- return result;
122
- }
123
- const result = await (0, teen_process_1.exec)(XCRUN, finalArgs, ...(lodash_1.default.isNumber(timeout) ? [{ timeout }] : []));
124
- if (logStdout) {
125
- this.log.debug(`Command output: ${result.stdout}`);
126
- }
127
- // @ts-ignore TS does not understand it
128
- return result;
129
- }
130
- catch (e) {
131
- throw new Error(`'${cmdStr}' failed. Original error: ${e.stderr || e.stdout || e.message}`);
132
- }
133
- }
134
- /**
135
- * Simulates memory warning for the process with the given PID
136
- *
137
- * @param {number|string} pid The process identifier to simulate the Low Memory warning for
138
- * @return {Promise<void>}
139
- */
140
- async sendMemoryWarning(pid) {
141
- await this.execute(['device', 'process', 'sendMemoryWarning'], {
142
- subcommandOptions: ['--pid', `${pid}`]
143
- });
144
- }
145
- /**
146
- * Lists running processes on the device
147
- *
148
- * @returns {Promise<ProcessInfo[]>}
149
- */
150
- async listProcesses() {
151
- const { stdout } = await this.execute(['device', 'info', 'processes']);
152
- return JSON.parse(stdout).result.runningProcesses;
153
- }
154
- /**
155
- * Lists files at a specified path on the device
156
- *
157
- * @param {string} domainType The file service domain. Valid values are: temporary, rootStaging, appDataContainer, appGroupDataContainer,
158
- * systemCrashLogs. You must specify a valid domain and identifier pair. Each domain is accompanied by an identifier
159
- * that provides additional context. For example, if the domain is an app data container, the identifier is the bundle
160
- * ID of the app. For temporary directories and root staging areas, the identifier is a unique client-provided string
161
- * which is used to get your own space, separate from those of other clients.
162
- * @param {string} domainIdentifier A unique string used to provide additional context to the domain.
163
- * @param {ListFilesOptions} [opts={}]
164
- * @returns {Promise<string[]>} List of file names (could be empty)
165
- */
166
- async listFiles(domainType, domainIdentifier, opts = {}) {
167
- const subcommandOptions = [
168
- '--domain-type', domainType,
169
- '--domain-identifier', domainIdentifier,
170
- ];
171
- if (opts.username) {
172
- subcommandOptions.push('--username', opts.username);
173
- }
174
- if (opts.subdirectory) {
175
- subcommandOptions.push('--subdirectory', opts.subdirectory);
176
- }
177
- const { stdout } = await this.execute(['device', 'info', 'files'], {
178
- subcommandOptions,
179
- });
180
- return JSON.parse(stdout).result.files.map(({ name }) => name);
181
- }
182
- /**
183
- * Pulls a file from the specified path on the device to a local file system
184
- *
185
- * @param {string} from The item which should be copied.
186
- * @param {string} to The location to which the item should be copied.
187
- * @param {PullFileOptions} opts
188
- * @returns {Promise<string>} The destination path (same as `to`)
189
- */
190
- async pullFile(from, to, opts) {
191
- const subcommandOptions = [
192
- '--domain-type', opts.domainType,
193
- '--domain-identifier', opts.domainIdentifier,
194
- '--source', from,
195
- '--destination', to,
196
- ];
197
- if (opts.username) {
198
- subcommandOptions.push('--user', opts.username);
199
- }
200
- await this.execute(['device', 'copy', 'from'], {
201
- subcommandOptions,
202
- timeout: opts.timeout ?? 120000,
203
- asJson: false,
204
- });
205
- return to;
206
- }
207
- /**
208
- * Send POSIX signal to the running process
209
- *
210
- * @param {number|string} pid The process identifier to send a signal to
211
- * @param {number|string} signal The signal to send to a process. See 'man signal' for a list of signals
212
- * @returns {Promise<void>}
213
- */
214
- async sendSignalToProcess(pid, signal) {
215
- await this.execute(['device', 'process', 'signal'], {
216
- subcommandOptions: ['--signal', `${signal}`, '--pid', `${pid}`]
217
- });
218
- }
219
- /**
220
- * Retrieves the list of installed apps from the device
221
- *
222
- * @param {string?} [bundleId=null] Provide the target bundle identifier
223
- * to speed up the lookup.
224
- * @returns {Promise<AppInfo[]>} Empty array is returned if no matching apps are found
225
- */
226
- async listApps(bundleId = null) {
227
- const subcommandOptions = ['--include-all-apps'];
228
- if (bundleId) {
229
- subcommandOptions.push('--bundle-id', bundleId);
230
- }
231
- const { stdout } = await this.execute(['device', 'info', 'apps'], {
232
- subcommandOptions,
233
- });
234
- return JSON.parse(stdout).result.apps;
235
- }
236
- /**
237
- * Launch the given bundle id application with the given environment variable.
238
- * This method is over devicectl command, this it may take additional seconds to launch the app.
239
- * Please use via WDA or via appium-ios-device as primary method to launch app if possible.
240
- *
241
- * @param {string} bundleId Bundle id to launch.
242
- * @param {LaunchAppOptions} opts launching app with devicectl command options.
243
- * @returns {Promise<void>}
244
- * @throws {Error} If the launching app command fails. For example, the given bundle id did not exist.
245
- */
246
- async launchApp(bundleId, opts) {
247
- const { env, terminateExisting = false } = opts;
248
- const subcommandOptions = [];
249
- if (terminateExisting) {
250
- subcommandOptions.push('--terminate-existing');
251
- }
252
- ;
253
- if (!lodash_1.default.isEmpty(env)) {
254
- subcommandOptions.push('--environment-variables', JSON.stringify(lodash_1.default.mapValues(env, (v) => lodash_1.default.toString(v))));
255
- }
256
- ;
257
- // The bundle id should be the last to apply arguments properly.
258
- // devicectl command might not raise exception while the order is wrong.
259
- subcommandOptions.push(bundleId);
260
- await this.execute(['device', 'process', 'launch'], { subcommandOptions, asJson: false });
261
- }
262
- }
263
- exports.Devicectl = Devicectl;
264
- //# sourceMappingURL=devicectl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"devicectl.js","sourceRoot":"","sources":["../../../lib/real-device-clients/devicectl.js"],"names":[],"mappings":"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"}