appium-uiautomator2-driver 6.7.3 → 6.7.5
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 +47 -59
- 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,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-uiautomator2-driver",
|
|
3
|
-
"version": "6.7.
|
|
3
|
+
"version": "6.7.5",
|
|
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.5",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"appium-adb": "^14.0.0",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"io.appium.settings": "^7.0.1",
|
|
20
20
|
"lodash": "^4.17.4",
|
|
21
21
|
"portscanner": "^2.2.0",
|
|
22
|
-
"teen_process": "^
|
|
22
|
+
"teen_process": "^4.0.4"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@appium/docutils": "^2.0.0-rc.1",
|
|
@@ -626,14 +626,14 @@
|
|
|
626
626
|
}
|
|
627
627
|
},
|
|
628
628
|
"node_modules/appium-adb": {
|
|
629
|
-
"version": "14.1.
|
|
630
|
-
"resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.1.
|
|
631
|
-
"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==",
|
|
632
632
|
"license": "Apache-2.0",
|
|
633
633
|
"dependencies": {
|
|
634
634
|
"@appium/support": "^7.0.0-rc.1",
|
|
635
635
|
"async-lock": "^1.0.0",
|
|
636
|
-
"asyncbox": "^
|
|
636
|
+
"asyncbox": "^4.0.1",
|
|
637
637
|
"bluebird": "^3.4.7",
|
|
638
638
|
"ini": "^6.0.0",
|
|
639
639
|
"lodash": "^4.0.0",
|
|
@@ -646,24 +646,25 @@
|
|
|
646
646
|
"npm": ">=10"
|
|
647
647
|
}
|
|
648
648
|
},
|
|
649
|
-
"node_modules/appium-adb/node_modules/
|
|
650
|
-
"version": "3.0.
|
|
651
|
-
"resolved": "https://registry.npmjs.org/
|
|
652
|
-
"integrity": "sha512-
|
|
649
|
+
"node_modules/appium-adb/node_modules/teen_process": {
|
|
650
|
+
"version": "3.0.6",
|
|
651
|
+
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.6.tgz",
|
|
652
|
+
"integrity": "sha512-nUw1B4MogSZzzy67n37IM1vg4doj+bWOZ7VwIFZGfD7MDmO+FRlhQlA2+22xJnTELVDDlOaTAMpKuuMI2vkDtg==",
|
|
653
653
|
"license": "Apache-2.0",
|
|
654
654
|
"dependencies": {
|
|
655
|
-
"bluebird": "^3.
|
|
656
|
-
"lodash": "^4.17.
|
|
657
|
-
"
|
|
655
|
+
"bluebird": "^3.7.2",
|
|
656
|
+
"lodash": "^4.17.21",
|
|
657
|
+
"shell-quote": "^1.8.1"
|
|
658
658
|
},
|
|
659
659
|
"engines": {
|
|
660
|
-
"node": ">=
|
|
660
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
661
|
+
"npm": ">=10"
|
|
661
662
|
}
|
|
662
663
|
},
|
|
663
664
|
"node_modules/appium-android-driver": {
|
|
664
|
-
"version": "12.
|
|
665
|
-
"resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-12.
|
|
666
|
-
"integrity": "sha512-
|
|
665
|
+
"version": "12.6.1",
|
|
666
|
+
"resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-12.6.1.tgz",
|
|
667
|
+
"integrity": "sha512-JFO6ouwGHYgC/knkPBVvKwtAqtaiCIPgUlVGmCngCtnLt2Zk4B0Sv+M1J8Elm1olFpCv/Jmb6kRxcEqHh1yRjg==",
|
|
667
668
|
"license": "Apache-2.0",
|
|
668
669
|
"dependencies": {
|
|
669
670
|
"@appium/support": "^7.0.0-rc.1",
|
|
@@ -691,23 +692,38 @@
|
|
|
691
692
|
"appium": "^3.0.0-rc.2"
|
|
692
693
|
}
|
|
693
694
|
},
|
|
695
|
+
"node_modules/appium-android-driver/node_modules/teen_process": {
|
|
696
|
+
"version": "3.0.6",
|
|
697
|
+
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.6.tgz",
|
|
698
|
+
"integrity": "sha512-nUw1B4MogSZzzy67n37IM1vg4doj+bWOZ7VwIFZGfD7MDmO+FRlhQlA2+22xJnTELVDDlOaTAMpKuuMI2vkDtg==",
|
|
699
|
+
"license": "Apache-2.0",
|
|
700
|
+
"dependencies": {
|
|
701
|
+
"bluebird": "^3.7.2",
|
|
702
|
+
"lodash": "^4.17.21",
|
|
703
|
+
"shell-quote": "^1.8.1"
|
|
704
|
+
},
|
|
705
|
+
"engines": {
|
|
706
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
707
|
+
"npm": ">=10"
|
|
708
|
+
}
|
|
709
|
+
},
|
|
694
710
|
"node_modules/appium-chromedriver": {
|
|
695
|
-
"version": "8.0.
|
|
696
|
-
"resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.
|
|
697
|
-
"integrity": "sha512-
|
|
711
|
+
"version": "8.0.31",
|
|
712
|
+
"resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.31.tgz",
|
|
713
|
+
"integrity": "sha512-hmamyXXsRwzhYoMbNzfdL1t/lCb0o0vLf63WpK/SgLwlcO2ut6MunT729KQSlFzOlLpndtE1H+LCX5KFyPDuMw==",
|
|
698
714
|
"license": "Apache-2.0",
|
|
699
715
|
"dependencies": {
|
|
700
716
|
"@appium/base-driver": "^10.0.0-rc.2",
|
|
701
717
|
"@appium/support": "^7.0.0-rc.1",
|
|
702
718
|
"@xmldom/xmldom": "^0.x",
|
|
703
719
|
"appium-adb": "^14.0.0",
|
|
704
|
-
"asyncbox": "^
|
|
720
|
+
"asyncbox": "^4.0.1",
|
|
705
721
|
"axios": "^1.6.5",
|
|
706
722
|
"bluebird": "^3.5.1",
|
|
707
723
|
"compare-versions": "^6.0.0",
|
|
708
724
|
"lodash": "^4.17.4",
|
|
709
725
|
"semver": "^7.0.0",
|
|
710
|
-
"teen_process": "^
|
|
726
|
+
"teen_process": "^4.0.4",
|
|
711
727
|
"xpath": "^0.x"
|
|
712
728
|
},
|
|
713
729
|
"engines": {
|
|
@@ -715,20 +731,6 @@
|
|
|
715
731
|
"npm": ">=10"
|
|
716
732
|
}
|
|
717
733
|
},
|
|
718
|
-
"node_modules/appium-chromedriver/node_modules/asyncbox": {
|
|
719
|
-
"version": "3.0.0",
|
|
720
|
-
"resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
|
|
721
|
-
"integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
|
|
722
|
-
"license": "Apache-2.0",
|
|
723
|
-
"dependencies": {
|
|
724
|
-
"bluebird": "^3.5.1",
|
|
725
|
-
"lodash": "^4.17.4",
|
|
726
|
-
"source-map-support": "^0.x"
|
|
727
|
-
},
|
|
728
|
-
"engines": {
|
|
729
|
-
"node": ">=16"
|
|
730
|
-
}
|
|
731
|
-
},
|
|
732
734
|
"node_modules/appium-uiautomator2-server": {
|
|
733
735
|
"version": "9.9.0",
|
|
734
736
|
"resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-9.9.0.tgz",
|
|
@@ -2370,37 +2372,23 @@
|
|
|
2370
2372
|
}
|
|
2371
2373
|
},
|
|
2372
2374
|
"node_modules/io.appium.settings": {
|
|
2373
|
-
"version": "7.0.
|
|
2374
|
-
"resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.
|
|
2375
|
-
"integrity": "sha512-
|
|
2375
|
+
"version": "7.0.8",
|
|
2376
|
+
"resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.8.tgz",
|
|
2377
|
+
"integrity": "sha512-KScrHILMWgEGbKvN37OHqTyROaez6yLdndK5ceF/BXS8eEnhBjrSk9xd9yZiUv+22u2ZbYcYMUJglp0aGUhXPA==",
|
|
2376
2378
|
"license": "Apache-2.0",
|
|
2377
2379
|
"dependencies": {
|
|
2378
2380
|
"@appium/logger": "^2.0.0-rc.1",
|
|
2379
|
-
"asyncbox": "^
|
|
2381
|
+
"asyncbox": "^4.0.1",
|
|
2380
2382
|
"bluebird": "^3.5.1",
|
|
2381
2383
|
"lodash": "^4.2.1",
|
|
2382
2384
|
"semver": "^7.5.4",
|
|
2383
|
-
"teen_process": "^
|
|
2385
|
+
"teen_process": "^4.0.4"
|
|
2384
2386
|
},
|
|
2385
2387
|
"engines": {
|
|
2386
2388
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
2387
2389
|
"npm": ">=10"
|
|
2388
2390
|
}
|
|
2389
2391
|
},
|
|
2390
|
-
"node_modules/io.appium.settings/node_modules/asyncbox": {
|
|
2391
|
-
"version": "3.0.0",
|
|
2392
|
-
"resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
|
|
2393
|
-
"integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
|
|
2394
|
-
"license": "Apache-2.0",
|
|
2395
|
-
"dependencies": {
|
|
2396
|
-
"bluebird": "^3.5.1",
|
|
2397
|
-
"lodash": "^4.17.4",
|
|
2398
|
-
"source-map-support": "^0.x"
|
|
2399
|
-
},
|
|
2400
|
-
"engines": {
|
|
2401
|
-
"node": ">=16"
|
|
2402
|
-
}
|
|
2403
|
-
},
|
|
2404
2392
|
"node_modules/ipaddr.js": {
|
|
2405
2393
|
"version": "1.9.1",
|
|
2406
2394
|
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
|
@@ -4101,9 +4089,9 @@
|
|
|
4101
4089
|
}
|
|
4102
4090
|
},
|
|
4103
4091
|
"node_modules/teen_process": {
|
|
4104
|
-
"version": "
|
|
4105
|
-
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-
|
|
4106
|
-
"integrity": "sha512-
|
|
4092
|
+
"version": "4.0.5",
|
|
4093
|
+
"resolved": "https://registry.npmjs.org/teen_process/-/teen_process-4.0.5.tgz",
|
|
4094
|
+
"integrity": "sha512-ZQQ2Vjs1/maFzpzfsZRAlQVSZrUBsKzAItaxSLImsHRTdI8hVt9Jm0JHyWFbrvvAf78V55BM3ZgNeQpXcXsWpw==",
|
|
4107
4095
|
"license": "Apache-2.0",
|
|
4108
4096
|
"dependencies": {
|
|
4109
4097
|
"bluebird": "^3.7.2",
|
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.5",
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/appium/appium-uiautomator2-driver/issues"
|
|
13
13
|
},
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"io.appium.settings": "^7.0.1",
|
|
67
67
|
"lodash": "^4.17.4",
|
|
68
68
|
"portscanner": "^2.2.0",
|
|
69
|
-
"teen_process": "^
|
|
69
|
+
"teen_process": "^4.0.4"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@appium/docutils": "^2.0.0-rc.1",
|