appium-uiautomator2-driver 2.29.11 → 2.30.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/CHANGELOG.md +7 -0
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +8 -15
- package/build/index.js.map +1 -0
- package/build/lib/commands/actions.d.ts +2 -0
- package/build/lib/commands/actions.d.ts.map +1 -0
- package/build/lib/commands/actions.js +67 -62
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.d.ts +2 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +28 -26
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-strings.d.ts +3 -0
- package/build/lib/commands/app-strings.d.ts.map +1 -0
- package/build/lib/commands/app-strings.js +86 -57
- package/build/lib/commands/app-strings.js.map +1 -1
- package/build/lib/commands/battery.d.ts +2 -0
- package/build/lib/commands/battery.d.ts.map +1 -0
- package/build/lib/commands/battery.js +26 -16
- package/build/lib/commands/battery.js.map +1 -1
- package/build/lib/commands/element.d.ts +2 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +140 -159
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/find.d.ts +2 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +39 -25
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.d.ts +4 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +217 -215
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/gestures.d.ts +2 -0
- package/build/lib/commands/gestures.d.ts.map +1 -0
- package/build/lib/commands/gestures.js +206 -193
- package/build/lib/commands/gestures.js.map +1 -1
- package/build/lib/commands/index.d.ts +2 -0
- package/build/lib/commands/index.d.ts.map +1 -0
- package/build/lib/commands/index.js +13 -22
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/mixins.d.ts +84 -0
- package/build/lib/commands/mixins.d.ts.map +1 -0
- package/build/lib/commands/mixins.js +23 -0
- package/build/lib/commands/mixins.js.map +1 -0
- package/build/lib/commands/screenshot.d.ts +2 -0
- package/build/lib/commands/screenshot.d.ts.map +1 -0
- package/build/lib/commands/screenshot.js +77 -62
- package/build/lib/commands/screenshot.js.map +1 -1
- package/build/lib/commands/touch.d.ts +2 -0
- package/build/lib/commands/touch.d.ts.map +1 -0
- package/build/lib/commands/touch.js +48 -38
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/commands/types.d.ts +452 -0
- package/build/lib/commands/types.d.ts.map +1 -0
- package/build/lib/commands/types.js +3 -0
- package/build/lib/commands/types.js.map +1 -0
- package/build/lib/commands/viewport.d.ts +2 -0
- package/build/lib/commands/viewport.d.ts.map +1 -0
- package/build/lib/commands/viewport.js +37 -35
- package/build/lib/commands/viewport.js.map +1 -1
- package/build/lib/constraints.d.ts +334 -0
- package/build/lib/constraints.d.ts.map +1 -0
- package/build/lib/constraints.js +51 -0
- package/build/lib/constraints.js.map +1 -0
- package/build/lib/css-converter.d.ts +45 -0
- package/build/lib/css-converter.d.ts.map +1 -0
- package/build/lib/css-converter.js +272 -175
- package/build/lib/css-converter.js.map +1 -1
- package/build/lib/driver.d.ts +912 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +738 -482
- package/build/lib/driver.js.map +1 -1
- package/build/lib/execute-method-map.d.ts +477 -0
- package/build/lib/execute-method-map.d.ts.map +1 -0
- package/build/lib/execute-method-map.js +542 -0
- package/build/lib/execute-method-map.js.map +1 -0
- package/build/lib/extensions.d.ts +3 -0
- package/build/lib/extensions.d.ts.map +1 -0
- package/build/lib/extensions.js +7 -9
- package/build/lib/extensions.js.map +1 -1
- package/build/lib/helpers.d.ts +7 -0
- package/build/lib/helpers.d.ts.map +1 -0
- package/build/lib/helpers.js +36 -29
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +5 -10
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.d.ts +389 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +11 -17
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/types.d.ts +45 -0
- package/build/lib/types.d.ts.map +1 -0
- package/build/lib/types.js +3 -0
- package/build/lib/types.js.map +1 -0
- package/build/lib/uiautomator2.d.ts +45 -0
- package/build/lib/uiautomator2.d.ts.map +1 -0
- package/build/lib/uiautomator2.js +340 -299
- package/build/lib/uiautomator2.js.map +1 -1
- package/build/lib/utils.d.ts +10 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +23 -16
- package/build/lib/utils.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -0
- package/index.js +5 -3
- package/lib/commands/actions.js +115 -101
- package/lib/commands/alert.js +36 -44
- package/lib/commands/app-strings.js +79 -58
- package/lib/commands/battery.js +27 -28
- package/lib/commands/element.js +231 -134
- package/lib/commands/find.js +40 -21
- package/lib/commands/general.js +271 -336
- package/lib/commands/gestures.js +252 -366
- package/lib/commands/index.js +11 -31
- package/lib/commands/mixins.ts +167 -0
- package/lib/commands/screenshot.js +80 -76
- package/lib/commands/touch.js +64 -31
- package/lib/commands/types.ts +473 -0
- package/lib/commands/viewport.js +43 -31
- package/lib/constraints.ts +53 -0
- package/lib/css-converter.js +9 -1
- package/lib/{driver.js → driver.ts} +383 -225
- package/lib/execute-method-map.ts +573 -0
- package/lib/method-map.ts +11 -0
- package/lib/types.ts +59 -0
- package/lib/uiautomator2.js +21 -2
- package/lib/utils.js +2 -2
- package/npm-shrinkwrap.json +363 -492
- package/package.json +95 -69
- package/build/lib/desired-caps.js +0 -71
- package/build/lib/desired-caps.js.map +0 -1
- package/lib/desired-caps.js +0 -70
- package/lib/method-map.js +0 -11
|
@@ -1,199 +1,296 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
+
const css_selector_parser_1 = require("css-selector-parser");
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const driver_1 = require("appium/driver");
|
|
9
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
10
|
+
const parseCssSelector = (0, css_selector_parser_1.createParser)({
|
|
11
|
+
syntax: {
|
|
12
|
+
pseudoClasses: {
|
|
13
|
+
unknown: 'accept',
|
|
14
|
+
definitions: {
|
|
15
|
+
Selector: ['has'],
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
combinators: ['>', '+', '~'],
|
|
19
|
+
attributes: {
|
|
20
|
+
operators: ['^=', '$=', '*=', '~=', '=']
|
|
21
|
+
},
|
|
22
|
+
ids: true,
|
|
23
|
+
classNames: true,
|
|
24
|
+
tag: {
|
|
25
|
+
wildcard: true
|
|
26
|
+
},
|
|
24
27
|
},
|
|
25
|
-
|
|
26
|
-
classNames: true,
|
|
27
|
-
tag: {
|
|
28
|
-
wildcard: true
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
substitutes: true
|
|
28
|
+
substitutes: true
|
|
32
29
|
});
|
|
33
30
|
const RESOURCE_ID = 'resource-id';
|
|
34
31
|
const ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\/[\S]+$/;
|
|
35
|
-
const BOOLEAN_ATTRS = [
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
32
|
+
const BOOLEAN_ATTRS = [
|
|
33
|
+
'checkable', 'checked', 'clickable', 'enabled', 'focusable',
|
|
34
|
+
'focused', 'long-clickable', 'scrollable', 'selected',
|
|
35
|
+
];
|
|
36
|
+
const NUMERIC_ATTRS = [
|
|
37
|
+
'index', 'instance',
|
|
38
|
+
];
|
|
39
|
+
const STR_ATTRS = [
|
|
40
|
+
'description', RESOURCE_ID, 'text', 'class-name', 'package-name'
|
|
41
|
+
];
|
|
42
|
+
const ALL_ATTRS = [
|
|
43
|
+
...BOOLEAN_ATTRS,
|
|
44
|
+
...NUMERIC_ATTRS,
|
|
45
|
+
...STR_ATTRS,
|
|
46
|
+
];
|
|
47
|
+
/** @type {[string, string[]][]} */
|
|
48
|
+
const ATTRIBUTE_ALIASES = [
|
|
49
|
+
[RESOURCE_ID, ['id']],
|
|
50
|
+
['description', [
|
|
51
|
+
'content-description', 'content-desc',
|
|
52
|
+
'desc', 'accessibility-id',
|
|
53
|
+
]],
|
|
54
|
+
['index', ['nth-child']],
|
|
55
|
+
];
|
|
56
|
+
/**
|
|
57
|
+
* Convert hyphen separated word to snake case
|
|
58
|
+
*
|
|
59
|
+
* @param {string?} str
|
|
60
|
+
* @returns {string} The hyphen separated word translated to snake case
|
|
61
|
+
*/
|
|
40
62
|
function toSnakeCase(str) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
63
|
+
if (!str) {
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());
|
|
67
|
+
const out = tokens.join('');
|
|
68
|
+
return out.charAt(0).toLowerCase() + out.slice(1);
|
|
47
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception
|
|
72
|
+
*
|
|
73
|
+
* @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} css A
|
|
74
|
+
* CSS object that has 'name' and 'value'
|
|
75
|
+
* @returns {string} Either 'true' or 'false'. If value is empty, return 'true'
|
|
76
|
+
*/
|
|
48
77
|
function requireBoolean(css) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
78
|
+
// @ts-ignore Attributes should exist
|
|
79
|
+
const val = lodash_1.default.toLower((css.value ?? css.argument)?.value) || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)
|
|
80
|
+
if (['true', 'false'].includes(val)) {
|
|
81
|
+
return val;
|
|
82
|
+
}
|
|
83
|
+
// @ts-ignore The attribute should exist
|
|
84
|
+
throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);
|
|
55
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the canonical form of a CSS attribute name
|
|
88
|
+
*
|
|
89
|
+
* Converts to lowercase and if an attribute name is an alias for something else, return
|
|
90
|
+
* what it is an alias for
|
|
91
|
+
*
|
|
92
|
+
* @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} cssEntity CSS object
|
|
93
|
+
* @returns {string} The canonical attribute name
|
|
94
|
+
*/
|
|
56
95
|
function requireEntityName(cssEntity) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
|
|
62
|
-
if (aliasAttrs.includes(attrName)) {
|
|
63
|
-
return officialAttr;
|
|
96
|
+
const attrName = cssEntity.name.toLowerCase();
|
|
97
|
+
// Check if it's supported and if it is, return it
|
|
98
|
+
if (ALL_ATTRS.includes(attrName)) {
|
|
99
|
+
return attrName.toLowerCase();
|
|
64
100
|
}
|
|
65
|
-
|
|
66
|
-
|
|
101
|
+
// If attrName is an alias for something else, return that
|
|
102
|
+
for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
|
|
103
|
+
if (aliasAttrs.includes(attrName)) {
|
|
104
|
+
return officialAttr;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`'${attrName}' is not a valid attribute. ` +
|
|
108
|
+
`Supported attributes are '${ALL_ATTRS.join(', ')}'`);
|
|
67
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Get a regex that matches a whole word. For the ~= CSS attribute selector.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} word
|
|
114
|
+
* @returns {string} A regex "word" matcher
|
|
115
|
+
*/
|
|
68
116
|
function getWordMatcherRegex(word) {
|
|
69
|
-
|
|
117
|
+
return `\\b(\\w*${lodash_1.default.escapeRegExp(word)}\\w*)\\b`;
|
|
70
118
|
}
|
|
71
119
|
class CssConverter {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
formatIdLocator(locator) {
|
|
77
|
-
return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
|
|
78
|
-
}
|
|
79
|
-
parseAttr(cssAttr) {
|
|
80
|
-
var _cssAttr$value;
|
|
81
|
-
const attrValue = (_cssAttr$value = cssAttr.value) === null || _cssAttr$value === void 0 ? void 0 : _cssAttr$value.value;
|
|
82
|
-
if (!_lodash.default.isString(attrValue) && !_lodash.default.isEmpty(attrValue)) {
|
|
83
|
-
throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` + `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);
|
|
84
|
-
}
|
|
85
|
-
const attrName = requireEntityName(cssAttr);
|
|
86
|
-
const methodName = toSnakeCase(attrName);
|
|
87
|
-
if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
|
|
88
|
-
throw new Error(`'${attrName}' is not supported. Supported attributes are ` + `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
|
|
89
|
-
}
|
|
90
|
-
if (BOOLEAN_ATTRS.includes(attrName)) {
|
|
91
|
-
return `.${methodName}(${requireBoolean(cssAttr)})`;
|
|
92
|
-
}
|
|
93
|
-
let value = attrValue || '';
|
|
94
|
-
if (attrName === RESOURCE_ID) {
|
|
95
|
-
value = this.formatIdLocator(value);
|
|
120
|
+
constructor(selector, pkg) {
|
|
121
|
+
this.selector = selector;
|
|
122
|
+
this.pkg = pkg;
|
|
96
123
|
}
|
|
97
|
-
|
|
98
|
-
|
|
124
|
+
/**
|
|
125
|
+
* Add `<pkgName>:id/` prefix to beginning of string if it's not there already
|
|
126
|
+
*
|
|
127
|
+
* @param {string} locator The initial locator
|
|
128
|
+
* @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)
|
|
129
|
+
*/
|
|
130
|
+
formatIdLocator(locator) {
|
|
131
|
+
return ID_LOCATOR_PATTERN.test(locator)
|
|
132
|
+
? locator
|
|
133
|
+
: `${this.pkg || 'android'}:id/${locator}`;
|
|
99
134
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
|
|
154
|
-
}
|
|
155
|
-
if (!_lodash.default.isEmpty(cssRule.ids)) {
|
|
156
|
-
uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.ids[0])}")`;
|
|
157
|
-
}
|
|
158
|
-
if (cssRule.attributes) {
|
|
159
|
-
for (const attr of cssRule.attributes) {
|
|
160
|
-
uiAutomatorSelector += this.parseAttr(attr);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
if (cssRule.pseudoClasses) {
|
|
164
|
-
for (const pseudo of cssRule.pseudoClasses) {
|
|
165
|
-
const sel = this.parsePseudo(pseudo);
|
|
166
|
-
if (sel) {
|
|
167
|
-
uiAutomatorSelector += sel;
|
|
135
|
+
/**
|
|
136
|
+
* Convert a CSS attribute into a UiSelector method call
|
|
137
|
+
*
|
|
138
|
+
* @param {import('css-selector-parser').AstAttribute} cssAttr CSS attribute object
|
|
139
|
+
* @returns {string} CSS attribute parsed as UiSelector
|
|
140
|
+
*/
|
|
141
|
+
parseAttr(cssAttr) {
|
|
142
|
+
// @ts-ignore Value should be present
|
|
143
|
+
const attrValue = cssAttr.value?.value;
|
|
144
|
+
if (!lodash_1.default.isString(attrValue) && !lodash_1.default.isEmpty(attrValue)) {
|
|
145
|
+
throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` +
|
|
146
|
+
`Only 'string' and empty attribute types are supported. Found '${attrValue}'`);
|
|
147
|
+
}
|
|
148
|
+
const attrName = requireEntityName(cssAttr);
|
|
149
|
+
const methodName = toSnakeCase(attrName);
|
|
150
|
+
// Validate that it's a supported attribute
|
|
151
|
+
if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {
|
|
152
|
+
throw new Error(`'${attrName}' is not supported. Supported attributes are ` +
|
|
153
|
+
`'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);
|
|
154
|
+
}
|
|
155
|
+
// Parse boolean, if it's a boolean attribute
|
|
156
|
+
if (BOOLEAN_ATTRS.includes(attrName)) {
|
|
157
|
+
return `.${methodName}(${requireBoolean(cssAttr)})`;
|
|
158
|
+
}
|
|
159
|
+
// Otherwise parse as string
|
|
160
|
+
let value = attrValue || '';
|
|
161
|
+
if (attrName === RESOURCE_ID) {
|
|
162
|
+
value = this.formatIdLocator(value);
|
|
163
|
+
}
|
|
164
|
+
if (value === '') {
|
|
165
|
+
return `.${methodName}Matches("")`;
|
|
166
|
+
}
|
|
167
|
+
switch (cssAttr.operator) {
|
|
168
|
+
case '=':
|
|
169
|
+
return `.${methodName}("${value}")`;
|
|
170
|
+
case '*=':
|
|
171
|
+
if (['description', 'text'].includes(attrName)) {
|
|
172
|
+
return `.${methodName}Contains("${value}")`;
|
|
173
|
+
}
|
|
174
|
+
return `.${methodName}Matches("${lodash_1.default.escapeRegExp(value)}")`;
|
|
175
|
+
case '^=':
|
|
176
|
+
if (['description', 'text'].includes(attrName)) {
|
|
177
|
+
return `.${methodName}StartsWith("${value}")`;
|
|
178
|
+
}
|
|
179
|
+
return `.${methodName}Matches("^${lodash_1.default.escapeRegExp(value)}")`;
|
|
180
|
+
case '$=':
|
|
181
|
+
return `.${methodName}Matches("${lodash_1.default.escapeRegExp(value)}$")`;
|
|
182
|
+
case '~=':
|
|
183
|
+
return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
|
|
184
|
+
default:
|
|
185
|
+
// Unreachable, but adding error in case a new CSS attribute is added.
|
|
186
|
+
throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +
|
|
187
|
+
` '=', '*=', '^=', '$=' and '~=' are supported.`);
|
|
168
188
|
}
|
|
169
|
-
}
|
|
170
189
|
}
|
|
171
|
-
|
|
172
|
-
|
|
190
|
+
/**
|
|
191
|
+
* Convert a CSS pseudo class to a UiSelector
|
|
192
|
+
*
|
|
193
|
+
* @param {import('css-selector-parser').AstPseudoClass} cssPseudo CSS Pseudo class
|
|
194
|
+
* @returns {string|null|undefined} Pseudo selector parsed as UiSelector
|
|
195
|
+
*/
|
|
196
|
+
parsePseudo(cssPseudo) {
|
|
197
|
+
// @ts-ignore The attribute should exist
|
|
198
|
+
const argValue = cssPseudo.argument?.value;
|
|
199
|
+
if (!lodash_1.default.isString(argValue) && !lodash_1.default.isEmpty(argValue)) {
|
|
200
|
+
throw new Error(`'${cssPseudo.name}=${argValue}'. ` +
|
|
201
|
+
`Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);
|
|
202
|
+
}
|
|
203
|
+
const pseudoName = requireEntityName(cssPseudo);
|
|
204
|
+
if (BOOLEAN_ATTRS.includes(pseudoName)) {
|
|
205
|
+
return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;
|
|
206
|
+
}
|
|
207
|
+
if (NUMERIC_ATTRS.includes(pseudoName)) {
|
|
208
|
+
return `.${pseudoName}(${argValue})`;
|
|
209
|
+
}
|
|
173
210
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Convert a CSS rule to a UiSelector
|
|
213
|
+
* @param {import('css-selector-parser').AstRule} cssRule CSS rule definition
|
|
214
|
+
*/
|
|
215
|
+
parseCssRule(cssRule) {
|
|
216
|
+
if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {
|
|
217
|
+
throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` +
|
|
218
|
+
`Only child combinator (>) and descendant combinator are supported.`);
|
|
219
|
+
}
|
|
220
|
+
let uiAutomatorSelector = 'new UiSelector()';
|
|
221
|
+
// @ts-ignore the attribute should exist
|
|
222
|
+
const tagName = cssRule.tag?.name;
|
|
223
|
+
if (tagName && tagName !== '*') {
|
|
224
|
+
let androidClass = [tagName];
|
|
225
|
+
if (cssRule.classNames) {
|
|
226
|
+
for (const cssClassNames of cssRule.classNames) {
|
|
227
|
+
androidClass.push(cssClassNames);
|
|
228
|
+
}
|
|
229
|
+
uiAutomatorSelector += `.className("${androidClass.join('.')}")`;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
uiAutomatorSelector += `.classNameMatches("${tagName}")`;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (!lodash_1.default.isEmpty(cssRule.classNames)) {
|
|
236
|
+
// @ts-ignore the attribute should exist
|
|
237
|
+
uiAutomatorSelector += `.classNameMatches("${cssRule.classNames.join('\\.')}")`;
|
|
238
|
+
}
|
|
239
|
+
if (!lodash_1.default.isEmpty(cssRule.ids)) {
|
|
240
|
+
// @ts-ignore The attribute should exist
|
|
241
|
+
uiAutomatorSelector += `.resourceId("${this.formatIdLocator(cssRule.ids[0])}")`;
|
|
242
|
+
}
|
|
243
|
+
if (cssRule.attributes) {
|
|
244
|
+
for (const attr of cssRule.attributes) {
|
|
245
|
+
uiAutomatorSelector += this.parseAttr(attr);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (cssRule.pseudoClasses) {
|
|
249
|
+
for (const pseudo of cssRule.pseudoClasses) {
|
|
250
|
+
const sel = this.parsePseudo(pseudo);
|
|
251
|
+
if (sel) {
|
|
252
|
+
uiAutomatorSelector += sel;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (cssRule.nestedRule) {
|
|
257
|
+
uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;
|
|
258
|
+
}
|
|
259
|
+
return uiAutomatorSelector;
|
|
179
260
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
261
|
+
/**
|
|
262
|
+
* Convert CSS object to UiAutomator2 selector
|
|
263
|
+
* @param {import('css-selector-parser').AstSelector} css CSS object
|
|
264
|
+
* @returns {string} The CSS object parsed as a UiSelector
|
|
265
|
+
*/
|
|
266
|
+
parseCssObject(css) {
|
|
267
|
+
if (!lodash_1.default.isEmpty(css.rules)) {
|
|
268
|
+
return this.parseCssRule(css.rules[0]);
|
|
269
|
+
}
|
|
270
|
+
throw new Error('No rules could be parsed out of the current selector');
|
|
189
271
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
272
|
+
/**
|
|
273
|
+
* Convert a CSS selector to a UiAutomator2 selector
|
|
274
|
+
*
|
|
275
|
+
* @returns {string} The CSS selector converted to a UiSelector
|
|
276
|
+
*/
|
|
277
|
+
toUiAutomatorSelector() {
|
|
278
|
+
let cssObj;
|
|
279
|
+
try {
|
|
280
|
+
cssObj = parseCssSelector(this.selector);
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
logger_1.default.debug(e.stack);
|
|
284
|
+
throw new driver_1.errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
return this.parseCssObject(cssObj);
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
logger_1.default.debug(e.stack);
|
|
291
|
+
throw new driver_1.errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);
|
|
292
|
+
}
|
|
195
293
|
}
|
|
196
|
-
}
|
|
197
294
|
}
|
|
198
|
-
|
|
199
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3NzU2VsZWN0b3JQYXJzZXIiLCJyZXF1aXJlIiwiX2xvZGFzaCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZHJpdmVyIiwiX2xvZ2dlciIsInBhcnNlQ3NzU2VsZWN0b3IiLCJjcmVhdGVQYXJzZXIiLCJzeW50YXgiLCJwc2V1ZG9DbGFzc2VzIiwidW5rbm93biIsImRlZmluaXRpb25zIiwiU2VsZWN0b3IiLCJjb21iaW5hdG9ycyIsImF0dHJpYnV0ZXMiLCJvcGVyYXRvcnMiLCJpZHMiLCJjbGFzc05hbWVzIiwidGFnIiwid2lsZGNhcmQiLCJzdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwicmVxdWlyZUJvb2xlYW4iLCJjc3MiLCJfcmVmIiwidmFsIiwiXyIsInRvTG93ZXIiLCJ2YWx1ZSIsImFyZ3VtZW50IiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJyZXF1aXJlRW50aXR5TmFtZSIsImNzc0VudGl0eSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiZXNjYXBlUmVnRXhwIiwiQ3NzQ29udmVydGVyIiwiY29uc3RydWN0b3IiLCJzZWxlY3RvciIsInBrZyIsImZvcm1hdElkTG9jYXRvciIsImxvY2F0b3IiLCJ0ZXN0IiwicGFyc2VBdHRyIiwiY3NzQXR0ciIsIl9jc3NBdHRyJHZhbHVlIiwiYXR0clZhbHVlIiwiaXNTdHJpbmciLCJpc0VtcHR5IiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJfY3NzUHNldWRvJGFyZ3VtZW50IiwiYXJnVmFsdWUiLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIl9jc3NSdWxlJHRhZyIsImNvbWJpbmF0b3IiLCJ1aUF1dG9tYXRvclNlbGVjdG9yIiwidGFnTmFtZSIsImFuZHJvaWRDbGFzcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiYXR0ciIsInBzZXVkbyIsInNlbCIsIm5lc3RlZFJ1bGUiLCJwYXJzZUNzc09iamVjdCIsInJ1bGVzIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzT2JqIiwiZSIsImxvZyIsImRlYnVnIiwic3RhY2siLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciIsIm1lc3NhZ2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Nzcy1jb252ZXJ0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUGFyc2VyIH0gZnJvbSAnY3NzLXNlbGVjdG9yLXBhcnNlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcblxuY29uc3QgcGFyc2VDc3NTZWxlY3RvciA9IGNyZWF0ZVBhcnNlcih7XG4gIHN5bnRheDoge1xuICAgIHBzZXVkb0NsYXNzZXM6IHtcbiAgICAgIHVua25vd246ICdhY2NlcHQnLFxuICAgICAgZGVmaW5pdGlvbnM6IHtcbiAgICAgICAgU2VsZWN0b3I6IFsnaGFzJ10sXG4gICAgICB9XG4gICAgfSxcbiAgICBjb21iaW5hdG9yczogWyc+JywgJysnLCAnfiddLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIG9wZXJhdG9yczogWydePScsICckPScsICcqPScsICd+PScsICc9J11cbiAgICB9LFxuICAgIGlkczogdHJ1ZSxcbiAgICBjbGFzc05hbWVzOiB0cnVlLFxuICAgIHRhZzoge1xuICAgICAgd2lsZGNhcmQ6IHRydWVcbiAgICB9LFxuICB9LFxuICBzdWJzdGl0dXRlczogdHJ1ZVxufSk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcbmNvbnN0IElEX0xPQ0FUT1JfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOS5fXSo6aWRcXC9bXFxTXSskLztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZz99IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge2ltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdEF0dHJpYnV0ZXxpbXBvcnQoJ2Nzcy1zZWxlY3Rvci1wYXJzZXInKS5Bc3RQc2V1ZG9DbGFzc30gY3NzIEFcbiAqIENTUyBvYmplY3QgdGhhdCBoYXMgJ25hbWUnIGFuZCAndmFsdWUnXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBFaXRoZXIgJ3RydWUnIG9yICdmYWxzZScuIElmIHZhbHVlIGlzIGVtcHR5LCByZXR1cm4gJ3RydWUnXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVCb29sZWFuIChjc3MpIHtcbiAgY29uc3QgdmFsID0gXy50b0xvd2VyKChjc3MudmFsdWUgPz8gY3NzLmFyZ3VtZW50KT8udmFsdWUpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0QXR0cmlidXRlfGltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdFBzZXVkb0NsYXNzfSBjc3NFbnRpdHkgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiByZXF1aXJlRW50aXR5TmFtZSAoY3NzRW50aXR5KSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzRW50aXR5Lm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtfLmVzY2FwZVJlZ0V4cCh3b3JkKX1cXFxcdyopXFxcXGJgO1xufVxuXG5cbmNsYXNzIENzc0NvbnZlcnRlciB7XG5cbiAgY29uc3RydWN0b3IgKHNlbGVjdG9yLCBwa2cpIHtcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5wa2cgPSBwa2c7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGA8cGtnTmFtZT46aWQvYCBwcmVmaXggdG8gYmVnaW5uaW5nIG9mIHN0cmluZyBpZiBpdCdzIG5vdCB0aGVyZSBhbHJlYWR5XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHdpdGggYDxwa2dOYW1lPjppZC9gIHByZXBlbmRlZCAoaWYgaXQgd2Fzbid0IGFscmVhZHkpXG4gICAqL1xuICBmb3JtYXRJZExvY2F0b3IgKGxvY2F0b3IpIHtcbiAgICByZXR1cm4gSURfTE9DQVRPUl9QQVRURVJOLnRlc3QobG9jYXRvcilcbiAgICAgID8gbG9jYXRvclxuICAgICAgOiBgJHt0aGlzLnBrZyB8fCAnYW5kcm9pZCd9OmlkLyR7bG9jYXRvcn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0QXR0cmlidXRlfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGNzc0F0dHIudmFsdWU/LnZhbHVlO1xuICAgIGlmICghXy5pc1N0cmluZyhhdHRyVmFsdWUpICYmICFfLmlzRW1wdHkoYXR0clZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7YXR0clZhbHVlfScgaXMgYW4gaW52YWxpZCBhdHRyaWJ1dGUuIGAgK1xuICAgICAgICBgT25seSAnc3RyaW5nJyBhbmQgZW1wdHkgYXR0cmlidXRlIHR5cGVzIGFyZSBzdXBwb3J0ZWQuIEZvdW5kICcke2F0dHJWYWx1ZX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gcmVxdWlyZUVudGl0eU5hbWUoY3NzQXR0cik7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHRvU25ha2VDYXNlKGF0dHJOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgaXQncyBhIHN1cHBvcnRlZCBhdHRyaWJ1dGVcbiAgICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGAgK1xuICAgICAgICBgJyR7Wy4uLlNUUl9BVFRSUywgLi4uQk9PTEVBTl9BVFRSU10uam9pbignLCAnKX0nYCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgYm9vbGVhbiwgaWYgaXQncyBhIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7cmVxdWlyZUJvb2xlYW4oY3NzQXR0cil9KWA7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIHBhcnNlIGFzIHN0cmluZ1xuICAgIGxldCB2YWx1ZSA9IGF0dHJWYWx1ZSB8fCAnJztcbiAgICBpZiAoYXR0ck5hbWUgPT09IFJFU09VUkNFX0lEKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnPSc6XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX0oXCIke3ZhbHVlfVwiKWA7XG4gICAgICBjYXNlICcqPSc6XG4gICAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9Q29udGFpbnMoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke18uZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgICAgY2FzZSAnXj0nOlxuICAgICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfVN0YXJ0c1dpdGgoXCIke3ZhbHVlfVwiKWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtfLmVzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICAgIGNhc2UgJyQ9JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke18uZXNjYXBlUmVnRXhwKHZhbHVlKX0kXCIpYDtcbiAgICAgIGNhc2UgJ349JzpcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICAgIGAgJz0nLCAnKj0nLCAnXj0nLCAnJD0nIGFuZCAnfj0nIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0ge2ltcG9ydCgnY3NzLXNlbGVjdG9yLXBhcnNlcicpLkFzdFBzZXVkb0NsYXNzfSBjc3NQc2V1ZG8gQ1NTIFBzZXVkbyBjbGFzc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nP30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gICAqL1xuICBwYXJzZVBzZXVkbyAoY3NzUHNldWRvKSB7XG4gICAgY29uc3QgYXJnVmFsdWUgPSBjc3NQc2V1ZG8uYXJndW1lbnQ/LnZhbHVlO1xuICAgIGlmICghXy5pc1N0cmluZyhhcmdWYWx1ZSkgJiYgIV8uaXNFbXB0eShhcmdWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7YXJnVmFsdWV9Jy4gYCArXG4gICAgICAgIGBVbnN1cHBvcnRlZCBjc3MgcHNldWRvIGNsYXNzIHZhbHVlOiAnJHthcmdWYWx1ZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHBzZXVkb05hbWUgPSByZXF1aXJlRW50aXR5TmFtZShjc3NQc2V1ZG8pO1xuXG4gICAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICAgIHJldHVybiBgLiR7dG9TbmFrZUNhc2UocHNldWRvTmFtZSl9KCR7cmVxdWlyZUJvb2xlYW4oY3NzUHNldWRvKX0pYDtcbiAgICB9XG5cbiAgICBpZiAoTlVNRVJJQ19BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2FyZ1ZhbHVlfSlgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHJ1bGUgdG8gYSBVaVNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0UnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gICAqL1xuICBwYXJzZUNzc1J1bGUgKGNzc1J1bGUpIHtcbiAgICBpZiAoY3NzUnVsZS5jb21iaW5hdG9yICYmICFbJyAnLCAnPiddLmluY2x1ZGVzKGNzc1J1bGUuY29tYmluYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUnVsZS5jb21iaW5hdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgICBgT25seSBjaGlsZCBjb21iaW5hdG9yICg+KSBhbmQgZGVzY2VuZGFudCBjb21iaW5hdG9yIGFyZSBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuXG4gICAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gICAgY29uc3QgdGFnTmFtZSA9IGNzc1J1bGUudGFnPy5uYW1lO1xuICAgIGlmICh0YWdOYW1lICYmIHRhZ05hbWUgIT09ICcqJykge1xuICAgICAgbGV0IGFuZHJvaWRDbGFzcyA9IFt0YWdOYW1lXTtcbiAgICAgIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICAgIGFuZHJvaWRDbGFzcy5wdXNoKGNzc0NsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHt0YWdOYW1lfVwiKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KGNzc1J1bGUuY2xhc3NOYW1lcykpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLmNsYXNzTmFtZXMuam9pbignXFxcXC4nKX1cIilgO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShjc3NSdWxlLmlkcykpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHt0aGlzLmZvcm1hdElkTG9jYXRvcihjc3NSdWxlLmlkc1swXSl9XCIpYDtcbiAgICB9XG4gICAgaWYgKGNzc1J1bGUuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cmlidXRlcykge1xuICAgICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHRoaXMucGFyc2VBdHRyKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3NzUnVsZS5wc2V1ZG9DbGFzc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBzZXVkbyBvZiBjc3NSdWxlLnBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gdGhpcy5wYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgICAgICBpZiAoc2VsKSB7XG4gICAgICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBzZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc1J1bGUubmVzdGVkUnVsZSkge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHt0aGlzLnBhcnNlQ3NzUnVsZShjc3NSdWxlLm5lc3RlZFJ1bGUpfSlgO1xuICAgIH1cbiAgICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdjc3Mtc2VsZWN0b3ItcGFyc2VyJykuQXN0U2VsZWN0b3J9IGNzcyBDU1Mgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAgICovXG4gIHBhcnNlQ3NzT2JqZWN0IChjc3MpIHtcbiAgICBpZiAoIV8uaXNFbXB0eShjc3MucnVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNzc1J1bGUoY3NzLnJ1bGVzWzBdKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJ1bGVzIGNvdWxkIGJlIHBhcnNlZCBvdXQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgc2VsZWN0b3IgY29udmVydGVkIHRvIGEgVWlTZWxlY3RvclxuICAgKi9cbiAgdG9VaUF1dG9tYXRvclNlbGVjdG9yICgpIHtcbiAgICBsZXQgY3NzT2JqO1xuICAgIHRyeSB7XG4gICAgICBjc3NPYmogPSBwYXJzZUNzc1NlbGVjdG9yKHRoaXMuc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke3RoaXMuc2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlLm1lc3NhZ2V9J2ApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRTZWxlY3RvckVycm9yKGBVbnN1cHBvcnRlZCBDU1Mgc2VsZWN0b3IgJyR7dGhpcy5zZWxlY3Rvcn0nLiBSZWFzb246ICcke2UubWVzc2FnZX0nYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENzc0NvbnZlcnRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBRUEsTUFBTUssZ0JBQWdCLEdBQUcsSUFBQUMsK0JBQVksRUFBQztFQUNwQ0MsTUFBTSxFQUFFO0lBQ05DLGFBQWEsRUFBRTtNQUNiQyxPQUFPLEVBQUUsUUFBUTtNQUNqQkMsV0FBVyxFQUFFO1FBQ1hDLFFBQVEsRUFBRSxDQUFDLEtBQUs7TUFDbEI7SUFDRixDQUFDO0lBQ0RDLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCQyxVQUFVLEVBQUU7TUFDVkMsU0FB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
|
|
295
|
+
exports.default = CssConverter;
|
|
296
|
+
//# sourceMappingURL=css-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css-converter.js","names":["_cssSelectorParser","require","_lodash","_interopRequireDefault","_driver","_logger","parseCssSelector","createParser","syntax","pseudoClasses","unknown","definitions","Selector","combinators","attributes","operators","ids","classNames","tag","wildcard","substitutes","RESOURCE_ID","ID_LOCATOR_PATTERN","BOOLEAN_ATTRS","NUMERIC_ATTRS","STR_ATTRS","ALL_ATTRS","ATTRIBUTE_ALIASES","toSnakeCase","str","tokens","split","map","charAt","toUpperCase","slice","toLowerCase","out","join","requireBoolean","css","_ref","val","_","toLower","value","argument","includes","Error","name","requireEntityName","cssEntity","attrName","officialAttr","aliasAttrs","getWordMatcherRegex","word","escapeRegExp","CssConverter","constructor","selector","pkg","formatIdLocator","locator","test","parseAttr","cssAttr","_cssAttr$value","attrValue","isString","isEmpty","methodName","operator","parsePseudo","cssPseudo","_cssPseudo$argument","argValue","pseudoName","parseCssRule","cssRule","_cssRule$tag","combinator","uiAutomatorSelector","tagName","androidClass","cssClassNames","push","attr","pseudo","sel","nestedRule","parseCssObject","rules","toUiAutomatorSelector","cssObj","e","log","debug","stack","errors","InvalidSelectorError","message","_default","exports","default"],"sources":["../../lib/css-converter.js"],"sourcesContent":["import { createParser } from 'css-selector-parser';\nimport _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport log from './logger';\n\nconst parseCssSelector = createParser({\n syntax: {\n pseudoClasses: {\n unknown: 'accept',\n definitions: {\n Selector: ['has'],\n }\n },\n combinators: ['>', '+', '~'],\n attributes: {\n operators: ['^=', '$=', '*=', '~=', '=']\n },\n ids: true,\n classNames: true,\n tag: {\n wildcard: true\n },\n },\n substitutes: true\n});\n\nconst RESOURCE_ID = 'resource-id';\nconst ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\\/[\\S]+$/;\n\nconst BOOLEAN_ATTRS = [\n 'checkable', 'checked', 'clickable', 'enabled', 'focusable',\n 'focused', 'long-clickable', 'scrollable', 'selected',\n];\n\nconst NUMERIC_ATTRS = [\n 'index', 'instance',\n];\n\nconst STR_ATTRS = [\n 'description', RESOURCE_ID, 'text', 'class-name', 'package-name'\n];\n\nconst ALL_ATTRS = [\n ...BOOLEAN_ATTRS,\n ...NUMERIC_ATTRS,\n ...STR_ATTRS,\n];\n\nconst ATTRIBUTE_ALIASES = [\n [RESOURCE_ID, ['id']],\n ['description', [\n 'content-description', 'content-desc',\n 'desc', 'accessibility-id',\n ]],\n ['index', ['nth-child']],\n];\n\n/**\n * Convert hyphen separated word to snake case\n *\n * @param {string?} str\n * @returns {string} The hyphen separated word translated to snake case\n */\nfunction toSnakeCase (str) {\n if (!str) {\n return '';\n }\n const tokens = str.split('-').map((str) => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase());\n const out = tokens.join('');\n return out.charAt(0).toLowerCase() + out.slice(1);\n}\n\n/**\n * Get the boolean from a CSS object. If empty, return true. If not true/false/empty, throw exception\n *\n * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} css A\n * CSS object that has 'name' and 'value'\n * @returns {string} Either 'true' or 'false'. If value is empty, return 'true'\n */\nfunction requireBoolean (css) {\n const val = _.toLower((css.value ?? css.argument)?.value) || 'true'; // an omitted boolean attribute means 'true' (e.g.: input[checked] means checked is true)\n if (['true', 'false'].includes(val)) {\n return val;\n }\n throw new Error(`'${css.name}' must be true, false or empty. Found '${css.value}'`);\n}\n\n/**\n * Get the canonical form of a CSS attribute name\n *\n * Converts to lowercase and if an attribute name is an alias for something else, return\n * what it is an alias for\n *\n * @param {import('css-selector-parser').AstAttribute|import('css-selector-parser').AstPseudoClass} cssEntity CSS object\n * @returns {string} The canonical attribute name\n */\nfunction requireEntityName (cssEntity) {\n const attrName = cssEntity.name.toLowerCase();\n\n // Check if it's supported and if it is, return it\n if (ALL_ATTRS.includes(attrName)) {\n return attrName.toLowerCase();\n }\n\n // If attrName is an alias for something else, return that\n for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {\n if (aliasAttrs.includes(attrName)) {\n return officialAttr;\n }\n }\n throw new Error(`'${attrName}' is not a valid attribute. ` +\n `Supported attributes are '${ALL_ATTRS.join(', ')}'`);\n}\n\n/**\n * Get a regex that matches a whole word. For the ~= CSS attribute selector.\n *\n * @param {string} word\n * @returns {string} A regex \"word\" matcher\n */\nfunction getWordMatcherRegex (word) {\n return `\\\\b(\\\\w*${_.escapeRegExp(word)}\\\\w*)\\\\b`;\n}\n\n\nclass CssConverter {\n\n constructor (selector, pkg) {\n this.selector = selector;\n this.pkg = pkg;\n }\n\n /**\n * Add `<pkgName>:id/` prefix to beginning of string if it's not there already\n *\n * @param {string} locator The initial locator\n * @returns {string} String with `<pkgName>:id/` prepended (if it wasn't already)\n */\n formatIdLocator (locator) {\n return ID_LOCATOR_PATTERN.test(locator)\n ? locator\n : `${this.pkg || 'android'}:id/${locator}`;\n }\n\n /**\n * Convert a CSS attribute into a UiSelector method call\n *\n * @param {import('css-selector-parser').AstAttribute} cssAttr CSS attribute object\n * @returns {string} CSS attribute parsed as UiSelector\n */\n parseAttr (cssAttr) {\n const attrValue = cssAttr.value?.value;\n if (!_.isString(attrValue) && !_.isEmpty(attrValue)) {\n throw new Error(`'${cssAttr.name}=${attrValue}' is an invalid attribute. ` +\n `Only 'string' and empty attribute types are supported. Found '${attrValue}'`);\n }\n const attrName = requireEntityName(cssAttr);\n const methodName = toSnakeCase(attrName);\n\n // Validate that it's a supported attribute\n if (!STR_ATTRS.includes(attrName) && !BOOLEAN_ATTRS.includes(attrName)) {\n throw new Error(`'${attrName}' is not supported. Supported attributes are ` +\n `'${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`);\n }\n\n // Parse boolean, if it's a boolean attribute\n if (BOOLEAN_ATTRS.includes(attrName)) {\n return `.${methodName}(${requireBoolean(cssAttr)})`;\n }\n\n // Otherwise parse as string\n let value = attrValue || '';\n if (attrName === RESOURCE_ID) {\n value = this.formatIdLocator(value);\n }\n if (value === '') {\n return `.${methodName}Matches(\"\")`;\n }\n\n switch (cssAttr.operator) {\n case '=':\n return `.${methodName}(\"${value}\")`;\n case '*=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}Contains(\"${value}\")`;\n }\n return `.${methodName}Matches(\"${_.escapeRegExp(value)}\")`;\n case '^=':\n if (['description', 'text'].includes(attrName)) {\n return `.${methodName}StartsWith(\"${value}\")`;\n }\n return `.${methodName}Matches(\"^${_.escapeRegExp(value)}\")`;\n case '$=':\n return `.${methodName}Matches(\"${_.escapeRegExp(value)}$\")`;\n case '~=':\n return `.${methodName}Matches(\"${getWordMatcherRegex(value)}\")`;\n default:\n // Unreachable, but adding error in case a new CSS attribute is added.\n throw new Error(`Unsupported CSS attribute operator '${cssAttr.operator}'. ` +\n ` '=', '*=', '^=', '$=' and '~=' are supported.`);\n }\n }\n\n /**\n * Convert a CSS pseudo class to a UiSelector\n *\n * @param {import('css-selector-parser').AstPseudoClass} cssPseudo CSS Pseudo class\n * @returns {string?} Pseudo selector parsed as UiSelector\n */\n parsePseudo (cssPseudo) {\n const argValue = cssPseudo.argument?.value;\n if (!_.isString(argValue) && !_.isEmpty(argValue)) {\n throw new Error(`'${cssPseudo.name}=${argValue}'. ` +\n `Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`);\n }\n\n const pseudoName = requireEntityName(cssPseudo);\n\n if (BOOLEAN_ATTRS.includes(pseudoName)) {\n return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;\n }\n\n if (NUMERIC_ATTRS.includes(pseudoName)) {\n return `.${pseudoName}(${argValue})`;\n }\n }\n\n /**\n * Convert a CSS rule to a UiSelector\n * @param {import('css-selector-parser').AstRule} cssRule CSS rule definition\n */\n parseCssRule (cssRule) {\n if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {\n throw new Error(`'${cssRule.combinator}' is not a supported combinator. ` +\n `Only child combinator (>) and descendant combinator are supported.`);\n }\n\n let uiAutomatorSelector = 'new UiSelector()';\n const tagName = cssRule.tag?.name;\n if (tagName && tagName !== '*') {\n let androidClass = [tagName];\n if (cssRule.classNames) {\n for (const cssClassNames of cssRule.classNames) {\n androidClass.push(cssClassNames);\n }\n uiAutomatorSelector += `.className(\"${androidClass.join('.')}\")`;\n } else {\n uiAutomatorSelector += `.classNameMatches(\"${tagName}\")`;\n }\n } else if (!_.isEmpty(cssRule.classNames)) {\n uiAutomatorSelector += `.classNameMatches(\"${cssRule.classNames.join('\\\\.')}\")`;\n }\n if (!_.isEmpty(cssRule.ids)) {\n uiAutomatorSelector += `.resourceId(\"${this.formatIdLocator(cssRule.ids[0])}\")`;\n }\n if (cssRule.attributes) {\n for (const attr of cssRule.attributes) {\n uiAutomatorSelector += this.parseAttr(attr);\n }\n }\n if (cssRule.pseudoClasses) {\n for (const pseudo of cssRule.pseudoClasses) {\n const sel = this.parsePseudo(pseudo);\n if (sel) {\n uiAutomatorSelector += sel;\n }\n }\n }\n if (cssRule.nestedRule) {\n uiAutomatorSelector += `.childSelector(${this.parseCssRule(cssRule.nestedRule)})`;\n }\n return uiAutomatorSelector;\n }\n\n /**\n * Convert CSS object to UiAutomator2 selector\n * @param {import('css-selector-parser').AstSelector} css CSS object\n * @returns {string} The CSS object parsed as a UiSelector\n */\n parseCssObject (css) {\n if (!_.isEmpty(css.rules)) {\n return this.parseCssRule(css.rules[0]);\n }\n\n throw new Error('No rules could be parsed out of the current selector');\n }\n\n /**\n * Convert a CSS selector to a UiAutomator2 selector\n *\n * @returns {string} The CSS selector converted to a UiSelector\n */\n toUiAutomatorSelector () {\n let cssObj;\n try {\n cssObj = parseCssSelector(this.selector);\n } catch (e) {\n log.debug(e.stack);\n throw new errors.InvalidSelectorError(`Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`);\n }\n try {\n return this.parseCssObject(cssObj);\n } catch (e) {\n log.debug(e.stack);\n throw new errors.InvalidSelectorError(`Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`);\n }\n }\n}\n\nexport default CssConverter;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"css-converter.js","sourceRoot":"","sources":["../../lib/css-converter.js"],"names":[],"mappings":"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"}
|