appium-xcuitest-driver 10.14.2 → 10.14.3
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 +6 -0
- package/build/lib/commands/alert.d.ts +26 -31
- package/build/lib/commands/alert.d.ts.map +1 -1
- package/build/lib/commands/alert.js +20 -29
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/appearance.d.ts +7 -9
- package/build/lib/commands/appearance.d.ts.map +1 -1
- package/build/lib/commands/appearance.js +13 -19
- package/build/lib/commands/appearance.js.map +1 -1
- package/build/lib/commands/permissions.d.ts +15 -17
- package/build/lib/commands/permissions.d.ts.map +1 -1
- package/build/lib/commands/permissions.js +12 -18
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/proxy-helper.d.ts +11 -11
- package/build/lib/commands/proxy-helper.d.ts.map +1 -1
- package/build/lib/commands/proxy-helper.js +15 -24
- package/build/lib/commands/proxy-helper.js.map +1 -1
- package/build/lib/commands/simctl.d.ts +16 -22
- package/build/lib/commands/simctl.d.ts.map +1 -1
- package/build/lib/commands/simctl.js +8 -17
- package/build/lib/commands/simctl.js.map +1 -1
- package/build/lib/commands/timeouts.d.ts +25 -32
- package/build/lib/commands/timeouts.d.ts.map +1 -1
- package/build/lib/commands/timeouts.js +18 -14
- package/build/lib/commands/timeouts.js.map +1 -1
- package/lib/commands/alert.ts +98 -0
- package/lib/commands/appearance.ts +70 -0
- package/lib/commands/permissions.ts +90 -0
- package/lib/commands/{proxy-helper.js → proxy-helper.ts} +26 -26
- package/lib/commands/{simctl.js → simctl.ts} +27 -21
- package/lib/commands/timeouts.ts +95 -0
- package/npm-shrinkwrap.json +5 -5
- package/package.json +1 -1
- package/lib/commands/alert.js +0 -88
- package/lib/commands/appearance.js +0 -71
- package/lib/commands/permissions.js +0 -85
- package/lib/commands/timeouts.js +0 -68
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [10.14.3](https://github.com/appium/appium-xcuitest-driver/compare/v10.14.2...v10.14.3) (2026-01-04)
|
|
2
|
+
|
|
3
|
+
### Miscellaneous Chores
|
|
4
|
+
|
|
5
|
+
* Migrate various command modules to typescript (part 7) ([#2693](https://github.com/appium/appium-xcuitest-driver/issues/2693)) ([1286364](https://github.com/appium/appium-xcuitest-driver/commit/128636475c1eac6ea5c73da3dcebb2eb9d539c4d))
|
|
6
|
+
|
|
1
7
|
## [10.14.2](https://github.com/appium/appium-xcuitest-driver/compare/v10.14.1...v10.14.2) (2026-01-01)
|
|
2
8
|
|
|
3
9
|
### Miscellaneous Chores
|
|
@@ -1,45 +1,40 @@
|
|
|
1
|
+
import type { XCUITestDriver } from '../driver';
|
|
2
|
+
export type AlertAction = 'accept' | 'dismiss' | 'getButtons';
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @param {string} value
|
|
7
|
-
* @this {XCUITestDriver}
|
|
8
|
-
* @returns {Promise<void>}
|
|
4
|
+
* Gets the text of the currently displayed alert.
|
|
5
|
+
*
|
|
6
|
+
* @returns The alert text, or null if no alert is displayed
|
|
9
7
|
*/
|
|
10
|
-
export function
|
|
8
|
+
export declare function getAlertText(this: XCUITestDriver): Promise<string | null>;
|
|
11
9
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* @
|
|
10
|
+
* Sets the text in an alert input field.
|
|
11
|
+
*
|
|
12
|
+
* @param value - The text to set
|
|
15
13
|
*/
|
|
16
|
-
export function
|
|
17
|
-
buttonLabel?: string;
|
|
18
|
-
}): Promise<void>;
|
|
14
|
+
export declare function setAlertText(this: XCUITestDriver, value: string): Promise<void>;
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* @
|
|
16
|
+
* Accepts the currently displayed alert.
|
|
17
|
+
*
|
|
18
|
+
* @param opts - Options including optional button label
|
|
23
19
|
*/
|
|
24
|
-
export function
|
|
25
|
-
buttonLabel?: string;
|
|
26
|
-
}): Promise<void>;
|
|
20
|
+
export declare function postAcceptAlert(this: XCUITestDriver, opts?: AlertOptions): Promise<void>;
|
|
27
21
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* @
|
|
22
|
+
* Dismisses the currently displayed alert.
|
|
23
|
+
*
|
|
24
|
+
* @param opts - Options including optional button label
|
|
31
25
|
*/
|
|
32
|
-
export function
|
|
26
|
+
export declare function postDismissAlert(this: XCUITestDriver, opts?: AlertOptions): Promise<void>;
|
|
33
27
|
/**
|
|
34
28
|
* Tries to apply the given action to the currently visible alert.
|
|
35
29
|
*
|
|
36
|
-
* @param
|
|
37
|
-
* @param
|
|
38
|
-
* @returns
|
|
30
|
+
* @param action - The actual action to apply
|
|
31
|
+
* @param buttonLabel - The name of the button used to perform the chosen alert action. Only makes sense if the action is `accept` or `dismiss`
|
|
32
|
+
* @returns If `action` is `getButtons`, a list of alert button labels; otherwise nothing
|
|
39
33
|
* @remarks This should really be separate commands.
|
|
40
|
-
* @this {XCUITestDriver}
|
|
41
34
|
*/
|
|
42
|
-
export function mobileHandleAlert(this:
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
export declare function mobileHandleAlert(this: XCUITestDriver, action: AlertAction, buttonLabel?: string): Promise<string[] | void>;
|
|
36
|
+
interface AlertOptions {
|
|
37
|
+
buttonLabel?: string;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
45
40
|
//# sourceMappingURL=alert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../lib/commands/alert.
|
|
1
|
+
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../lib/commands/alert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAE9D;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE/E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAEf;AAYD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAc1B;AAUD,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -7,51 +7,53 @@ exports.postDismissAlert = postDismissAlert;
|
|
|
7
7
|
exports.getAlertButtons = getAlertButtons;
|
|
8
8
|
exports.mobileHandleAlert = mobileHandleAlert;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Gets the text of the currently displayed alert.
|
|
11
|
+
*
|
|
12
|
+
* @returns The alert text, or null if no alert is displayed
|
|
11
13
|
*/
|
|
12
14
|
async function getAlertText() {
|
|
13
|
-
return
|
|
15
|
+
return await this.proxyCommand('/alert/text', 'GET');
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* @
|
|
18
|
+
* Sets the text in an alert input field.
|
|
19
|
+
*
|
|
20
|
+
* @param value - The text to set
|
|
19
21
|
*/
|
|
20
22
|
async function setAlertText(value) {
|
|
21
23
|
await this.proxyCommand('/alert/text', 'POST', { value });
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* @
|
|
26
|
+
* Accepts the currently displayed alert.
|
|
27
|
+
*
|
|
28
|
+
* @param opts - Options including optional button label
|
|
27
29
|
*/
|
|
28
30
|
async function postAcceptAlert(opts = {}) {
|
|
29
31
|
await this.proxyCommand('/alert/accept', 'POST', toAlertParams(opts));
|
|
30
32
|
}
|
|
31
33
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* @
|
|
34
|
+
* Dismisses the currently displayed alert.
|
|
35
|
+
*
|
|
36
|
+
* @param opts - Options including optional button label
|
|
35
37
|
*/
|
|
36
38
|
async function postDismissAlert(opts = {}) {
|
|
37
39
|
await this.proxyCommand('/alert/dismiss', 'POST', toAlertParams(opts));
|
|
38
40
|
}
|
|
39
41
|
/**
|
|
42
|
+
* Gets the list of button labels from the currently displayed alert.
|
|
43
|
+
*
|
|
44
|
+
* @returns The list of button labels
|
|
40
45
|
* @internal
|
|
41
|
-
* @this {XCUITestDriver}
|
|
42
|
-
* @returns {Promise<string[]>} The list of button labels
|
|
43
46
|
*/
|
|
44
47
|
async function getAlertButtons() {
|
|
45
|
-
return
|
|
48
|
+
return await this.proxyCommand('/wda/alert/buttons', 'GET');
|
|
46
49
|
}
|
|
47
50
|
/**
|
|
48
51
|
* Tries to apply the given action to the currently visible alert.
|
|
49
52
|
*
|
|
50
|
-
* @param
|
|
51
|
-
* @param
|
|
52
|
-
* @returns
|
|
53
|
+
* @param action - The actual action to apply
|
|
54
|
+
* @param buttonLabel - The name of the button used to perform the chosen alert action. Only makes sense if the action is `accept` or `dismiss`
|
|
55
|
+
* @returns If `action` is `getButtons`, a list of alert button labels; otherwise nothing
|
|
53
56
|
* @remarks This should really be separate commands.
|
|
54
|
-
* @this {XCUITestDriver}
|
|
55
57
|
*/
|
|
56
58
|
async function mobileHandleAlert(action, buttonLabel) {
|
|
57
59
|
switch (action) {
|
|
@@ -66,11 +68,6 @@ async function mobileHandleAlert(action, buttonLabel) {
|
|
|
66
68
|
`'${action}' is provided instead.`);
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
* @param { {buttonLabel?: string} } opts
|
|
72
|
-
* @returns { {name?: string} }
|
|
73
|
-
*/
|
|
74
71
|
function toAlertParams(opts = {}) {
|
|
75
72
|
const params = {};
|
|
76
73
|
if (opts.buttonLabel) {
|
|
@@ -78,10 +75,4 @@ function toAlertParams(opts = {}) {
|
|
|
78
75
|
}
|
|
79
76
|
return params;
|
|
80
77
|
}
|
|
81
|
-
/**
|
|
82
|
-
* @typedef {'accept'|'dismiss'|'getButtons'} AlertAction
|
|
83
|
-
*/
|
|
84
|
-
/**
|
|
85
|
-
* @typedef {import('../driver').XCUITestDriver} XCUITestDriver
|
|
86
|
-
*/
|
|
87
78
|
//# sourceMappingURL=alert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../lib/commands/alert.
|
|
1
|
+
{"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../lib/commands/alert.ts"],"names":[],"mappings":";;AASA,oCAEC;AAOD,oCAKC;AAOD,0CAKC;AAOD,4CAKC;AAQD,0CAEC;AAUD,8CAkBC;AAjFD;;;;GAIG;AACI,KAAK,UAAU,YAAY;IAChC,OAAO,MAAM,IAAI,CAAC,YAAY,CAAqB,aAAa,EAAE,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAEhC,KAAa;IAEb,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,eAAe,CAEnC,OAAqB,EAAE;IAEvB,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,gBAAgB,CAEpC,OAAqB,EAAE;IAEvB,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,eAAe;IACnC,OAAO,MAAM,IAAI,CAAC,YAAY,CAAgB,oBAAoB,EAAE,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,iBAAiB,CAErC,MAAmB,EACnB,WAAoB;IAEpB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,EAAC,WAAW,EAAC,CAAC,CAAC;QACnD,KAAK,SAAS;YACZ,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAC,WAAW,EAAC,CAAC,CAAC;QACpD,KAAK,YAAY;YACf,OAAO,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CACb,2EAA2E;gBACzE,IAAI,MAAM,wBAAwB,CACrC,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAqB,EAAE;IAC5C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
+
import type { XCUITestDriver } from '../driver';
|
|
2
|
+
import type { Style } from './types';
|
|
1
3
|
/**
|
|
2
4
|
* Set the device's UI appearance style
|
|
3
5
|
*
|
|
4
6
|
* @since iOS 12.0
|
|
5
|
-
* @param
|
|
6
|
-
* @throws
|
|
7
|
-
* @this {XCUITestDriver}
|
|
7
|
+
* @param style - The appearance style to set
|
|
8
|
+
* @throws If the current platform does not support UI appearance changes
|
|
8
9
|
*/
|
|
9
|
-
export function mobileSetAppearance(this:
|
|
10
|
+
export declare function mobileSetAppearance(this: XCUITestDriver, style: 'dark' | 'light'): Promise<void>;
|
|
10
11
|
/**
|
|
11
12
|
* Get the device's UI appearance style.
|
|
12
13
|
*
|
|
13
14
|
* @since Xcode SDK 11
|
|
14
|
-
* @returns
|
|
15
|
-
* @this {XCUITestDriver}
|
|
15
|
+
* @returns The current appearance style
|
|
16
16
|
*/
|
|
17
|
-
export function mobileGetAppearance(this:
|
|
17
|
+
export declare function mobileGetAppearance(this: XCUITestDriver): Promise<{
|
|
18
18
|
style: Style;
|
|
19
19
|
}>;
|
|
20
|
-
export type XCUITestDriver = import("../driver").XCUITestDriver;
|
|
21
|
-
export type Style = import("./types").Style;
|
|
22
20
|
//# sourceMappingURL=appearance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../../lib/commands/appearance.
|
|
1
|
+
{"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../../lib/commands/appearance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAGnC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,GAAG,OAAO,GACtB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,CAAC,CAkBzB"}
|
|
@@ -11,27 +11,28 @@ const support_1 = require("appium/support");
|
|
|
11
11
|
* Set the device's UI appearance style
|
|
12
12
|
*
|
|
13
13
|
* @since iOS 12.0
|
|
14
|
-
* @param
|
|
15
|
-
* @throws
|
|
16
|
-
* @this {XCUITestDriver}
|
|
14
|
+
* @param style - The appearance style to set
|
|
15
|
+
* @throws If the current platform does not support UI appearance changes
|
|
17
16
|
*/
|
|
18
17
|
async function mobileSetAppearance(style) {
|
|
19
18
|
if (!['light', 'dark'].includes(lodash_1.default.toLower(style))) {
|
|
20
19
|
throw new Error(`The 'style' value is expected to equal either 'light' or 'dark'`);
|
|
21
20
|
}
|
|
22
|
-
if (support_1.util.compareVersions(
|
|
21
|
+
if (support_1.util.compareVersions(this.opts.platformVersion, '<', '12.0')) {
|
|
23
22
|
throw new Error('Changing appearance is only supported since iOS 12');
|
|
24
23
|
}
|
|
25
24
|
if (this.isSimulator()) {
|
|
26
25
|
try {
|
|
27
|
-
|
|
26
|
+
await this.device.setAppearance(style);
|
|
27
|
+
return;
|
|
28
28
|
}
|
|
29
29
|
catch (e) {
|
|
30
30
|
this.log.debug(e.stack);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
try {
|
|
34
|
-
|
|
34
|
+
await this.proxyCommand('/wda/device/appearance', 'POST', { name: style }, false);
|
|
35
|
+
return;
|
|
35
36
|
}
|
|
36
37
|
catch (e) {
|
|
37
38
|
this.log.debug(e.stack);
|
|
@@ -43,32 +44,25 @@ async function mobileSetAppearance(style) {
|
|
|
43
44
|
* Get the device's UI appearance style.
|
|
44
45
|
*
|
|
45
46
|
* @since Xcode SDK 11
|
|
46
|
-
* @returns
|
|
47
|
-
* @this {XCUITestDriver}
|
|
47
|
+
* @returns The current appearance style
|
|
48
48
|
*/
|
|
49
49
|
async function mobileGetAppearance() {
|
|
50
|
-
if (support_1.util.compareVersions(
|
|
50
|
+
if (support_1.util.compareVersions(this.opts.platformVersion, '<', '12.0')) {
|
|
51
51
|
return { style: 'unsupported' };
|
|
52
52
|
}
|
|
53
|
-
/** @type {Style|undefined} */
|
|
54
53
|
let style;
|
|
55
54
|
if (this.isSimulator()) {
|
|
56
55
|
try {
|
|
57
|
-
style =
|
|
56
|
+
style = await this.device.getAppearance();
|
|
58
57
|
}
|
|
59
58
|
catch { }
|
|
60
59
|
}
|
|
61
60
|
if (!style) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
?.userInterfaceStyle ?? 'unknown');
|
|
61
|
+
const deviceInfo = await this.proxyCommand('/wda/device/info', 'GET');
|
|
62
|
+
style = (deviceInfo?.userInterfaceStyle ?? 'unknown');
|
|
65
63
|
}
|
|
66
64
|
return {
|
|
67
|
-
style,
|
|
65
|
+
style: style,
|
|
68
66
|
};
|
|
69
67
|
}
|
|
70
|
-
/**
|
|
71
|
-
* @typedef {import('../driver').XCUITestDriver} XCUITestDriver
|
|
72
|
-
* @typedef {import('./types').Style} Style
|
|
73
|
-
*/
|
|
74
68
|
//# sourceMappingURL=appearance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../../lib/commands/appearance.
|
|
1
|
+
{"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../../lib/commands/appearance.ts"],"names":[],"mappings":";;;;;AAaA,kDA2BC;AAQD,kDAoBC;AApED,oDAAuB;AACvB,4CAAoC;AAKpC;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB,CAEvC,KAAuB;IAEvB,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,cAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,eAAyB,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAO,IAAI,CAAC,MAAoB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,EAAE,MAAM,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC,EAAE,KAAK,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,sEAAsE;IACtE,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,mBAAmB;IAGvC,IAAI,cAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,eAAyB,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAC,KAAK,EAAE,aAAa,EAAC,CAAC;IAChC,CAAC;IAED,IAAI,KAAwB,CAAC;IAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,GAAG,MAAO,IAAI,CAAC,MAAoB,CAAC,aAAa,EAAW,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAqC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC1G,KAAK,GAAG,CAAC,UAAU,EAAE,kBAAkB,IAAI,SAAS,CAAU,CAAC;IACjE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAc;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -1,36 +1,34 @@
|
|
|
1
|
+
import { PermissionService } from './enum';
|
|
2
|
+
import type { XCUITestDriver } from '../driver';
|
|
3
|
+
import type { PermissionState } from './types';
|
|
1
4
|
/**
|
|
2
5
|
* Resets the given permission for the active application under test.
|
|
3
6
|
* Works for both Simulator and real devices using Xcode SDK 11.4+
|
|
4
7
|
*
|
|
5
|
-
* @param
|
|
6
|
-
* @throws
|
|
7
|
-
* @this {XCUITestDriver}
|
|
8
|
+
* @param service - One of the available service names. This could also be an integer protected resource identifier; see [this list](https://developer.apple.com/documentation/xctest/xcuiprotectedresource?language=objc)
|
|
9
|
+
* @throws If permission reset fails on the device.
|
|
8
10
|
*/
|
|
9
|
-
export function mobileResetPermission(this:
|
|
11
|
+
export declare function mobileResetPermission(this: XCUITestDriver, service: PermissionService | number): Promise<void>;
|
|
10
12
|
/**
|
|
11
13
|
* Gets application permission state on a simulated device.
|
|
12
14
|
*
|
|
13
15
|
* **This method requires [WIX applesimutils](https://github.com/wix/AppleSimulatorUtils) to be installed on the Appium server host.**
|
|
14
16
|
*
|
|
15
|
-
* @param
|
|
16
|
-
* @param
|
|
17
|
-
* @returns
|
|
18
|
-
* @throws
|
|
19
|
-
* @this {XCUITestDriver}
|
|
17
|
+
* @param bundleId - Bundle identifier of the target application
|
|
18
|
+
* @param service - Service name
|
|
19
|
+
* @returns Either 'yes', 'no', 'unset' or 'limited'
|
|
20
|
+
* @throws If permission getting fails or the device is not a Simulator.
|
|
20
21
|
* @group Simulator Only
|
|
21
22
|
*/
|
|
22
|
-
export function mobileGetPermission(this:
|
|
23
|
+
export declare function mobileGetPermission(this: XCUITestDriver, bundleId: string, service: PermissionService): Promise<PermissionState>;
|
|
23
24
|
/**
|
|
24
25
|
* Set application permission state on Simulator.
|
|
25
26
|
*
|
|
26
|
-
* @param
|
|
27
|
-
* @param
|
|
27
|
+
* @param access - One or more access rules to set.
|
|
28
|
+
* @param bundleId - Bundle identifier of the target application
|
|
28
29
|
* @since Xcode SDK 11.4
|
|
29
|
-
* @throws
|
|
30
|
+
* @throws If permission setting fails or the device is not a Simulator.
|
|
30
31
|
* @group Simulator Only
|
|
31
|
-
* @this {XCUITestDriver}
|
|
32
32
|
*/
|
|
33
|
-
export function mobileSetPermissions(this:
|
|
34
|
-
export type XCUITestDriver = import("../driver").XCUITestDriver;
|
|
35
|
-
import { PermissionService } from './enum';
|
|
33
|
+
export declare function mobileSetPermissions(this: XCUITestDriver, access: Record<string, PermissionState>, bundleId: string): Promise<void>;
|
|
36
34
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../lib/commands/permissions.
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../lib/commands/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAAC,MAAM,QAAQ,CAAC;AAEzC,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;AAG7C;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAClC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,eAAe,CAAC,CAS1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -9,14 +9,12 @@ exports.mobileSetPermissions = mobileSetPermissions;
|
|
|
9
9
|
const lodash_1 = __importDefault(require("lodash"));
|
|
10
10
|
const enum_1 = require("./enum");
|
|
11
11
|
const utils_1 = require("../utils");
|
|
12
|
-
const assertSimulator = (driver) => utils_1.assertSimulator.call(driver, 'Permission-related operations');
|
|
13
12
|
/**
|
|
14
13
|
* Resets the given permission for the active application under test.
|
|
15
14
|
* Works for both Simulator and real devices using Xcode SDK 11.4+
|
|
16
15
|
*
|
|
17
|
-
* @param
|
|
18
|
-
* @throws
|
|
19
|
-
* @this {XCUITestDriver}
|
|
16
|
+
* @param service - One of the available service names. This could also be an integer protected resource identifier; see [this list](https://developer.apple.com/documentation/xctest/xcuiprotectedresource?language=objc)
|
|
17
|
+
* @throws If permission reset fails on the device.
|
|
20
18
|
*/
|
|
21
19
|
async function mobileResetPermission(service) {
|
|
22
20
|
if (!service) {
|
|
@@ -43,11 +41,10 @@ async function mobileResetPermission(service) {
|
|
|
43
41
|
*
|
|
44
42
|
* **This method requires [WIX applesimutils](https://github.com/wix/AppleSimulatorUtils) to be installed on the Appium server host.**
|
|
45
43
|
*
|
|
46
|
-
* @param
|
|
47
|
-
* @param
|
|
48
|
-
* @returns
|
|
49
|
-
* @throws
|
|
50
|
-
* @this {XCUITestDriver}
|
|
44
|
+
* @param bundleId - Bundle identifier of the target application
|
|
45
|
+
* @param service - Service name
|
|
46
|
+
* @returns Either 'yes', 'no', 'unset' or 'limited'
|
|
47
|
+
* @throws If permission getting fails or the device is not a Simulator.
|
|
51
48
|
* @group Simulator Only
|
|
52
49
|
*/
|
|
53
50
|
async function mobileGetPermission(bundleId, service) {
|
|
@@ -55,26 +52,23 @@ async function mobileGetPermission(bundleId, service) {
|
|
|
55
52
|
throw new Error(`The 'service' option is expected to be present`);
|
|
56
53
|
}
|
|
57
54
|
assertSimulator(this);
|
|
58
|
-
return
|
|
55
|
+
return await this.device.getPermission(bundleId, String(service));
|
|
59
56
|
}
|
|
60
57
|
/**
|
|
61
58
|
* Set application permission state on Simulator.
|
|
62
59
|
*
|
|
63
|
-
* @param
|
|
64
|
-
* @param
|
|
60
|
+
* @param access - One or more access rules to set.
|
|
61
|
+
* @param bundleId - Bundle identifier of the target application
|
|
65
62
|
* @since Xcode SDK 11.4
|
|
66
|
-
* @throws
|
|
63
|
+
* @throws If permission setting fails or the device is not a Simulator.
|
|
67
64
|
* @group Simulator Only
|
|
68
|
-
* @this {XCUITestDriver}
|
|
69
65
|
*/
|
|
70
66
|
async function mobileSetPermissions(access, bundleId) {
|
|
71
67
|
if (!lodash_1.default.isPlainObject(access)) {
|
|
72
68
|
throw new Error(`The 'access' option is expected to be a map`);
|
|
73
69
|
}
|
|
74
70
|
assertSimulator(this);
|
|
75
|
-
await
|
|
71
|
+
await this.device.setPermissions(bundleId, access);
|
|
76
72
|
}
|
|
77
|
-
|
|
78
|
-
* @typedef {import('../driver').XCUITestDriver} XCUITestDriver
|
|
79
|
-
*/
|
|
73
|
+
const assertSimulator = (driver) => utils_1.assertSimulator.call(driver, 'Permission-related operations');
|
|
80
74
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../lib/commands/permissions.
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../lib/commands/permissions.ts"],"names":[],"mappings":";;;;;AAcA,sDAyBC;AAaD,kDAaC;AAWD,oDAWC;AAvFD,oDAAuB;AACvB,iCAAyC;AACzC,oCAA6D;AAK7D;;;;;;GAMG;AACI,KAAK,UAAU,qBAAqB,CAEzC,OAAmC;IAEnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,QAAgB,CAAC;IACrB,IAAI,gBAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,QAAQ,GAAG,wBAAiB,CAAC,gBAAC,CAAC,OAAO,CAAC,OAAO,CAAmC,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,qCAAqC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAC,CAAC,IAAI,CAAC,wBAAiB,CAAC,CAAC,EAAE,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,gBAAC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,6DAA6D;YAC3D,IAAI,OAAO,qBAAqB,CACnC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,EAAE,EAAC,QAAQ,EAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,mBAAmB,CAEvC,QAAgB,EAChB,OAA0B;IAE1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtB,OAAO,MAAO,IAAI,CAAC,MAAoB,CAAC,aAAa,CACnD,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CACP,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,oBAAoB,CAExC,MAAuC,EACvC,QAAgB;IAEhB,IAAI,CAAC,gBAAC,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAO,IAAI,CAAC,MAAoB,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,MAAsB,EAAE,EAAE,CAAC,uBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
import type { XCUITestDriver } from '../driver';
|
|
2
|
+
export type AllowedHttpMethod = 'GET' | 'POST' | 'DELETE';
|
|
1
3
|
/**
|
|
2
4
|
* Proxies a command to WebDriverAgent
|
|
3
|
-
*
|
|
4
|
-
* @template
|
|
5
|
-
* @
|
|
6
|
-
* @param
|
|
7
|
-
* @param
|
|
8
|
-
* @param
|
|
9
|
-
* @this
|
|
10
|
-
* @returns
|
|
5
|
+
*
|
|
6
|
+
* @template TReq - Request body type
|
|
7
|
+
* @template TRes - Response type
|
|
8
|
+
* @param url - The endpoint URL
|
|
9
|
+
* @param method - HTTP method to use
|
|
10
|
+
* @param body - Optional request body
|
|
11
|
+
* @param isSessionCommand - Whether this is a session command (default: true)
|
|
12
|
+
* @returns Promise resolving to the response
|
|
11
13
|
*/
|
|
12
|
-
export function proxyCommand<TReq = any, TRes = unknown>(this:
|
|
13
|
-
export type XCUITestDriver = import("../driver").XCUITestDriver;
|
|
14
|
-
export type AllowedHttpMethod = "GET" | "POST" | "DELETE";
|
|
14
|
+
export declare function proxyCommand<TReq = any, TRes = unknown>(this: XCUITestDriver, url: string, method: AllowedHttpMethod, body?: TReq, isSessionCommand?: boolean): Promise<TRes>;
|
|
15
15
|
//# sourceMappingURL=proxy-helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-helper.d.ts","sourceRoot":"","sources":["../../../lib/commands/proxy-helper.
|
|
1
|
+
{"version":3,"file":"proxy-helper.d.ts","sourceRoot":"","sources":["../../../lib/commands/proxy-helper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AA8C9C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,OAAO,EAC3D,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,IAAI,EACX,gBAAgB,GAAE,OAAc,GAC/B,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
|
@@ -9,8 +9,8 @@ const bluebird_1 = __importDefault(require("bluebird"));
|
|
|
9
9
|
const GET = 'GET';
|
|
10
10
|
const POST = 'POST';
|
|
11
11
|
const DELETE = 'DELETE';
|
|
12
|
-
const SUPPORTED_METHODS = Object.freeze(new Set(
|
|
13
|
-
const WDA_ROUTES =
|
|
12
|
+
const SUPPORTED_METHODS = Object.freeze(new Set([GET, POST, DELETE]));
|
|
13
|
+
const WDA_ROUTES = {
|
|
14
14
|
'/wda/screen': {
|
|
15
15
|
GET: 'getScreenInfo',
|
|
16
16
|
},
|
|
@@ -47,21 +47,21 @@ const WDA_ROUTES = /** @type {const} */ ({
|
|
|
47
47
|
'/wda/locked': {
|
|
48
48
|
GET: 'isLocked',
|
|
49
49
|
},
|
|
50
|
-
}
|
|
50
|
+
};
|
|
51
51
|
/**
|
|
52
52
|
* Proxies a command to WebDriverAgent
|
|
53
|
-
*
|
|
54
|
-
* @template
|
|
55
|
-
* @
|
|
56
|
-
* @param
|
|
57
|
-
* @param
|
|
58
|
-
* @param
|
|
59
|
-
* @this
|
|
60
|
-
* @returns
|
|
53
|
+
*
|
|
54
|
+
* @template TReq - Request body type
|
|
55
|
+
* @template TRes - Response type
|
|
56
|
+
* @param url - The endpoint URL
|
|
57
|
+
* @param method - HTTP method to use
|
|
58
|
+
* @param body - Optional request body
|
|
59
|
+
* @param isSessionCommand - Whether this is a session command (default: true)
|
|
60
|
+
* @returns Promise resolving to the response
|
|
61
61
|
*/
|
|
62
62
|
async function proxyCommand(url, method, body, isSessionCommand = true) {
|
|
63
63
|
if (this.shutdownUnexpectedly) {
|
|
64
|
-
return
|
|
64
|
+
return undefined;
|
|
65
65
|
}
|
|
66
66
|
if (!url) {
|
|
67
67
|
throw this.log.errorWithException('Proxying requires an endpoint');
|
|
@@ -81,11 +81,11 @@ async function proxyCommand(url, method, body, isSessionCommand = true) {
|
|
|
81
81
|
this.log.info(`Proxying to WDA with an unknown route: ${method} ${url}`);
|
|
82
82
|
}
|
|
83
83
|
if (!timeout) {
|
|
84
|
-
return
|
|
84
|
+
return await proxy.command(url, method, body);
|
|
85
85
|
}
|
|
86
86
|
this.log.debug(`Setting custom timeout to ${timeout} ms for '${cmdName}' command`);
|
|
87
87
|
try {
|
|
88
|
-
return
|
|
88
|
+
return await bluebird_1.default.resolve(proxy.command(url, method, body)).timeout(timeout);
|
|
89
89
|
}
|
|
90
90
|
catch (e) {
|
|
91
91
|
if (!(e instanceof bluebird_1.default.Promise.TimeoutError)) {
|
|
@@ -97,18 +97,9 @@ async function proxyCommand(url, method, body, isSessionCommand = true) {
|
|
|
97
97
|
throw error;
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
/**
|
|
101
|
-
* @param {string} endpoint
|
|
102
|
-
* @param {AllowedHttpMethod} method
|
|
103
|
-
* @returns {string|undefined}
|
|
104
|
-
*/
|
|
105
100
|
function wdaRouteToCommandName(endpoint, method) {
|
|
106
101
|
if (endpoint in WDA_ROUTES) {
|
|
107
|
-
return WDA_ROUTES[endpoint][method];
|
|
102
|
+
return WDA_ROUTES[endpoint]?.[method];
|
|
108
103
|
}
|
|
109
104
|
}
|
|
110
|
-
/**
|
|
111
|
-
* @typedef {import('../driver').XCUITestDriver} XCUITestDriver
|
|
112
|
-
* @typedef {'GET'|'POST'|'DELETE'} AllowedHttpMethod
|
|
113
|
-
*/
|
|
114
105
|
//# sourceMappingURL=proxy-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-helper.js","sourceRoot":"","sources":["../../../lib/commands/proxy-helper.
|
|
1
|
+
{"version":3,"file":"proxy-helper.js","sourceRoot":"","sources":["../../../lib/commands/proxy-helper.ts"],"names":[],"mappings":"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"}
|