promod 2.5.3 → 3.0.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/built/cjs/config.d.ts +43 -0
- package/built/cjs/config.js +161 -0
- package/built/cjs/config.js.map +1 -0
- package/built/cjs/helpers/execute.script.d.ts +1 -1
- package/built/cjs/helpers/execute.script.js +1 -3
- package/built/cjs/helpers/execute.script.js.map +1 -1
- package/built/cjs/index.d.ts +3 -1
- package/built/cjs/index.js +4 -1
- package/built/cjs/index.js.map +1 -1
- package/built/cjs/interface.d.ts +8 -4
- package/built/cjs/mappers.d.ts +1 -1
- package/built/cjs/mappers.js.map +1 -1
- package/built/cjs/pw/index.d.ts +2 -2
- package/built/cjs/pw/pw_client.d.ts +11 -10
- package/built/cjs/pw/pw_client.js +37 -56
- package/built/cjs/pw/pw_client.js.map +1 -1
- package/built/cjs/pw/pw_element.d.ts +17 -16
- package/built/cjs/pw/pw_element.js +19 -46
- package/built/cjs/pw/pw_element.js.map +1 -1
- package/built/cjs/shared/custom_selector_filter.d.ts +19 -0
- package/built/cjs/shared/custom_selector_filter.js +40 -0
- package/built/cjs/shared/custom_selector_filter.js.map +1 -0
- package/built/cjs/shared/validate_browser.d.ts +7 -0
- package/built/cjs/shared/validate_browser.js +29 -0
- package/built/cjs/shared/validate_browser.js.map +1 -0
- package/built/cjs/swd/swd_alignment.d.ts +1 -1
- package/built/cjs/swd/swd_alignment.js +2 -28
- package/built/cjs/swd/swd_alignment.js.map +1 -1
- package/built/cjs/swd/swd_client.d.ts +13 -10
- package/built/cjs/swd/swd_client.js +95 -31
- package/built/cjs/swd/swd_client.js.map +1 -1
- package/built/cjs/swd/swd_element.d.ts +14 -13
- package/built/cjs/swd/swd_element.js +13 -12
- package/built/cjs/swd/swd_element.js.map +1 -1
- package/built/esm/config.d.ts +43 -0
- package/built/esm/config.js +158 -0
- package/built/esm/config.js.map +1 -0
- package/built/esm/helpers/execute.script.d.ts +1 -1
- package/built/esm/helpers/execute.script.js +5 -9
- package/built/esm/helpers/execute.script.js.map +1 -1
- package/built/esm/index.d.ts +3 -1
- package/built/esm/index.js +4 -7
- package/built/esm/index.js.map +1 -1
- package/built/esm/interface.d.ts +8 -4
- package/built/esm/interface.js +1 -2
- package/built/esm/internals/index.js +1 -5
- package/built/esm/internals/index.js.map +1 -1
- package/built/esm/internals/logger.js +3 -6
- package/built/esm/internals/logger.js.map +1 -1
- package/built/esm/mappers.d.ts +1 -1
- package/built/esm/mappers.js +1 -7
- package/built/esm/mappers.js.map +1 -1
- package/built/esm/pw/index.d.ts +2 -2
- package/built/esm/pw/index.js +7 -10
- package/built/esm/pw/index.js.map +1 -1
- package/built/esm/pw/pw_client.d.ts +11 -10
- package/built/esm/pw/pw_client.js +93 -116
- package/built/esm/pw/pw_client.js.map +1 -1
- package/built/esm/pw/pw_element.d.ts +17 -16
- package/built/esm/pw/pw_element.js +84 -118
- package/built/esm/pw/pw_element.js.map +1 -1
- package/built/esm/shared/custom_selector_filter.d.ts +19 -0
- package/built/esm/shared/custom_selector_filter.js +38 -0
- package/built/esm/shared/custom_selector_filter.js.map +1 -0
- package/built/esm/shared/validate_browser.d.ts +7 -0
- package/built/esm/shared/validate_browser.js +27 -0
- package/built/esm/shared/validate_browser.js.map +1 -0
- package/built/esm/swd/index.js +7 -10
- package/built/esm/swd/index.js.map +1 -1
- package/built/esm/swd/swd_alignment.d.ts +1 -1
- package/built/esm/swd/swd_alignment.js +13 -42
- package/built/esm/swd/swd_alignment.js.map +1 -1
- package/built/esm/swd/swd_client.d.ts +13 -10
- package/built/esm/swd/swd_client.js +171 -111
- package/built/esm/swd/swd_client.js.map +1 -1
- package/built/esm/swd/swd_element.d.ts +14 -13
- package/built/esm/swd/swd_element.js +90 -97
- package/built/esm/swd/swd_element.js.map +1 -1
- package/docs/client.md +335 -111
- package/docs/config.md +176 -0
- package/docs/element.md +214 -141
- package/docs/elements.md +125 -65
- package/docs/init.md +66 -12
- package/oxlintrc.json +20 -0
- package/package.json +15 -18
- package/readme.md +114 -14
- package/tsconfig.esm.json +6 -2
- package/tsconfig.json +4 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Browser } from './pw_client';
|
|
1
2
|
import type { PromodElementType, PromodElementsType } from '../interface';
|
|
2
3
|
import type { TCustomSelector } from '../mappers';
|
|
3
|
-
import type { Locator } from 'playwright-core';
|
|
4
|
+
import type { Locator, ElementHandle } from 'playwright-core';
|
|
4
5
|
declare class PromodPlaywrightElements {
|
|
5
6
|
private _driver;
|
|
6
7
|
private _driverElements;
|
|
@@ -9,8 +10,8 @@ declare class PromodPlaywrightElements {
|
|
|
9
10
|
private useParent;
|
|
10
11
|
private selector;
|
|
11
12
|
parentSelector: string;
|
|
12
|
-
_browserInterface:
|
|
13
|
-
constructor(selector:
|
|
13
|
+
_browserInterface: Browser;
|
|
14
|
+
constructor(selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, client: Browser, getParent?: (...args: unknown[]) => Promise<unknown>, getExecuteScriptArgs?: () => unknown[], useParent?: boolean);
|
|
14
15
|
/**
|
|
15
16
|
* @private
|
|
16
17
|
*
|
|
@@ -28,7 +29,7 @@ declare class PromodPlaywrightElements {
|
|
|
28
29
|
* @param {number} index
|
|
29
30
|
* @returns {PromodElementType}
|
|
30
31
|
*/
|
|
31
|
-
get(index:
|
|
32
|
+
get(index: number): PromodElementType;
|
|
32
33
|
/**
|
|
33
34
|
* @example
|
|
34
35
|
*
|
|
@@ -68,7 +69,7 @@ declare class PromodPlaywrightElements {
|
|
|
68
69
|
*
|
|
69
70
|
* @returns {Promise<ElementHandle[]>}
|
|
70
71
|
*/
|
|
71
|
-
getEngineElements(): Promise<Locator[]>;
|
|
72
|
+
getEngineElements(): Promise<(Locator | ElementHandle<Node>)[]>;
|
|
72
73
|
/**
|
|
73
74
|
* @example
|
|
74
75
|
*
|
|
@@ -131,8 +132,8 @@ declare class PromodPlaywrightElement {
|
|
|
131
132
|
private useParent;
|
|
132
133
|
selector: string;
|
|
133
134
|
parentSelector: string;
|
|
134
|
-
_browserInterface:
|
|
135
|
-
constructor(selector:
|
|
135
|
+
_browserInterface: Browser;
|
|
136
|
+
constructor(selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, client: Browser, getParent?: (...args: unknown[]) => Promise<unknown>, getExecuteScriptArgs?: () => unknown[], useParent?: boolean);
|
|
136
137
|
/**
|
|
137
138
|
* @private
|
|
138
139
|
* @returns {Promise<ElementHandle<Node>>}
|
|
@@ -146,7 +147,7 @@ declare class PromodPlaywrightElement {
|
|
|
146
147
|
* @param {any[]} rest
|
|
147
148
|
* @returns {PromodElementType}
|
|
148
149
|
*/
|
|
149
|
-
$(selector:
|
|
150
|
+
$(selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, ...rest: unknown[]): PromodElementType;
|
|
150
151
|
/**
|
|
151
152
|
* @example
|
|
152
153
|
* const buttons = $$('button');
|
|
@@ -155,7 +156,7 @@ declare class PromodPlaywrightElement {
|
|
|
155
156
|
* @param {any[]} rest
|
|
156
157
|
* @returns {PromodElementsType}
|
|
157
158
|
*/
|
|
158
|
-
$$(selector:
|
|
159
|
+
$$(selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, ...rest: unknown[]): PromodElementsType;
|
|
159
160
|
/**
|
|
160
161
|
* @example
|
|
161
162
|
* const button = $('button');
|
|
@@ -232,7 +233,7 @@ declare class PromodPlaywrightElement {
|
|
|
232
233
|
* @returns {Promise<string>}
|
|
233
234
|
*/
|
|
234
235
|
getTagName(): Promise<string>;
|
|
235
|
-
getCssValue(): Promise<
|
|
236
|
+
getCssValue(cssStyleProperty: string): Promise<string>;
|
|
236
237
|
getAttribute(attribute: string): Promise<string>;
|
|
237
238
|
getRect(): Promise<{
|
|
238
239
|
x: number;
|
|
@@ -364,11 +365,11 @@ declare class PromodPlaywrightElement {
|
|
|
364
365
|
};
|
|
365
366
|
private isInteractionIntercepted;
|
|
366
367
|
}
|
|
367
|
-
declare const $: (selector: string | TCustomSelector | ((...args:
|
|
368
|
-
declare const $$: (selector: string | TCustomSelector | ((...args:
|
|
369
|
-
declare function preBindBrowserInstance(browserThaNeedsToBeBinded:
|
|
370
|
-
$: (selector: string | TCustomSelector | ((...args:
|
|
371
|
-
$$: (selector: string | TCustomSelector | ((...args:
|
|
372
|
-
browser:
|
|
368
|
+
declare const $: (selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, root?: PromodElementType, ...rest: unknown[]) => PromodElementType;
|
|
369
|
+
declare const $$: (selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, root?: PromodElementType, ...rest: unknown[]) => PromodElementsType;
|
|
370
|
+
declare function preBindBrowserInstance(browserThaNeedsToBeBinded: Browser): {
|
|
371
|
+
$: (selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, root?: PromodElementType, ...rest: unknown[]) => PromodElementType;
|
|
372
|
+
$$: (selector: string | TCustomSelector | ((...args: unknown[]) => unknown) | Promise<unknown>, root?: PromodElementType, ...rest: unknown[]) => PromodElementsType;
|
|
373
|
+
browser: Browser;
|
|
373
374
|
};
|
|
374
375
|
export { $, $$, PromodPlaywrightElement, PromodPlaywrightElements, preBindBrowserInstance };
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PromodPlaywrightElements = exports.PromodPlaywrightElement = exports.$$ = exports.$ = void 0;
|
|
4
|
-
exports.preBindBrowserInstance = preBindBrowserInstance;
|
|
5
1
|
/* eslint-disable max-len */
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
import { getType, isUndefined, isObject, toArray, isString, isNumber, isFunction, isAsyncFunction, isPromise, lengthToIndexesArray, getRandomString, } from 'sat-utils';
|
|
3
|
+
import { browser } from './pw_client';
|
|
4
|
+
import { getPositionXY, KeysSWD } from '../mappers';
|
|
5
|
+
import { promodLogger } from '../internals';
|
|
6
|
+
import { customSelectorFilterFn } from '../shared/custom_selector_filter';
|
|
10
7
|
const buildBy = (selector, getExecuteScriptArgs, parent, toMany) => {
|
|
11
|
-
getExecuteScriptArgs =
|
|
12
|
-
if (
|
|
8
|
+
getExecuteScriptArgs = isFunction(getExecuteScriptArgs) ? getExecuteScriptArgs : () => [];
|
|
9
|
+
if (isString(selector) && selector.includes('xpath=')) {
|
|
13
10
|
const sel = selector;
|
|
14
11
|
if (sel.startsWith('xpath=//')) {
|
|
15
12
|
return sel.replace('xpath=', '');
|
|
@@ -21,43 +18,16 @@ const buildBy = (selector, getExecuteScriptArgs, parent, toMany) => {
|
|
|
21
18
|
return sel.replace('xpath=.', '').replace(/\|\./gi, '|');
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
else if (
|
|
21
|
+
else if (isPromise(selector)) {
|
|
25
22
|
return selector;
|
|
26
23
|
}
|
|
27
|
-
else if (
|
|
24
|
+
else if (isFunction(selector) || isAsyncFunction(selector)) {
|
|
28
25
|
return [selector, ...getExecuteScriptArgs()];
|
|
29
26
|
}
|
|
30
|
-
else if (
|
|
27
|
+
else if (isObject(selector)) {
|
|
31
28
|
const item = selector;
|
|
32
29
|
return [
|
|
33
|
-
|
|
34
|
-
const { query, text, rg, strict, toMany, rgFlags = 'gmi' } = entry;
|
|
35
|
-
const elements = parent ? parent.querySelectorAll(query) : document.querySelectorAll(query);
|
|
36
|
-
if (!elements.length)
|
|
37
|
-
return null;
|
|
38
|
-
const filteredElements = [];
|
|
39
|
-
for (const element of elements) {
|
|
40
|
-
const innerText = element?.innerText?.trim() || element?.textContent?.trim() || element?.outerHTML?.trim();
|
|
41
|
-
const textMatches = typeof text === 'string' && (!strict ? innerText.includes(text) : innerText === text);
|
|
42
|
-
const rgMatches = rg && innerText.match(new RegExp(rg, rgFlags));
|
|
43
|
-
if (rgMatches && !toMany) {
|
|
44
|
-
return element;
|
|
45
|
-
}
|
|
46
|
-
else if (textMatches && !toMany) {
|
|
47
|
-
return element;
|
|
48
|
-
}
|
|
49
|
-
else if (rgMatches && toMany) {
|
|
50
|
-
filteredElements.push(element);
|
|
51
|
-
}
|
|
52
|
-
else if (textMatches && toMany) {
|
|
53
|
-
filteredElements.push(element);
|
|
54
|
-
}
|
|
55
|
-
if (!text && !rg) {
|
|
56
|
-
return element;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return toMany ? filteredElements : null;
|
|
60
|
-
},
|
|
30
|
+
customSelectorFilterFn,
|
|
61
31
|
[parent, { ...item, toMany }],
|
|
62
32
|
];
|
|
63
33
|
}
|
|
@@ -87,9 +57,9 @@ class PromodPlaywrightElements {
|
|
|
87
57
|
* @returns {Promise<ElementHandle>}
|
|
88
58
|
*/
|
|
89
59
|
async getElement(index) {
|
|
90
|
-
|
|
91
|
-
this._driver = await
|
|
92
|
-
const ignoreParent =
|
|
60
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "getElement" from wrapped API, args: `, index);
|
|
61
|
+
this._driver = await browser['getWorkingContext']();
|
|
62
|
+
const ignoreParent = isString(this.selector) && this.selector.startsWith('ignore-parent=');
|
|
93
63
|
const selector = ignoreParent ? this.selector.replace('ignore-parent=', '') : this.selector;
|
|
94
64
|
const shouldUserDocumentRoot = selector.toString().startsWith('xpath=//') || ignoreParent;
|
|
95
65
|
let parent;
|
|
@@ -114,31 +84,29 @@ class PromodPlaywrightElements {
|
|
|
114
84
|
return this._driverElements[index];
|
|
115
85
|
}
|
|
116
86
|
const getElementArgs = buildBy(selector, this.getExecuteScriptArgs);
|
|
117
|
-
if (
|
|
87
|
+
if (isString(selector)) {
|
|
118
88
|
const items = await (parent || this._driver).locator(getElementArgs);
|
|
119
89
|
this._driverElements = await items.all();
|
|
120
90
|
}
|
|
121
|
-
else if (
|
|
91
|
+
else if (isFunction(getElementArgs[0]) || isAsyncFunction(getElementArgs[0])) {
|
|
122
92
|
const [queryFn, quertFnArgs] = buildBy(selector, this.getExecuteScriptArgs, parent, true);
|
|
123
93
|
const elementHandles = [];
|
|
124
94
|
const resolved = [];
|
|
125
|
-
const callArgs =
|
|
95
|
+
const callArgs = toArray(quertFnArgs);
|
|
126
96
|
for (const item of callArgs) {
|
|
127
97
|
// TODO refactor resolver
|
|
128
98
|
const resolvedItem = await item;
|
|
129
|
-
resolved.push(resolvedItem?.
|
|
99
|
+
resolved.push(resolvedItem?.evaluate ? await resolvedItem.evaluateHandle((node) => node) : resolvedItem);
|
|
130
100
|
}
|
|
131
|
-
// @ts-ignore
|
|
132
101
|
const handlesByFunctionSearch = await this._driver.evaluateHandle(queryFn, resolved.length === 1 ? resolved[0] : resolved);
|
|
133
|
-
// @ts-ignore
|
|
134
102
|
const availableHandlesLength = await this._driver.evaluate((nodes) => nodes.length, handlesByFunctionSearch);
|
|
135
|
-
for (const index of
|
|
136
|
-
const handle = await this._driver.evaluateHandle(
|
|
137
|
-
|
|
138
|
-
(
|
|
139
|
-
|
|
103
|
+
for (const index of lengthToIndexesArray(availableHandlesLength)) {
|
|
104
|
+
const handle = await this._driver.evaluateHandle(([nodes, itemIndex]) => nodes[itemIndex], [handlesByFunctionSearch, index]);
|
|
105
|
+
const element = handle.asElement();
|
|
106
|
+
if (element)
|
|
107
|
+
elementHandles.push(element);
|
|
140
108
|
}
|
|
141
|
-
this._driverElements = elementHandles
|
|
109
|
+
this._driverElements = elementHandles;
|
|
142
110
|
}
|
|
143
111
|
else {
|
|
144
112
|
this._driverElements = await this._driver.locator(buildBy(this.selector, this.getExecuteScriptArgs)).all();
|
|
@@ -174,7 +142,7 @@ class PromodPlaywrightElements {
|
|
|
174
142
|
* @returns {PromodElementType}
|
|
175
143
|
*/
|
|
176
144
|
last() {
|
|
177
|
-
|
|
145
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "last" from wrapped API`);
|
|
178
146
|
return this.get(-1);
|
|
179
147
|
}
|
|
180
148
|
/**
|
|
@@ -190,17 +158,18 @@ class PromodPlaywrightElements {
|
|
|
190
158
|
return new PromodPlaywrightElement(this.selector, this._browserInterface, this.find.bind(this, (el) => el.isDisplayed()), null, true);
|
|
191
159
|
}
|
|
192
160
|
getAllVisible() {
|
|
161
|
+
const self = this;
|
|
193
162
|
const _getElements = async function _getElements() {
|
|
194
|
-
await
|
|
163
|
+
await self.getElement(0);
|
|
195
164
|
const els = [];
|
|
196
|
-
for (let i = 0; i <
|
|
197
|
-
const el =
|
|
165
|
+
for (let i = 0; i < self._driverElements.length; i++) {
|
|
166
|
+
const el = self._driverElements[i];
|
|
198
167
|
if (await el.isVisible()) {
|
|
199
168
|
els.push(el);
|
|
200
169
|
}
|
|
201
170
|
}
|
|
202
171
|
return els;
|
|
203
|
-
}
|
|
172
|
+
};
|
|
204
173
|
const promodElements = new PromodPlaywrightElements(this.selector, this._browserInterface, _getElements, null, true);
|
|
205
174
|
return promodElements;
|
|
206
175
|
}
|
|
@@ -214,7 +183,7 @@ class PromodPlaywrightElements {
|
|
|
214
183
|
* @returns {PromodElementType}
|
|
215
184
|
*/
|
|
216
185
|
first() {
|
|
217
|
-
|
|
186
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "first" from wrapped API`);
|
|
218
187
|
return this.get(0);
|
|
219
188
|
}
|
|
220
189
|
/**
|
|
@@ -226,7 +195,7 @@ class PromodPlaywrightElements {
|
|
|
226
195
|
* @returns {Promise<ElementHandle[]>}
|
|
227
196
|
*/
|
|
228
197
|
async getEngineElements() {
|
|
229
|
-
|
|
198
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "getEngineElements" from wrapped API`);
|
|
230
199
|
await this.getElement();
|
|
231
200
|
return this._driverElements;
|
|
232
201
|
}
|
|
@@ -239,7 +208,7 @@ class PromodPlaywrightElements {
|
|
|
239
208
|
* @param {(item, index) => Promise<void>} cb
|
|
240
209
|
*/
|
|
241
210
|
async each(cb) {
|
|
242
|
-
|
|
211
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "each" from wrapped API, args: `, cb);
|
|
243
212
|
await this.getElement(0);
|
|
244
213
|
for (let i = 0; i < this._driverElements.length; i++) {
|
|
245
214
|
await cb(this.get(i), i);
|
|
@@ -254,7 +223,7 @@ class PromodPlaywrightElements {
|
|
|
254
223
|
* @returns {Promise<any[]>}
|
|
255
224
|
*/
|
|
256
225
|
async map(cb) {
|
|
257
|
-
|
|
226
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "map" from wrapped API, args: `, cb);
|
|
258
227
|
await this.getElement(0);
|
|
259
228
|
const res = [];
|
|
260
229
|
for (let i = 0; i < this._driverElements.length; i++) {
|
|
@@ -271,7 +240,7 @@ class PromodPlaywrightElements {
|
|
|
271
240
|
* @returns {Promise<boolean>}
|
|
272
241
|
*/
|
|
273
242
|
async some(cb) {
|
|
274
|
-
|
|
243
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "some" from wrapped API, args: `, cb);
|
|
275
244
|
await this.getElement(0);
|
|
276
245
|
for (let i = 0; i < this._driverElements.length; i++) {
|
|
277
246
|
const res = await cb(this.get(i), i).catch(() => false);
|
|
@@ -290,7 +259,7 @@ class PromodPlaywrightElements {
|
|
|
290
259
|
* @returns {Promise<boolean>}
|
|
291
260
|
*/
|
|
292
261
|
async every(cb) {
|
|
293
|
-
|
|
262
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "every" from wrapped API, args: `, cb);
|
|
294
263
|
await this.getElement(0);
|
|
295
264
|
for (let i = 0; i < this._driverElements.length; i++) {
|
|
296
265
|
const res = await cb(this.get(i), i).catch(() => false);
|
|
@@ -309,7 +278,7 @@ class PromodPlaywrightElements {
|
|
|
309
278
|
* @returns {Promise<PromodElementType>}
|
|
310
279
|
*/
|
|
311
280
|
async find(cb) {
|
|
312
|
-
|
|
281
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "find" from wrapped API, args: `, cb);
|
|
313
282
|
await this.getElement(0);
|
|
314
283
|
for (let i = 0; i < this._driverElements.length; i++) {
|
|
315
284
|
const el = this.get(i);
|
|
@@ -327,16 +296,15 @@ class PromodPlaywrightElements {
|
|
|
327
296
|
* @returns {Promise<number>}
|
|
328
297
|
*/
|
|
329
298
|
async count() {
|
|
330
|
-
|
|
299
|
+
promodLogger.engineLog(`[PW] Promod elements interface calls method "count" from wrapped API`);
|
|
331
300
|
return this.getElement()
|
|
332
301
|
.then(() => this._driverElements.length)
|
|
333
302
|
.catch((error) => {
|
|
334
|
-
|
|
303
|
+
promodLogger.engineLog(`Promod elements interface gets error after method "count" from wrapped API, error: `, error);
|
|
335
304
|
return 0;
|
|
336
305
|
});
|
|
337
306
|
}
|
|
338
307
|
}
|
|
339
|
-
exports.PromodPlaywrightElements = PromodPlaywrightElements;
|
|
340
308
|
class PromodPlaywrightElement {
|
|
341
309
|
_driver;
|
|
342
310
|
_driverElement;
|
|
@@ -358,9 +326,9 @@ class PromodPlaywrightElement {
|
|
|
358
326
|
* @returns {Promise<ElementHandle<Node>>}
|
|
359
327
|
*/
|
|
360
328
|
async getElement() {
|
|
361
|
-
|
|
362
|
-
this._driver = await
|
|
363
|
-
const ignoreParent =
|
|
329
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "getElement" from wrapped API`);
|
|
330
|
+
this._driver = await browser['getWorkingContext']();
|
|
331
|
+
const ignoreParent = isString(this.selector) && this.selector.startsWith('ignore-parent=');
|
|
364
332
|
const selector = ignoreParent ? this.selector.replace('ignore-parent=', '') : this.selector;
|
|
365
333
|
const shouldUserDocumentRoot = selector.toString().startsWith('xpath=//') || ignoreParent;
|
|
366
334
|
let parent;
|
|
@@ -380,31 +348,27 @@ class PromodPlaywrightElement {
|
|
|
380
348
|
return this._driverElement;
|
|
381
349
|
}
|
|
382
350
|
const getElementArgs = buildBy(selector, this.getExecuteScriptArgs, parent, false);
|
|
383
|
-
if (this.getParent && !ignoreParent &&
|
|
351
|
+
if (this.getParent && !ignoreParent && isString(selector)) {
|
|
384
352
|
this._driverElement = (await (parent || this._driver).locator(getElementArgs).all())[0];
|
|
385
353
|
}
|
|
386
|
-
else if (
|
|
354
|
+
else if (isFunction(getElementArgs[0]) || isAsyncFunction(getElementArgs[0])) {
|
|
387
355
|
const [queryFn, quertFnArgs] = getElementArgs;
|
|
388
356
|
const resolved = [];
|
|
389
|
-
const callArgs =
|
|
357
|
+
const callArgs = toArray(quertFnArgs);
|
|
390
358
|
for (const item of callArgs) {
|
|
391
359
|
// TODO refactor resolver
|
|
392
360
|
const resolvedItem = await item;
|
|
393
|
-
resolved.push(resolvedItem?.
|
|
361
|
+
resolved.push(resolvedItem?.evaluate ? await resolvedItem.evaluateHandle((node) => node) : resolvedItem);
|
|
394
362
|
}
|
|
395
363
|
const result = (await this._driver.evaluateHandle(queryFn, resolved.length === 1 ? resolved[0] : resolved)).asElement();
|
|
396
|
-
let tempLocatorDataAttribute = `${
|
|
364
|
+
let tempLocatorDataAttribute = `${getRandomString(25, { letters: true })}`;
|
|
397
365
|
const locatoDataAttribute = await result.evaluate((n, item) => {
|
|
398
|
-
// @ts-ignore
|
|
399
366
|
if (n.dataset.promod_element_item) {
|
|
400
|
-
// @ts-ignore
|
|
401
367
|
return n.dataset.promod_element_item;
|
|
402
368
|
}
|
|
403
369
|
else {
|
|
404
|
-
// @ts-ignore
|
|
405
370
|
n.dataset.promod_element_item = `${item}`;
|
|
406
371
|
}
|
|
407
|
-
// @ts-ignore
|
|
408
372
|
return n.dataset.promod_element_item;
|
|
409
373
|
}, tempLocatorDataAttribute);
|
|
410
374
|
await result.dispose();
|
|
@@ -429,7 +393,7 @@ class PromodPlaywrightElement {
|
|
|
429
393
|
* @returns {PromodElementType}
|
|
430
394
|
*/
|
|
431
395
|
$(selector, ...rest) {
|
|
432
|
-
|
|
396
|
+
promodLogger.engineLog('[PW] Create new promod child element, selector: ', selector);
|
|
433
397
|
const [, executeScriptArgsGetter] = getInitElementRest(selector, null, ...rest);
|
|
434
398
|
const childElement = new PromodPlaywrightElement(selector, this._browserInterface, this.getElement.bind(this), executeScriptArgsGetter);
|
|
435
399
|
childElement.parentSelector = this.selector;
|
|
@@ -444,7 +408,7 @@ class PromodPlaywrightElement {
|
|
|
444
408
|
* @returns {PromodElementsType}
|
|
445
409
|
*/
|
|
446
410
|
$$(selector, ...rest) {
|
|
447
|
-
|
|
411
|
+
promodLogger.engineLog('[PW] Create new promod child elements, selector: ', selector);
|
|
448
412
|
const [, executeScriptArgsGetter] = getInitElementRest(selector, null, ...rest);
|
|
449
413
|
const childElements = new PromodPlaywrightElements(selector, this._browserInterface, this.getElement.bind(this), executeScriptArgsGetter);
|
|
450
414
|
childElements.parentSelector = this.selector;
|
|
@@ -469,9 +433,9 @@ class PromodPlaywrightElement {
|
|
|
469
433
|
* @returns {Promise<void>}
|
|
470
434
|
*/
|
|
471
435
|
async doubleClick(opts = { timeout: 500 }) {
|
|
472
|
-
|
|
473
|
-
if (!
|
|
474
|
-
throw new TypeError(`click(); accepts only object type ${
|
|
436
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "click" from wrapped API, args: `, opts);
|
|
437
|
+
if (!isObject(opts) && !isUndefined(opts)) {
|
|
438
|
+
throw new TypeError(`click(); accepts only object type ${getType(opts)}`);
|
|
475
439
|
}
|
|
476
440
|
const { withScroll, allowForceIfIntercepted, ...pwOpts } = opts;
|
|
477
441
|
await this.getElement();
|
|
@@ -511,9 +475,9 @@ class PromodPlaywrightElement {
|
|
|
511
475
|
* @returns {Promise<void>}
|
|
512
476
|
*/
|
|
513
477
|
async click(opts = { clickCount: 1, timeout: 500 }) {
|
|
514
|
-
|
|
515
|
-
if (!
|
|
516
|
-
throw new TypeError(`click(); accepts only object type ${
|
|
478
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "click" from wrapped API, args: `, opts);
|
|
479
|
+
if (!isObject(opts) && !isUndefined(opts)) {
|
|
480
|
+
throw new TypeError(`click(); accepts only object type ${getType(opts)}`);
|
|
517
481
|
}
|
|
518
482
|
const { withScroll, allowForceIfIntercepted, ...pwOpts } = opts;
|
|
519
483
|
await this.getElement();
|
|
@@ -543,11 +507,15 @@ class PromodPlaywrightElement {
|
|
|
543
507
|
* @returns {Promise<string>}
|
|
544
508
|
*/
|
|
545
509
|
async getTagName() {
|
|
546
|
-
|
|
510
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "getTagName" from wrapped API`);
|
|
547
511
|
await this.getElement();
|
|
548
512
|
return await this._driverElement.evaluate((item) => item.nodeName.toLowerCase());
|
|
549
513
|
}
|
|
550
|
-
async getCssValue() {
|
|
514
|
+
async getCssValue(cssStyleProperty) {
|
|
515
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "getCssValue" from wrapped API, args: `, cssStyleProperty);
|
|
516
|
+
await this.getElement();
|
|
517
|
+
return await this._driverElement.evaluate((el, prop) => window.getComputedStyle(el).getPropertyValue(prop), cssStyleProperty);
|
|
518
|
+
}
|
|
551
519
|
async getAttribute(attribute) {
|
|
552
520
|
await this.getElement();
|
|
553
521
|
return this._driverElement.getAttribute(attribute);
|
|
@@ -570,21 +538,21 @@ class PromodPlaywrightElement {
|
|
|
570
538
|
* @param value
|
|
571
539
|
*/
|
|
572
540
|
async sendKeys(value, asFill) {
|
|
573
|
-
|
|
574
|
-
if (!
|
|
575
|
-
throw new TypeError(`sendKeys(); accepts only string or number value type ${
|
|
541
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "sendKeys" from wrapped API, args: `, value);
|
|
542
|
+
if (!isString(value) && !isNumber(value)) {
|
|
543
|
+
throw new TypeError(`sendKeys(); accepts only string or number value type ${getType(value)}`);
|
|
576
544
|
}
|
|
577
545
|
await this.getElement();
|
|
578
546
|
if (asFill) {
|
|
579
547
|
return this._driverElement.fill(value.toString());
|
|
580
548
|
}
|
|
581
549
|
const stringValue = value.toString();
|
|
582
|
-
const seleniumKeysAlignment = Object.values(
|
|
550
|
+
const seleniumKeysAlignment = Object.values(KeysSWD);
|
|
583
551
|
for (const char of stringValue.split('')) {
|
|
584
552
|
if (seleniumKeysAlignment.includes(char)) {
|
|
585
553
|
// TODO - this needs to be done in a better way
|
|
586
554
|
await this.click();
|
|
587
|
-
await
|
|
555
|
+
await browser.keyDownAndUp(Object.keys(KeysSWD).find((k) => KeysSWD[k] === char));
|
|
588
556
|
}
|
|
589
557
|
else {
|
|
590
558
|
await this._driverElement.pressSequentially(char, { delay: 7 });
|
|
@@ -606,7 +574,7 @@ class PromodPlaywrightElement {
|
|
|
606
574
|
* @returns {Promise<void>}
|
|
607
575
|
*/
|
|
608
576
|
async hover(opts = { force: true, timeout: 500 }) {
|
|
609
|
-
|
|
577
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "hover" from wrapped API`);
|
|
610
578
|
await this.getElement();
|
|
611
579
|
await this._driverElement.hover(opts);
|
|
612
580
|
}
|
|
@@ -619,9 +587,9 @@ class PromodPlaywrightElement {
|
|
|
619
587
|
* @returns {Promise<void>}
|
|
620
588
|
*/
|
|
621
589
|
async hoverByElementCoordinate(position = 'center') {
|
|
622
|
-
|
|
590
|
+
promodLogger.engineLog(`Promod element interface calls method "hoverByElementCoordinate" from wrapped API, args: `, position);
|
|
623
591
|
const { x, y } = await this.getElementCoordinates(position);
|
|
624
|
-
await (await
|
|
592
|
+
await (await browser['getCurrentPage']()).mouse.move(x, y);
|
|
625
593
|
}
|
|
626
594
|
/**
|
|
627
595
|
* @example
|
|
@@ -632,18 +600,18 @@ class PromodPlaywrightElement {
|
|
|
632
600
|
* @returns {Promise<void>}
|
|
633
601
|
*/
|
|
634
602
|
async clickByElementCoordinate(position = 'center') {
|
|
635
|
-
|
|
603
|
+
promodLogger.engineLog(`Promod element interface calls method "clickByElementCoordinate" from wrapped API, args: `, position);
|
|
636
604
|
const { x, y } = await this.getElementCoordinates(position);
|
|
637
|
-
await (await
|
|
605
|
+
await (await browser['getCurrentPage']()).mouse.click(x, y);
|
|
638
606
|
}
|
|
639
607
|
async getElementCoordinates(position = 'center') {
|
|
640
|
-
|
|
608
|
+
promodLogger.engineLog(`Promod element interface calls method "clickByElementCoordinate" from wrapped API, args: `, position);
|
|
641
609
|
await this.getElement();
|
|
642
610
|
const { x, y, width, height } = await this._driverElement.evaluate((el) => el.getBoundingClientRect());
|
|
643
|
-
return
|
|
611
|
+
return getPositionXY(position, { x, y, width, height });
|
|
644
612
|
}
|
|
645
613
|
async focus() {
|
|
646
|
-
|
|
614
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "focus" from wrapped API`);
|
|
647
615
|
await this.getElement();
|
|
648
616
|
await this._driverElement.focus();
|
|
649
617
|
}
|
|
@@ -659,7 +627,7 @@ class PromodPlaywrightElement {
|
|
|
659
627
|
* @returns {Promise<void>}
|
|
660
628
|
*/
|
|
661
629
|
async pressEnter(focus = true) {
|
|
662
|
-
|
|
630
|
+
promodLogger.engineLog(`[PW] Promod element interface calls method "pressEnter" from wrapped API, args: `, focus);
|
|
663
631
|
await this.getElement();
|
|
664
632
|
if (focus) {
|
|
665
633
|
await this._driverElement.focus();
|
|
@@ -679,18 +647,18 @@ class PromodPlaywrightElement {
|
|
|
679
647
|
* @returns {Promise<void>}
|
|
680
648
|
*/
|
|
681
649
|
async clearViaBackspace(repeat = 1, focus = true) {
|
|
682
|
-
|
|
650
|
+
promodLogger.engineLog(`Promod element interface calls method "clearViaBackspace" from wrapped API, args: `, repeat, focus);
|
|
683
651
|
await this.getElement();
|
|
684
652
|
if (focus) {
|
|
685
653
|
await this._driverElement.focus();
|
|
686
654
|
}
|
|
687
|
-
for (const _act of
|
|
655
|
+
for (const _act of lengthToIndexesArray(repeat)) {
|
|
688
656
|
await this._driver.keyboard.press('Backspace', { delay: 25 });
|
|
689
657
|
}
|
|
690
658
|
}
|
|
691
659
|
async selectOption(value, strictTextOptionEqual) {
|
|
692
660
|
await this.getElement();
|
|
693
|
-
if (
|
|
661
|
+
if (isString(value)) {
|
|
694
662
|
const opts = await this._driverElement.locator('option').all();
|
|
695
663
|
for (const opt of opts) {
|
|
696
664
|
const content = (await opt.textContent()).trim();
|
|
@@ -725,7 +693,7 @@ class PromodPlaywrightElement {
|
|
|
725
693
|
*/
|
|
726
694
|
async scrollIntoView(position) {
|
|
727
695
|
await this.getElement();
|
|
728
|
-
await
|
|
696
|
+
await browser.executeScript(([elem, scrollPosition]) => {
|
|
729
697
|
let position = true;
|
|
730
698
|
const scrollBlock = ['end', 'start', 'center', 'nearest'];
|
|
731
699
|
// @ts-ignore
|
|
@@ -751,7 +719,7 @@ class PromodPlaywrightElement {
|
|
|
751
719
|
return this.getElement()
|
|
752
720
|
.then(() => this._driverElement.isVisible())
|
|
753
721
|
.catch((error) => {
|
|
754
|
-
|
|
722
|
+
promodLogger.engineLog(`Promod element interface gets error after method "isDisplayed" from wrapped API, error: `, error);
|
|
755
723
|
return false;
|
|
756
724
|
});
|
|
757
725
|
}
|
|
@@ -780,11 +748,10 @@ class PromodPlaywrightElement {
|
|
|
780
748
|
};
|
|
781
749
|
}
|
|
782
750
|
}
|
|
783
|
-
exports.PromodPlaywrightElement = PromodPlaywrightElement;
|
|
784
751
|
function getInitElementRest(selector, root, ...rest) {
|
|
785
752
|
let getParent = null;
|
|
786
753
|
let getExecuteScriptArgs = null;
|
|
787
|
-
if (
|
|
754
|
+
if (isFunction(selector) || isPromise(selector)) {
|
|
788
755
|
getExecuteScriptArgs = function getExecuteScriptArgs() {
|
|
789
756
|
const localRest = rest.map((item) => (item && item.getEngineElement ? item.getEngineElement() : item));
|
|
790
757
|
const rootPromiseIfRequired = root && root.getEngineElement ? root.getEngineElement() : root;
|
|
@@ -803,14 +770,12 @@ function getInitElementRest(selector, root, ...rest) {
|
|
|
803
770
|
}
|
|
804
771
|
const $ = (selector, root, ...rest) => {
|
|
805
772
|
const restArgs = getInitElementRest(selector, root, ...rest);
|
|
806
|
-
return new PromodPlaywrightElement(selector,
|
|
773
|
+
return new PromodPlaywrightElement(selector, browser, ...restArgs);
|
|
807
774
|
};
|
|
808
|
-
exports.$ = $;
|
|
809
775
|
const $$ = (selector, root, ...rest) => {
|
|
810
776
|
const restArgs = getInitElementRest(selector, root, ...rest);
|
|
811
|
-
return new PromodPlaywrightElements(selector,
|
|
777
|
+
return new PromodPlaywrightElements(selector, browser, ...restArgs);
|
|
812
778
|
};
|
|
813
|
-
exports.$$ = $$;
|
|
814
779
|
function preBindBrowserInstance(browserThaNeedsToBeBinded) {
|
|
815
780
|
const $ = (selector, root, ...rest) => {
|
|
816
781
|
const restArgs = getInitElementRest(selector, root, ...rest);
|
|
@@ -826,4 +791,5 @@ function preBindBrowserInstance(browserThaNeedsToBeBinded) {
|
|
|
826
791
|
browser: browserThaNeedsToBeBinded,
|
|
827
792
|
};
|
|
828
793
|
}
|
|
794
|
+
export { $, $$, PromodPlaywrightElement, PromodPlaywrightElements, preBindBrowserInstance };
|
|
829
795
|
//# sourceMappingURL=pw_element.js.map
|