appium-uiautomator2-driver 6.7.2 → 6.7.4
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 +12 -0
- package/build/lib/commands/find.js +2 -5
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/css-converter.d.ts +9 -42
- package/build/lib/css-converter.d.ts.map +1 -1
- package/build/lib/css-converter.js +73 -148
- package/build/lib/css-converter.js.map +1 -1
- package/build/lib/extensions.d.ts +2 -2
- package/build/lib/extensions.d.ts.map +1 -1
- package/build/lib/extensions.js +2 -4
- package/build/lib/extensions.js.map +1 -1
- package/build/lib/helpers.d.ts +3 -12
- package/build/lib/helpers.d.ts.map +1 -1
- package/build/lib/helpers.js +1 -11
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/logger.d.ts +1 -2
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +2 -2
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator2.d.ts +1 -1
- package/build/lib/uiautomator2.d.ts.map +1 -1
- package/build/lib/uiautomator2.js +0 -1
- package/build/lib/uiautomator2.js.map +1 -1
- package/build/test/unit/css-converter-specs.js +3 -6
- package/build/test/unit/css-converter-specs.js.map +1 -1
- package/build/test/unit/uiautomator2-specs.js +4 -4
- package/build/test/unit/uiautomator2-specs.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/commands/find.js +1 -1
- package/lib/css-converter.ts +283 -0
- package/lib/extensions.ts +3 -0
- package/lib/helpers.ts +31 -0
- package/lib/logger.ts +4 -0
- package/lib/uiautomator2.ts +0 -1
- package/npm-shrinkwrap.json +85 -27
- package/package.json +2 -2
- package/lib/css-converter.js +0 -329
- package/lib/extensions.js +0 -4
- package/lib/helpers.js +0 -37
- package/lib/logger.js +0 -6
package/lib/commands/find.js
CHANGED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import {createParser} from 'css-selector-parser';
|
|
2
|
+
import type {
|
|
3
|
+
AstAttribute,
|
|
4
|
+
AstClassName,
|
|
5
|
+
AstId,
|
|
6
|
+
AstPseudoClass,
|
|
7
|
+
AstRule,
|
|
8
|
+
AstSelector,
|
|
9
|
+
AstTagName,
|
|
10
|
+
} from 'css-selector-parser';
|
|
11
|
+
import _ from 'lodash';
|
|
12
|
+
import {errors} from 'appium/driver';
|
|
13
|
+
import {log} from './logger';
|
|
14
|
+
|
|
15
|
+
const parseCssSelector = createParser({
|
|
16
|
+
syntax: {
|
|
17
|
+
pseudoClasses: {
|
|
18
|
+
unknown: 'accept',
|
|
19
|
+
definitions: {
|
|
20
|
+
Selector: ['has'],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
combinators: ['>', '+', '~'],
|
|
24
|
+
attributes: {
|
|
25
|
+
operators: ['^=', '$=', '*=', '~=', '='],
|
|
26
|
+
},
|
|
27
|
+
ids: true,
|
|
28
|
+
classNames: true,
|
|
29
|
+
tag: {
|
|
30
|
+
wildcard: true,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
substitutes: true,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const RESOURCE_ID = 'resource-id';
|
|
37
|
+
const ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\/[\S]+$/;
|
|
38
|
+
|
|
39
|
+
const BOOLEAN_ATTRS = [
|
|
40
|
+
'checkable',
|
|
41
|
+
'checked',
|
|
42
|
+
'clickable',
|
|
43
|
+
'enabled',
|
|
44
|
+
'focusable',
|
|
45
|
+
'focused',
|
|
46
|
+
'long-clickable',
|
|
47
|
+
'scrollable',
|
|
48
|
+
'selected',
|
|
49
|
+
] as const;
|
|
50
|
+
|
|
51
|
+
const NUMERIC_ATTRS = ['index', 'instance'] as const;
|
|
52
|
+
|
|
53
|
+
const STR_ATTRS = ['description', RESOURCE_ID, 'text', 'class-name', 'package-name'] as const;
|
|
54
|
+
|
|
55
|
+
const ALL_ATTRS = [...BOOLEAN_ATTRS, ...NUMERIC_ATTRS, ...STR_ATTRS] as readonly string[];
|
|
56
|
+
|
|
57
|
+
const ATTRIBUTE_ALIASES: Array<[string, string[]]> = [
|
|
58
|
+
[RESOURCE_ID, ['id']],
|
|
59
|
+
[
|
|
60
|
+
'description',
|
|
61
|
+
['content-description', 'content-desc', 'desc', 'accessibility-id'],
|
|
62
|
+
],
|
|
63
|
+
['index', ['nth-child']],
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const isAstAttribute = (item: {type?: string}): item is AstAttribute =>
|
|
67
|
+
item.type === 'Attribute';
|
|
68
|
+
const isAstPseudoClass = (item: {type?: string}): item is AstPseudoClass =>
|
|
69
|
+
item.type === 'PseudoClass';
|
|
70
|
+
const isAstClassName = (item: {type?: string}): item is AstClassName =>
|
|
71
|
+
item.type === 'ClassName';
|
|
72
|
+
const isAstTagName = (item: {type?: string}): item is AstTagName => item.type === 'TagName';
|
|
73
|
+
const isAstId = (item: {type?: string}): item is AstId => item.type === 'Id';
|
|
74
|
+
|
|
75
|
+
function toSnakeCase(str?: string | null): string {
|
|
76
|
+
if (!str) {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
const tokens = str
|
|
80
|
+
.split('-')
|
|
81
|
+
.map((token) => token.charAt(0).toUpperCase() + token.slice(1).toLowerCase());
|
|
82
|
+
const out = tokens.join('');
|
|
83
|
+
return out.charAt(0).toLowerCase() + out.slice(1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function requireBoolean(css: AstAttribute | AstPseudoClass): 'true' | 'false' {
|
|
87
|
+
const rawValue = (css as any).value?.value ?? (css as any).argument?.value;
|
|
88
|
+
const value = _.toLower(rawValue ?? 'true');
|
|
89
|
+
if (value === 'true') {
|
|
90
|
+
return 'true';
|
|
91
|
+
}
|
|
92
|
+
if (value === 'false') {
|
|
93
|
+
return 'false';
|
|
94
|
+
}
|
|
95
|
+
throw new Error(
|
|
96
|
+
`'${css.name}' must be true, false or empty. Found '${(css as any).value}'`,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function requireEntityName(cssEntity: AstAttribute | AstPseudoClass): string {
|
|
101
|
+
const attrName = cssEntity.name.toLowerCase();
|
|
102
|
+
|
|
103
|
+
if (ALL_ATTRS.includes(attrName)) {
|
|
104
|
+
return attrName;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
|
|
108
|
+
if (aliasAttrs.includes(attrName)) {
|
|
109
|
+
return officialAttr;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
throw new Error(
|
|
113
|
+
`'${attrName}' is not a valid attribute. Supported attributes are '${ALL_ATTRS.join(', ')}'`,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function getWordMatcherRegex(word: string): string {
|
|
118
|
+
return `\\b(\\w*${_.escapeRegExp(word)}\\w*)\\b`;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export class CssConverter {
|
|
122
|
+
constructor(
|
|
123
|
+
private readonly selector: string,
|
|
124
|
+
private readonly pkg?: string | null,
|
|
125
|
+
) {}
|
|
126
|
+
|
|
127
|
+
toUiAutomatorSelector(): string {
|
|
128
|
+
let cssObj: AstSelector;
|
|
129
|
+
try {
|
|
130
|
+
cssObj = parseCssSelector(this.selector) as AstSelector;
|
|
131
|
+
} catch (e: any) {
|
|
132
|
+
log.debug(e.stack);
|
|
133
|
+
throw new errors.InvalidSelectorError(
|
|
134
|
+
`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
return this.parseCssObject(cssObj);
|
|
139
|
+
} catch (e: any) {
|
|
140
|
+
log.debug(e.stack);
|
|
141
|
+
throw new errors.InvalidSelectorError(
|
|
142
|
+
`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private formatIdLocator(locator: string): string {
|
|
148
|
+
return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private parseAttr(cssAttr: AstAttribute): string {
|
|
152
|
+
const attrValueNode = cssAttr.value as {value?: string} | undefined;
|
|
153
|
+
const attrValue = attrValueNode?.value;
|
|
154
|
+
if (!_.isString(attrValue) && !_.isEmpty(attrValue)) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`'${cssAttr.name}=${attrValue}' is an invalid attribute. Only 'string' and empty attribute types are supported. Found '${attrValue}'`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
const attrName = requireEntityName(cssAttr);
|
|
160
|
+
const methodName = toSnakeCase(attrName);
|
|
161
|
+
|
|
162
|
+
if (!STR_ATTRS.includes(attrName as (typeof STR_ATTRS)[number]) && !BOOLEAN_ATTRS.includes(attrName as (typeof BOOLEAN_ATTRS)[number])) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
`'${attrName}' is not supported. Supported attributes are '${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (BOOLEAN_ATTRS.includes(attrName as (typeof BOOLEAN_ATTRS)[number])) {
|
|
169
|
+
return `.${methodName}(${requireBoolean(cssAttr)})`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
let value = attrValue || '';
|
|
173
|
+
if (attrName === RESOURCE_ID) {
|
|
174
|
+
value = this.formatIdLocator(value);
|
|
175
|
+
}
|
|
176
|
+
if (value === '') {
|
|
177
|
+
return `.${methodName}Matches("")`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
switch (cssAttr.operator) {
|
|
181
|
+
case '=':
|
|
182
|
+
return `.${methodName}("${value}")`;
|
|
183
|
+
case '*=':
|
|
184
|
+
if (['description', 'text'].includes(attrName)) {
|
|
185
|
+
return `.${methodName}Contains("${value}")`;
|
|
186
|
+
}
|
|
187
|
+
return `.${methodName}Matches("${_.escapeRegExp(value)}")`;
|
|
188
|
+
case '^=':
|
|
189
|
+
if (['description', 'text'].includes(attrName)) {
|
|
190
|
+
return `.${methodName}StartsWith("${value}")`;
|
|
191
|
+
}
|
|
192
|
+
return `.${methodName}Matches("^${_.escapeRegExp(value)}")`;
|
|
193
|
+
case '$=':
|
|
194
|
+
return `.${methodName}Matches("${_.escapeRegExp(value)}$")`;
|
|
195
|
+
case '~=':
|
|
196
|
+
return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
|
|
197
|
+
default:
|
|
198
|
+
throw new Error(
|
|
199
|
+
`Unsupported CSS attribute operator '${cssAttr.operator}'. '=', '*=', '^=', '$=' and '~=' are supported.`,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private parsePseudo(cssPseudo: AstPseudoClass): string | undefined {
|
|
205
|
+
const argValue = (cssPseudo.argument as {value?: string} | undefined)?.value;
|
|
206
|
+
if (!_.isString(argValue) && !_.isEmpty(argValue)) {
|
|
207
|
+
throw new Error(
|
|
208
|
+
`'${cssPseudo.name}=${argValue}'. Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`,
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const pseudoName = requireEntityName(cssPseudo);
|
|
213
|
+
|
|
214
|
+
if (BOOLEAN_ATTRS.includes(pseudoName as (typeof BOOLEAN_ATTRS)[number])) {
|
|
215
|
+
return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (NUMERIC_ATTRS.includes(pseudoName as (typeof NUMERIC_ATTRS)[number])) {
|
|
219
|
+
return `.${pseudoName}(${argValue})`;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
private parseCssRule(cssRule: AstRule): string {
|
|
224
|
+
if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {
|
|
225
|
+
throw new Error(
|
|
226
|
+
`'${cssRule.combinator}' is not a supported combinator. Only child combinator (>) and descendant combinator are supported.`,
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const uiAutomatorSelector: string[] = ['new UiSelector()'];
|
|
231
|
+
const items = cssRule.items ?? [];
|
|
232
|
+
|
|
233
|
+
const astClassNames = items.filter(isAstClassName);
|
|
234
|
+
const classNames = astClassNames.map(({name}) => name);
|
|
235
|
+
|
|
236
|
+
const astTag = items.find(isAstTagName);
|
|
237
|
+
const tagName = astTag?.name;
|
|
238
|
+
if (tagName && tagName !== '*') {
|
|
239
|
+
const androidClass = [tagName];
|
|
240
|
+
if (classNames.length) {
|
|
241
|
+
for (const cssClassNames of classNames) {
|
|
242
|
+
androidClass.push(cssClassNames);
|
|
243
|
+
}
|
|
244
|
+
uiAutomatorSelector.push(`.className("${androidClass.join('.')}")`);
|
|
245
|
+
} else {
|
|
246
|
+
uiAutomatorSelector.push(`.classNameMatches("${tagName}")`);
|
|
247
|
+
}
|
|
248
|
+
} else if (classNames.length) {
|
|
249
|
+
uiAutomatorSelector.push(`.classNameMatches("${classNames.join('\\.')}")`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const astIds = items.filter(isAstId);
|
|
253
|
+
const ids = astIds.map(({name}) => name);
|
|
254
|
+
if (ids.length) {
|
|
255
|
+
uiAutomatorSelector.push(`.resourceId("${this.formatIdLocator(ids[0])}")`);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const attributes = items.filter(isAstAttribute);
|
|
259
|
+
for (const attr of attributes) {
|
|
260
|
+
uiAutomatorSelector.push(this.parseAttr(attr));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const pseudoClasses = items.filter(isAstPseudoClass);
|
|
264
|
+
for (const pseudo of pseudoClasses) {
|
|
265
|
+
const sel = this.parsePseudo(pseudo);
|
|
266
|
+
if (sel) {
|
|
267
|
+
uiAutomatorSelector.push(sel);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (cssRule.nestedRule) {
|
|
271
|
+
uiAutomatorSelector.push(`.childSelector(${this.parseCssRule(cssRule.nestedRule)})`);
|
|
272
|
+
}
|
|
273
|
+
return uiAutomatorSelector.join('');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
private parseCssObject(css: AstSelector): string {
|
|
277
|
+
if (!_.isEmpty(css.rules)) {
|
|
278
|
+
return this.parseCssRule(css.rules[0] as AstRule);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
throw new Error('No rules could be parsed out of the current selector');
|
|
282
|
+
}
|
|
283
|
+
}
|
package/lib/helpers.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import type {ADB} from 'appium-adb';
|
|
3
|
+
import {fs, system} from 'appium/support';
|
|
4
|
+
|
|
5
|
+
export async function isWriteable(filePath: string): Promise<boolean> {
|
|
6
|
+
try {
|
|
7
|
+
await fs.access(filePath, fs.constants.W_OK);
|
|
8
|
+
if (system.isWindows()) {
|
|
9
|
+
// On operating systems, where access-control policies may
|
|
10
|
+
// limit access to the file system, `fs.access` does not work
|
|
11
|
+
// as expected. See https://groups.google.com/forum/#!topic/nodejs/qmZtIwDRSYo
|
|
12
|
+
// for more details
|
|
13
|
+
await fs.close(await fs.open(filePath, 'r+'));
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function signApp(adb: ADB, appPath: string): Promise<void> {
|
|
22
|
+
if (!(await isWriteable(appPath))) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
`The application at '${appPath}' is not writeable. ` +
|
|
25
|
+
`Please grant write permissions to this file or to its parent folder '${path.dirname(appPath)}' ` +
|
|
26
|
+
`for the Appium process, so it could sign the application`,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
await adb.sign(appPath);
|
|
30
|
+
}
|
|
31
|
+
|
package/lib/logger.ts
ADDED
package/lib/uiautomator2.ts
CHANGED
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-uiautomator2-driver",
|
|
3
|
-
"version": "6.7.
|
|
3
|
+
"version": "6.7.4",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "appium-uiautomator2-driver",
|
|
9
|
-
"version": "6.7.
|
|
9
|
+
"version": "6.7.4",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"appium-adb": "^14.0.0",
|
|
13
13
|
"appium-android-driver": "^12.4.0",
|
|
14
14
|
"appium-uiautomator2-server": "^9.8.0",
|
|
15
|
-
"asyncbox": "^
|
|
15
|
+
"asyncbox": "^4.0.1",
|
|
16
16
|
"axios": "^1.12.2",
|
|
17
17
|
"bluebird": "^3.5.1",
|
|
18
18
|
"css-selector-parser": "^3.0.0",
|
|
@@ -93,6 +93,20 @@
|
|
|
93
93
|
"spdy": "4.0.2"
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
|
+
"node_modules/@appium/base-driver/node_modules/asyncbox": {
|
|
97
|
+
"version": "3.0.0",
|
|
98
|
+
"resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
|
|
99
|
+
"integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
|
|
100
|
+
"license": "Apache-2.0",
|
|
101
|
+
"dependencies": {
|
|
102
|
+
"bluebird": "^3.5.1",
|
|
103
|
+
"lodash": "^4.17.4",
|
|
104
|
+
"source-map-support": "^0.x"
|
|
105
|
+
},
|
|
106
|
+
"engines": {
|
|
107
|
+
"node": ">=16"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
96
110
|
"node_modules/@appium/base-plugin": {
|
|
97
111
|
"version": "3.0.5",
|
|
98
112
|
"resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.5.tgz",
|
|
@@ -612,14 +626,14 @@
|
|
|
612
626
|
}
|
|
613
627
|
},
|
|
614
628
|
"node_modules/appium-adb": {
|
|
615
|
-
"version": "14.1.
|
|
616
|
-
"resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.1.
|
|
617
|
-
"integrity": "sha512
|
|
629
|
+
"version": "14.1.7",
|
|
630
|
+
"resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.1.7.tgz",
|
|
631
|
+
"integrity": "sha512-/06TJ7maIJ4RzKmXdnqVNBhBZqoxAwoDeYBEaRm8Dbsa803Io16CJ94R3ncpQwlD5r5bsj4YMmwdZtVZKMjsLw==",
|
|
618
632
|
"license": "Apache-2.0",
|
|
619
633
|
"dependencies": {
|
|
620
634
|
"@appium/support": "^7.0.0-rc.1",
|
|
621
635
|
"async-lock": "^1.0.0",
|
|
622
|
-
"asyncbox": "^
|
|
636
|
+
"asyncbox": "^4.0.1",
|
|
623
637
|
"bluebird": "^3.4.7",
|
|
624
638
|
"ini": "^6.0.0",
|
|
625
639
|
"lodash": "^4.0.0",
|
|
@@ -633,16 +647,16 @@
|
|
|
633
647
|
}
|
|
634
648
|
},
|
|
635
649
|
"node_modules/appium-android-driver": {
|
|
636
|
-
"version": "12.
|
|
637
|
-
"resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-12.
|
|
638
|
-
"integrity": "sha512-
|
|
650
|
+
"version": "12.6.1",
|
|
651
|
+
"resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-12.6.1.tgz",
|
|
652
|
+
"integrity": "sha512-JFO6ouwGHYgC/knkPBVvKwtAqtaiCIPgUlVGmCngCtnLt2Zk4B0Sv+M1J8Elm1olFpCv/Jmb6kRxcEqHh1yRjg==",
|
|
639
653
|
"license": "Apache-2.0",
|
|
640
654
|
"dependencies": {
|
|
641
655
|
"@appium/support": "^7.0.0-rc.1",
|
|
642
656
|
"@colors/colors": "^1.6.0",
|
|
643
657
|
"appium-adb": "^14.1.0",
|
|
644
658
|
"appium-chromedriver": "^8.0.18",
|
|
645
|
-
"asyncbox": "^
|
|
659
|
+
"asyncbox": "^4.0.1",
|
|
646
660
|
"axios": "^1.x",
|
|
647
661
|
"bluebird": "^3.4.7",
|
|
648
662
|
"io.appium.settings": "^7.0.4",
|
|
@@ -664,22 +678,22 @@
|
|
|
664
678
|
}
|
|
665
679
|
},
|
|
666
680
|
"node_modules/appium-chromedriver": {
|
|
667
|
-
"version": "8.0.
|
|
668
|
-
"resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.
|
|
669
|
-
"integrity": "sha512-
|
|
681
|
+
"version": "8.0.31",
|
|
682
|
+
"resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.31.tgz",
|
|
683
|
+
"integrity": "sha512-hmamyXXsRwzhYoMbNzfdL1t/lCb0o0vLf63WpK/SgLwlcO2ut6MunT729KQSlFzOlLpndtE1H+LCX5KFyPDuMw==",
|
|
670
684
|
"license": "Apache-2.0",
|
|
671
685
|
"dependencies": {
|
|
672
686
|
"@appium/base-driver": "^10.0.0-rc.2",
|
|
673
687
|
"@appium/support": "^7.0.0-rc.1",
|
|
674
688
|
"@xmldom/xmldom": "^0.x",
|
|
675
689
|
"appium-adb": "^14.0.0",
|
|
676
|
-
"asyncbox": "^
|
|
690
|
+
"asyncbox": "^4.0.1",
|
|
677
691
|
"axios": "^1.6.5",
|
|
678
692
|
"bluebird": "^3.5.1",
|
|
679
693
|
"compare-versions": "^6.0.0",
|
|
680
694
|
"lodash": "^4.17.4",
|
|
681
695
|
"semver": "^7.0.0",
|
|
682
|
-
"teen_process": "^
|
|
696
|
+
"teen_process": "^4.0.4",
|
|
683
697
|
"xpath": "^0.x"
|
|
684
698
|
},
|
|
685
699
|
"engines": {
|
|
@@ -687,6 +701,21 @@
|
|
|
687
701
|
"npm": ">=10"
|
|
688
702
|
}
|
|
689
703
|
},
|
|
704
|
+
"node_modules/appium-chromedriver/node_modules/teen_process": {
|
|
705
|
+
"version": "4.0.5",
|
|
706
|
+
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-4.0.5.tgz",
|
|
707
|
+
"integrity": "sha512-ZQQ2Vjs1/maFzpzfsZRAlQVSZrUBsKzAItaxSLImsHRTdI8hVt9Jm0JHyWFbrvvAf78V55BM3ZgNeQpXcXsWpw==",
|
|
708
|
+
"license": "Apache-2.0",
|
|
709
|
+
"dependencies": {
|
|
710
|
+
"bluebird": "^3.7.2",
|
|
711
|
+
"lodash": "^4.17.21",
|
|
712
|
+
"shell-quote": "^1.8.1"
|
|
713
|
+
},
|
|
714
|
+
"engines": {
|
|
715
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
716
|
+
"npm": ">=10"
|
|
717
|
+
}
|
|
718
|
+
},
|
|
690
719
|
"node_modules/appium-uiautomator2-server": {
|
|
691
720
|
"version": "9.9.0",
|
|
692
721
|
"resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-9.9.0.tgz",
|
|
@@ -697,6 +726,20 @@
|
|
|
697
726
|
"npm": ">=10"
|
|
698
727
|
}
|
|
699
728
|
},
|
|
729
|
+
"node_modules/appium/node_modules/asyncbox": {
|
|
730
|
+
"version": "3.0.0",
|
|
731
|
+
"resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
|
|
732
|
+
"integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
|
|
733
|
+
"license": "Apache-2.0",
|
|
734
|
+
"dependencies": {
|
|
735
|
+
"bluebird": "^3.5.1",
|
|
736
|
+
"lodash": "^4.17.4",
|
|
737
|
+
"source-map-support": "^0.x"
|
|
738
|
+
},
|
|
739
|
+
"engines": {
|
|
740
|
+
"node": ">=16"
|
|
741
|
+
}
|
|
742
|
+
},
|
|
700
743
|
"node_modules/appium/node_modules/teen_process": {
|
|
701
744
|
"version": "3.0.4",
|
|
702
745
|
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.4.tgz",
|
|
@@ -834,17 +877,17 @@
|
|
|
834
877
|
"license": "MIT"
|
|
835
878
|
},
|
|
836
879
|
"node_modules/asyncbox": {
|
|
837
|
-
"version": "
|
|
838
|
-
"resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-
|
|
839
|
-
"integrity": "sha512-
|
|
880
|
+
"version": "4.0.1",
|
|
881
|
+
"resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-4.0.1.tgz",
|
|
882
|
+
"integrity": "sha512-JtbRZ6JWq1eT0mq/Eg2yObjnX9+80QcYQXDYyLxeNcbu2jHjbV18De2eyn69GTWbbLvDm52Pp/4SFDtte3q/bQ==",
|
|
840
883
|
"license": "Apache-2.0",
|
|
841
884
|
"dependencies": {
|
|
842
885
|
"bluebird": "^3.5.1",
|
|
843
|
-
"lodash": "^4.17.4"
|
|
844
|
-
"source-map-support": "^0.x"
|
|
886
|
+
"lodash": "^4.17.4"
|
|
845
887
|
},
|
|
846
888
|
"engines": {
|
|
847
|
-
"node": ">=
|
|
889
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
890
|
+
"npm": ">=10"
|
|
848
891
|
}
|
|
849
892
|
},
|
|
850
893
|
"node_modules/asynckit": {
|
|
@@ -2314,17 +2357,32 @@
|
|
|
2314
2357
|
}
|
|
2315
2358
|
},
|
|
2316
2359
|
"node_modules/io.appium.settings": {
|
|
2317
|
-
"version": "7.0.
|
|
2318
|
-
"resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.
|
|
2319
|
-
"integrity": "sha512-
|
|
2360
|
+
"version": "7.0.8",
|
|
2361
|
+
"resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.8.tgz",
|
|
2362
|
+
"integrity": "sha512-KScrHILMWgEGbKvN37OHqTyROaez6yLdndK5ceF/BXS8eEnhBjrSk9xd9yZiUv+22u2ZbYcYMUJglp0aGUhXPA==",
|
|
2320
2363
|
"license": "Apache-2.0",
|
|
2321
2364
|
"dependencies": {
|
|
2322
2365
|
"@appium/logger": "^2.0.0-rc.1",
|
|
2323
|
-
"asyncbox": "^
|
|
2366
|
+
"asyncbox": "^4.0.1",
|
|
2324
2367
|
"bluebird": "^3.5.1",
|
|
2325
2368
|
"lodash": "^4.2.1",
|
|
2326
2369
|
"semver": "^7.5.4",
|
|
2327
|
-
"teen_process": "^
|
|
2370
|
+
"teen_process": "^4.0.4"
|
|
2371
|
+
},
|
|
2372
|
+
"engines": {
|
|
2373
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
2374
|
+
"npm": ">=10"
|
|
2375
|
+
}
|
|
2376
|
+
},
|
|
2377
|
+
"node_modules/io.appium.settings/node_modules/teen_process": {
|
|
2378
|
+
"version": "4.0.5",
|
|
2379
|
+
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-4.0.5.tgz",
|
|
2380
|
+
"integrity": "sha512-ZQQ2Vjs1/maFzpzfsZRAlQVSZrUBsKzAItaxSLImsHRTdI8hVt9Jm0JHyWFbrvvAf78V55BM3ZgNeQpXcXsWpw==",
|
|
2381
|
+
"license": "Apache-2.0",
|
|
2382
|
+
"dependencies": {
|
|
2383
|
+
"bluebird": "^3.7.2",
|
|
2384
|
+
"lodash": "^4.17.21",
|
|
2385
|
+
"shell-quote": "^1.8.1"
|
|
2328
2386
|
},
|
|
2329
2387
|
"engines": {
|
|
2330
2388
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"automated testing",
|
|
8
8
|
"android"
|
|
9
9
|
],
|
|
10
|
-
"version": "6.7.
|
|
10
|
+
"version": "6.7.4",
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/appium/appium-uiautomator2-driver/issues"
|
|
13
13
|
},
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"appium-adb": "^14.0.0",
|
|
60
60
|
"appium-android-driver": "^12.4.0",
|
|
61
61
|
"appium-uiautomator2-server": "^9.8.0",
|
|
62
|
-
"asyncbox": "^
|
|
62
|
+
"asyncbox": "^4.0.1",
|
|
63
63
|
"axios": "^1.12.2",
|
|
64
64
|
"bluebird": "^3.5.1",
|
|
65
65
|
"css-selector-parser": "^3.0.0",
|