@applitools/driver 1.11.1 → 1.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/context.js +80 -85
- package/dist/spec-utils.js +6 -2
- package/package.json +3 -3
- package/types/context.d.ts +1 -5
- package/types/selector.d.ts +2 -0
- package/types/spec-utils.d.ts +1 -6
package/dist/context.js
CHANGED
|
@@ -104,6 +104,70 @@ class Context {
|
|
|
104
104
|
get isRef() {
|
|
105
105
|
return !this._target;
|
|
106
106
|
}
|
|
107
|
+
async _findElements(selector, options = {}) {
|
|
108
|
+
await this.focus();
|
|
109
|
+
const { parent, all, wait } = options;
|
|
110
|
+
const transformedSelector = specUtils.transformSelector(this._spec, selector, this.driver);
|
|
111
|
+
let elements = [];
|
|
112
|
+
if (wait) {
|
|
113
|
+
if (this._spec.waitForSelector) {
|
|
114
|
+
const element = await this._spec.waitForSelector(this.target, specUtils.transformSelector(this._spec, selector, this.driver), parent, wait);
|
|
115
|
+
if (element)
|
|
116
|
+
elements = [element];
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
let waiting = true;
|
|
120
|
+
const timeout = setTimeout(() => (waiting = false), wait.timeout);
|
|
121
|
+
while (waiting) {
|
|
122
|
+
const element = await this._spec.findElement(this.target, specUtils.transformSelector(this._spec, selector, this.driver), parent);
|
|
123
|
+
if (element) {
|
|
124
|
+
clearTimeout(timeout);
|
|
125
|
+
elements = [element];
|
|
126
|
+
}
|
|
127
|
+
await utils.general.sleep(wait.interval);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (all) {
|
|
132
|
+
elements = await this._spec.findElements(this.target, transformedSelector, parent);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const element = await this._spec.findElement(this.target, transformedSelector, parent);
|
|
136
|
+
if (element)
|
|
137
|
+
elements = [element];
|
|
138
|
+
}
|
|
139
|
+
if (specUtils.isCommonSelector(this._spec, selector)) {
|
|
140
|
+
if (elements.length > 0) {
|
|
141
|
+
if (selector.child) {
|
|
142
|
+
elements = await elements.reduce((result, element) => {
|
|
143
|
+
return result.then(async (result) => {
|
|
144
|
+
return result.concat(await this._findElements(selector.child, { parent: element, all, wait }));
|
|
145
|
+
});
|
|
146
|
+
}, Promise.resolve([]));
|
|
147
|
+
}
|
|
148
|
+
else if (selector.shadow) {
|
|
149
|
+
elements = await elements.reduce((result, element) => {
|
|
150
|
+
return result.then(async (result) => {
|
|
151
|
+
const root = await this._spec.executeScript(this.target, snippets.getShadowRoot, [element]);
|
|
152
|
+
return result.concat(root ? await this._findElements(selector.shadow, { parent: root, all, wait }) : []);
|
|
153
|
+
});
|
|
154
|
+
}, Promise.resolve([]));
|
|
155
|
+
}
|
|
156
|
+
else if (selector.frame) {
|
|
157
|
+
elements = await elements.reduce((result, element) => {
|
|
158
|
+
return result.then(async (result) => {
|
|
159
|
+
const context = await this.context(element);
|
|
160
|
+
return result.concat(await context._findElements(selector.frame, { all, wait }));
|
|
161
|
+
});
|
|
162
|
+
}, Promise.resolve([]));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (elements.length === 0 && selector.fallback) {
|
|
166
|
+
elements = await this._findElements(selector.fallback, parent);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return elements;
|
|
170
|
+
}
|
|
107
171
|
async init() {
|
|
108
172
|
if (this.isInitialized)
|
|
109
173
|
return this;
|
|
@@ -201,62 +265,21 @@ class Context {
|
|
|
201
265
|
});
|
|
202
266
|
}
|
|
203
267
|
}
|
|
204
|
-
async root(selector) {
|
|
205
|
-
var _a;
|
|
206
|
-
await this.focus();
|
|
207
|
-
const { contextSelectors, elementSelector } = specUtils.splitSelector(this._spec, selector);
|
|
208
|
-
let context = this;
|
|
209
|
-
for (const contextSelector of contextSelectors) {
|
|
210
|
-
try {
|
|
211
|
-
context = await context.context(contextSelector);
|
|
212
|
-
await context.focus();
|
|
213
|
-
}
|
|
214
|
-
catch {
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
if ((_a = this.driver.features) === null || _a === void 0 ? void 0 : _a.shadowSelector)
|
|
219
|
-
return { context, selector: elementSelector };
|
|
220
|
-
let root = null;
|
|
221
|
-
let element = null;
|
|
222
|
-
let currentSelector = elementSelector;
|
|
223
|
-
while (specUtils.isCommonSelector(this._spec, currentSelector) &&
|
|
224
|
-
specUtils.isSelector(this._spec, currentSelector.shadow)) {
|
|
225
|
-
element = await this._spec.findElement(this.target, specUtils.transformSelector(this._spec, currentSelector, this.driver), root);
|
|
226
|
-
if (!element)
|
|
227
|
-
return null;
|
|
228
|
-
root = await this._spec.executeScript(this.target, snippets.getShadowRoot, [element]);
|
|
229
|
-
if (!root)
|
|
230
|
-
return null;
|
|
231
|
-
currentSelector = currentSelector.shadow;
|
|
232
|
-
}
|
|
233
|
-
return {
|
|
234
|
-
context,
|
|
235
|
-
shadow: element && new element_1.Element({ spec: this._spec, context, element, logger: this._logger }),
|
|
236
|
-
selector: currentSelector,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
268
|
async element(elementOrSelector) {
|
|
240
269
|
if (this._spec.isElement(elementOrSelector)) {
|
|
241
270
|
return new element_1.Element({ spec: this._spec, context: this, element: elementOrSelector, logger: this._logger });
|
|
242
271
|
}
|
|
243
|
-
else if (specUtils.isSelector(this._spec, elementOrSelector)) {
|
|
244
|
-
if (this.isRef) {
|
|
245
|
-
return new element_1.Element({ spec: this._spec, context: this, selector: elementOrSelector, logger: this._logger });
|
|
246
|
-
}
|
|
247
|
-
this._logger.log('Finding element by selector: ', elementOrSelector);
|
|
248
|
-
const root = await this.root(elementOrSelector);
|
|
249
|
-
if (!root)
|
|
250
|
-
return null;
|
|
251
|
-
const element = await this._spec.findElement(root.context.target, specUtils.transformSelector(this._spec, root.selector, this.driver), root.shadow && (await root.shadow.getShadowRoot()));
|
|
252
|
-
// TODO root.selector is not a full selector from context root to an element, but selector inside a shadow
|
|
253
|
-
return element
|
|
254
|
-
? new element_1.Element({ spec: this._spec, context: root.context, element, selector: root.selector, logger: this._logger })
|
|
255
|
-
: null;
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
272
|
+
else if (!specUtils.isSelector(this._spec, elementOrSelector)) {
|
|
258
273
|
throw new TypeError('Cannot find element using argument of unknown type!');
|
|
259
274
|
}
|
|
275
|
+
if (this.isRef) {
|
|
276
|
+
return new element_1.Element({ spec: this._spec, context: this, selector: elementOrSelector, logger: this._logger });
|
|
277
|
+
}
|
|
278
|
+
this._logger.log('Finding element by selector: ', elementOrSelector);
|
|
279
|
+
const [element] = await this._findElements(elementOrSelector, { all: false });
|
|
280
|
+
return element
|
|
281
|
+
? new element_1.Element({ spec: this._spec, context: this, element, selector: elementOrSelector, logger: this._logger })
|
|
282
|
+
: null;
|
|
260
283
|
}
|
|
261
284
|
async elements(selectorOrElement) {
|
|
262
285
|
if (specUtils.isSelector(this._spec, selectorOrElement)) {
|
|
@@ -264,17 +287,13 @@ class Context {
|
|
|
264
287
|
return [new element_1.Element({ spec: this._spec, context: this, selector: selectorOrElement, logger: this._logger })];
|
|
265
288
|
}
|
|
266
289
|
this._logger.log('Finding elements by selector: ', selectorOrElement);
|
|
267
|
-
const
|
|
268
|
-
if (!root)
|
|
269
|
-
return [];
|
|
270
|
-
const elements = await this._spec.findElements(root.context.target, specUtils.transformSelector(this._spec, root.selector, this.driver), root.shadow && (await root.shadow.getShadowRoot()));
|
|
290
|
+
const elements = await this._findElements(selectorOrElement, { all: true });
|
|
271
291
|
return elements.map((element, index) => {
|
|
272
|
-
// TODO root.selector is not a full selector from context root to an element, but selector inside a shadow
|
|
273
292
|
return new element_1.Element({
|
|
274
293
|
spec: this._spec,
|
|
275
|
-
context:
|
|
294
|
+
context: this,
|
|
276
295
|
element,
|
|
277
|
-
selector:
|
|
296
|
+
selector: selectorOrElement,
|
|
278
297
|
index,
|
|
279
298
|
logger: this._logger,
|
|
280
299
|
});
|
|
@@ -288,34 +307,10 @@ class Context {
|
|
|
288
307
|
}
|
|
289
308
|
}
|
|
290
309
|
async waitFor(selector, options) {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
options = { state: 'exist', timeout: 10000, interval: 500, ...options };
|
|
296
|
-
if (this._spec.waitForSelector) {
|
|
297
|
-
const element = await this._spec.waitForSelector(root.context.target, specUtils.transformSelector(this._spec, root.selector, this.driver), (_a = root.shadow) === null || _a === void 0 ? void 0 : _a.target, options);
|
|
298
|
-
return element
|
|
299
|
-
? new element_1.Element({ spec: this._spec, context: root.context, element, selector: root.selector, logger: this._logger })
|
|
300
|
-
: null;
|
|
301
|
-
}
|
|
302
|
-
let waiting = true;
|
|
303
|
-
const timeout = setTimeout(() => (waiting = false), options.timeout);
|
|
304
|
-
while (waiting) {
|
|
305
|
-
const element = await this._spec.findElement(root.context.target, specUtils.transformSelector(this._spec, root.selector, this.driver), (_b = root.shadow) === null || _b === void 0 ? void 0 : _b.target);
|
|
306
|
-
if (element) {
|
|
307
|
-
clearTimeout(timeout);
|
|
308
|
-
return new element_1.Element({
|
|
309
|
-
spec: this._spec,
|
|
310
|
-
context: root.context,
|
|
311
|
-
element,
|
|
312
|
-
selector: root.selector,
|
|
313
|
-
logger: this._logger,
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
await utils.general.sleep(options.interval);
|
|
317
|
-
}
|
|
318
|
-
return null;
|
|
310
|
+
const [element] = await this._findElements(selector, {
|
|
311
|
+
wait: { state: 'exist', timeout: 10000, interval: 500, ...options },
|
|
312
|
+
});
|
|
313
|
+
return element ? new element_1.Element({ spec: this._spec, context: this, element, selector, logger: this._logger }) : null;
|
|
319
314
|
}
|
|
320
315
|
async execute(script, arg) {
|
|
321
316
|
await this.focus();
|
package/dist/spec-utils.js
CHANGED
|
@@ -34,7 +34,7 @@ exports.isSimpleCommonSelector = isSimpleCommonSelector;
|
|
|
34
34
|
function isCommonSelector(spec, selector) {
|
|
35
35
|
return (utils.types.isPlainObject(selector) &&
|
|
36
36
|
utils.types.has(selector, 'selector') &&
|
|
37
|
-
Object.keys(selector).every(key => ['selector', 'type', 'frame', 'shadow'].includes(key)) &&
|
|
37
|
+
Object.keys(selector).every(key => ['selector', 'type', 'frame', 'shadow', 'child', 'fallback'].includes(key)) &&
|
|
38
38
|
(utils.types.isString(selector.selector) || spec.isSelector(selector.selector)));
|
|
39
39
|
}
|
|
40
40
|
exports.isCommonSelector = isCommonSelector;
|
|
@@ -67,7 +67,11 @@ function splitSelector(spec, selector) {
|
|
|
67
67
|
activeSelector.selector = targetSelector.selector;
|
|
68
68
|
if (targetSelector.type)
|
|
69
69
|
activeSelector.type = targetSelector.type;
|
|
70
|
-
if (targetSelector.
|
|
70
|
+
if (targetSelector.child) {
|
|
71
|
+
activeSelector = activeSelector.child = {};
|
|
72
|
+
targetSelector = targetSelector.child;
|
|
73
|
+
}
|
|
74
|
+
else if (targetSelector.shadow) {
|
|
71
75
|
activeSelector = activeSelector.shadow = {};
|
|
72
76
|
targetSelector = targetSelector.shadow;
|
|
73
77
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/driver",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.3",
|
|
4
4
|
"description": "Applitools universal framework wrapper",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"applitools",
|
|
@@ -87,9 +87,9 @@
|
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
"dependencies": {
|
|
90
|
-
"@applitools/logger": "1.1.
|
|
90
|
+
"@applitools/logger": "1.1.28",
|
|
91
91
|
"@applitools/snippets": "2.4.6",
|
|
92
|
-
"@applitools/utils": "1.3.
|
|
92
|
+
"@applitools/utils": "1.3.14",
|
|
93
93
|
"semver": "7.3.7"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
package/types/context.d.ts
CHANGED
|
@@ -47,15 +47,11 @@ export declare class Context<TDriver, TContext, TElement, TSelector> {
|
|
|
47
47
|
get isCurrent(): boolean;
|
|
48
48
|
get isInitialized(): boolean;
|
|
49
49
|
get isRef(): boolean;
|
|
50
|
+
private _findElements;
|
|
50
51
|
init(): Promise<this>;
|
|
51
52
|
focus(): Promise<this>;
|
|
52
53
|
equals(context: Context<TDriver, TContext, TElement, TSelector> | Element<TDriver, TContext, TElement, TSelector>): Promise<boolean>;
|
|
53
54
|
context(reference: ContextPlain<TDriver, TContext, TElement, TSelector>): Promise<Context<TDriver, TContext, TElement, TSelector>>;
|
|
54
|
-
root(selector: Selector<TSelector>): Promise<{
|
|
55
|
-
context: Context<TDriver, TContext, TElement, TSelector>;
|
|
56
|
-
shadow?: Element<TDriver, TContext, TElement, TSelector>;
|
|
57
|
-
selector: Selector<TSelector>;
|
|
58
|
-
}>;
|
|
59
55
|
element(elementOrSelector: TElement | Selector<TSelector>): Promise<Element<TDriver, TContext, TElement, TSelector>>;
|
|
60
56
|
elements(selectorOrElement: Selector<TSelector> | TElement): Promise<Element<TDriver, TContext, TElement, TSelector>[]>;
|
|
61
57
|
waitFor(selector: Selector<TSelector>, options?: WaitOptions): Promise<Element<TDriver, TContext, TElement, TSelector>>;
|
package/types/selector.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare type Selector<TSelector = never> = TSelector | string | {
|
|
2
2
|
selector: TSelector | string;
|
|
3
3
|
type?: string;
|
|
4
|
+
child?: Selector<TSelector>;
|
|
4
5
|
shadow?: Selector<TSelector>;
|
|
5
6
|
frame?: Selector<TSelector>;
|
|
7
|
+
fallback?: Selector<TSelector>;
|
|
6
8
|
};
|
|
7
9
|
export declare type CommonSelector = Selector;
|
package/types/spec-utils.d.ts
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { type SpecDriver } from './spec-driver';
|
|
2
2
|
import { type Selector } from './selector';
|
|
3
|
-
declare type CommonSelector<TSelector = never> =
|
|
4
|
-
selector: TSelector | string;
|
|
5
|
-
type?: string;
|
|
6
|
-
shadow?: CommonSelector<TSelector> | TSelector | string;
|
|
7
|
-
frame?: CommonSelector<TSelector> | TSelector | string;
|
|
8
|
-
};
|
|
3
|
+
declare type CommonSelector<TSelector = never> = Exclude<Selector<TSelector>, TSelector | string>;
|
|
9
4
|
export declare function isSimpleCommonSelector(selector: any): selector is CommonSelector;
|
|
10
5
|
export declare function isCommonSelector<TSelector>(spec: Pick<SpecDriver<unknown, unknown, unknown, TSelector>, 'isSelector'>, selector: any): selector is CommonSelector<TSelector>;
|
|
11
6
|
export declare function isSelector<TSelector>(spec: Pick<SpecDriver<unknown, unknown, unknown, TSelector>, 'isSelector'>, selector: any): selector is Selector<TSelector>;
|