promod 2.5.4 → 3.0.1
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 +12 -11
- package/built/cjs/pw/pw_client.js +47 -58
- 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 +12 -11
- package/built/esm/pw/pw_client.js +103 -118
- 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,39 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const mappers_1 = require("../mappers");
|
|
10
|
-
const internals_1 = require("../internals");
|
|
11
|
-
const availableToRunEvenIfCurrentDriverDoesNotExist = ['constructor', 'runNewBrowser', 'switchToBrowser', 'quitAll'];
|
|
12
|
-
function validateBrowserCallMethod(browserClass) {
|
|
13
|
-
const protKeys = Object.getOwnPropertyNames(browserClass.prototype).filter((item) => !availableToRunEvenIfCurrentDriverDoesNotExist.includes(item));
|
|
14
|
-
for (const key of protKeys) {
|
|
15
|
-
const descriptor = Object.getOwnPropertyDescriptor(browserClass.prototype, key);
|
|
16
|
-
if ((0, sat_utils_1.isAsyncFunction)(descriptor.value)) {
|
|
17
|
-
const originalMethod = descriptor.value;
|
|
18
|
-
// eslint-disable-next-line no-inner-declarations
|
|
19
|
-
async function decoratedWithChecker(...args) {
|
|
20
|
-
if (!this.seleniumDriver) {
|
|
21
|
-
throw new Error(`
|
|
22
|
-
${key}(): Seems like driver was not initialized
|
|
23
|
-
or visit https://github.com/Simple-Automation-Testing/promod/blob/master/docs/init.md#getdriver
|
|
24
|
-
`);
|
|
25
|
-
}
|
|
26
|
-
return originalMethod.call(this, ...args);
|
|
27
|
-
}
|
|
28
|
-
Object.defineProperty(decoratedWithChecker, 'name', { value: key });
|
|
29
|
-
descriptor.value = decoratedWithChecker;
|
|
30
|
-
Object.defineProperty(browserClass.prototype, key, descriptor);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return new browserClass();
|
|
34
|
-
}
|
|
1
|
+
import { toArray, isArray, isString, isNumber, safeJSONstringify, isNotEmptyObject } from 'sat-utils';
|
|
2
|
+
import { compare } from 'sat-compare';
|
|
3
|
+
import { waitFor } from 'sat-wait';
|
|
4
|
+
import { toNativeEngineExecuteScriptArgs } from '../helpers/execute.script';
|
|
5
|
+
import { buildBy } from './swd_alignment';
|
|
6
|
+
import { KeysSWD, resolveUrl } from '../mappers';
|
|
7
|
+
import { promodLogger } from '../internals';
|
|
8
|
+
import { validateBrowserCallMethod } from '../shared/validate_browser';
|
|
35
9
|
class Browser {
|
|
36
|
-
wait =
|
|
10
|
+
wait = waitFor;
|
|
37
11
|
seleniumDriver;
|
|
38
12
|
/** @private */
|
|
39
13
|
appBaseUrl;
|
|
@@ -46,22 +20,25 @@ class Browser {
|
|
|
46
20
|
/** @private */
|
|
47
21
|
_createNewDriver;
|
|
48
22
|
/** @private */
|
|
49
|
-
_browserConfig;
|
|
50
|
-
/** @private */
|
|
51
23
|
_requestsMocks;
|
|
24
|
+
/** @private */
|
|
25
|
+
_mockInterceptionEnabled;
|
|
52
26
|
static getBrowser() {
|
|
53
|
-
return validateBrowserCallMethod(Browser
|
|
27
|
+
return validateBrowserCallMethod(Browser, {
|
|
28
|
+
driverPropertyName: 'seleniumDriver',
|
|
29
|
+
excludedMethods: ['constructor', 'runNewBrowser', 'switchToBrowser', 'quitAll'],
|
|
30
|
+
errorUrlSuffix: '#getdriver',
|
|
31
|
+
});
|
|
54
32
|
}
|
|
55
33
|
constructor() {
|
|
56
|
-
this.wait =
|
|
57
|
-
this.seleniumDriver;
|
|
34
|
+
this.wait = waitFor;
|
|
58
35
|
this.cdpPages = [];
|
|
59
36
|
}
|
|
60
37
|
currentClient() {
|
|
61
38
|
return this.seleniumDriver;
|
|
62
39
|
}
|
|
63
40
|
get keyboard() {
|
|
64
|
-
return
|
|
41
|
+
return KeysSWD;
|
|
65
42
|
}
|
|
66
43
|
injectEngine({ driver }) {
|
|
67
44
|
this.seleniumDriver = driver;
|
|
@@ -71,6 +48,88 @@ class Browser {
|
|
|
71
48
|
this._requestsMocks = [];
|
|
72
49
|
}
|
|
73
50
|
this._requestsMocks.push(mock);
|
|
51
|
+
if (this.seleniumDriver && !this._mockInterceptionEnabled) {
|
|
52
|
+
this._enableRequestInterception().catch((err) => promodLogger.engineLog('[SWD] Failed to enable request interception on mockRequests:', err));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
clearMockRequests() {
|
|
56
|
+
this._requestsMocks = [];
|
|
57
|
+
}
|
|
58
|
+
_urlMatchesPattern(url, pattern) {
|
|
59
|
+
const regexStr = pattern
|
|
60
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
61
|
+
.replace(/\*\*/g, '\u0000')
|
|
62
|
+
.replace(/\*/g, '[^/]*')
|
|
63
|
+
.replace(/\u0000/g, '.*');
|
|
64
|
+
return new RegExp(regexStr).test(url);
|
|
65
|
+
}
|
|
66
|
+
async _enableRequestInterception() {
|
|
67
|
+
if (this._mockInterceptionEnabled) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!this._requestsMocks || this._requestsMocks.length === 0) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
promodLogger.engineLog('[SWD] Promod client interface enabling request interception via CDP Fetch domain');
|
|
74
|
+
try {
|
|
75
|
+
let cdp = await this.seleniumDriver.createCDPConnection('page');
|
|
76
|
+
const existingPage = this.cdpPages.find((p) => p._wsConnection?._url === cdp._wsConnection?._url);
|
|
77
|
+
if (existingPage) {
|
|
78
|
+
await cdp._wsConnection?.close();
|
|
79
|
+
cdp = existingPage;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.cdpPages.push(cdp);
|
|
83
|
+
}
|
|
84
|
+
await cdp.send('Fetch.enable', {
|
|
85
|
+
patterns: [{ urlPattern: '*', requestStage: 'Request' }],
|
|
86
|
+
});
|
|
87
|
+
cdp._wsConnection?.on?.('message', (rawData) => {
|
|
88
|
+
let message;
|
|
89
|
+
try {
|
|
90
|
+
const data = typeof rawData === 'string' ? rawData : rawData.toString();
|
|
91
|
+
message = JSON.parse(data);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (message.method !== 'Fetch.requestPaused') {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const { requestId, request } = message.params;
|
|
100
|
+
const requestUrl = request.url;
|
|
101
|
+
const matchingMock = this._requestsMocks?.find((mock) => this._urlMatchesPattern(requestUrl, mock.url));
|
|
102
|
+
if (matchingMock) {
|
|
103
|
+
const mockRequest = { url: requestUrl, method: request.method, headers: request.headers };
|
|
104
|
+
const response = matchingMock.handler(mockRequest);
|
|
105
|
+
const responseHeaders = response.headers
|
|
106
|
+
? Object.entries(response.headers).map(([name, value]) => ({ name, value }))
|
|
107
|
+
: [];
|
|
108
|
+
const bodyStr = response.body != null
|
|
109
|
+
? typeof response.body === 'string'
|
|
110
|
+
? response.body
|
|
111
|
+
: JSON.stringify(response.body)
|
|
112
|
+
: '';
|
|
113
|
+
cdp
|
|
114
|
+
.send('Fetch.fulfillRequest', {
|
|
115
|
+
requestId,
|
|
116
|
+
responseCode: response.status || 200,
|
|
117
|
+
responseHeaders,
|
|
118
|
+
body: Buffer.from(bodyStr).toString('base64'),
|
|
119
|
+
})
|
|
120
|
+
.catch((err) => promodLogger.engineLog('[SWD] Fetch.fulfillRequest error:', err));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
cdp
|
|
124
|
+
.send('Fetch.continueRequest', { requestId })
|
|
125
|
+
.catch((err) => promodLogger.engineLog('[SWD] Fetch.continueRequest error:', err));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
this._mockInterceptionEnabled = true;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
promodLogger.engineLog('[SWD] Failed to enable request interception via CDP:', error);
|
|
132
|
+
}
|
|
74
133
|
}
|
|
75
134
|
async injectPagePreloadScript(script, dontThrowOnError = true) {
|
|
76
135
|
try {
|
|
@@ -121,7 +180,7 @@ class Browser {
|
|
|
121
180
|
* @return {Promise<void>}
|
|
122
181
|
*/
|
|
123
182
|
async scrollElementByMouseWheel(element, x, y, deltaX, deltaY, duration) {
|
|
124
|
-
|
|
183
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "scrollElementByMouseWheel" from wrapped API, args: `, element, x, y, deltaX, deltaY, duration);
|
|
125
184
|
await this.seleniumDriver
|
|
126
185
|
.actions()
|
|
127
186
|
// @ts-ignore
|
|
@@ -139,7 +198,7 @@ class Browser {
|
|
|
139
198
|
* @return {Promise<void>}
|
|
140
199
|
*/
|
|
141
200
|
async scrollByMouseWheel(x, y, deltaX, deltaY, duration) {
|
|
142
|
-
|
|
201
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "scrollByMouseWheel" from wrapped API, args: `, x, y, deltaX, deltaY, duration);
|
|
143
202
|
await this.seleniumDriver
|
|
144
203
|
.actions()
|
|
145
204
|
// @ts-ignore
|
|
@@ -157,14 +216,14 @@ class Browser {
|
|
|
157
216
|
* @return {Promise<void>}
|
|
158
217
|
*/
|
|
159
218
|
async keyDownAndHold(key, element) {
|
|
160
|
-
|
|
219
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "keyDownAndHold" from wrapped API, args: `, key, element);
|
|
161
220
|
if (element) {
|
|
162
221
|
await this.seleniumDriver
|
|
163
222
|
.actions()
|
|
164
223
|
.move({ origin: await element.getEngineElement() })
|
|
165
224
|
.perform();
|
|
166
225
|
}
|
|
167
|
-
for (const k of
|
|
226
|
+
for (const k of toArray(key)) {
|
|
168
227
|
await this.seleniumDriver.actions().keyDown(k).perform();
|
|
169
228
|
}
|
|
170
229
|
}
|
|
@@ -179,14 +238,14 @@ class Browser {
|
|
|
179
238
|
* @return {Promise<void>}
|
|
180
239
|
*/
|
|
181
240
|
async keyUp(key, element) {
|
|
182
|
-
|
|
241
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "keyUp" from wrapped API, args: `, key, element);
|
|
183
242
|
if (element) {
|
|
184
243
|
await this.seleniumDriver
|
|
185
244
|
.actions()
|
|
186
245
|
.move({ origin: (await element.getEngineElement()) })
|
|
187
246
|
.perform();
|
|
188
247
|
}
|
|
189
|
-
for (const k of
|
|
248
|
+
for (const k of toArray(key)) {
|
|
190
249
|
await this.seleniumDriver.actions().keyUp(k).perform();
|
|
191
250
|
}
|
|
192
251
|
}
|
|
@@ -201,14 +260,14 @@ class Browser {
|
|
|
201
260
|
* @return {Promise<void>}
|
|
202
261
|
*/
|
|
203
262
|
async keyDownAndUp(key, element) {
|
|
204
|
-
|
|
263
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "keyUp" from wrapped API, args: `, key, element);
|
|
205
264
|
if (element) {
|
|
206
265
|
await this.seleniumDriver
|
|
207
266
|
.actions()
|
|
208
267
|
.move({ origin: (await element.getEngineElement()) })
|
|
209
268
|
.perform();
|
|
210
269
|
}
|
|
211
|
-
for (const k of
|
|
270
|
+
for (const k of toArray(key)) {
|
|
212
271
|
await this.seleniumDriver.actions().keyDown(k).keyUp(k).perform();
|
|
213
272
|
}
|
|
214
273
|
}
|
|
@@ -217,11 +276,11 @@ class Browser {
|
|
|
217
276
|
* @param {object} [browserDescription] browser descriptions
|
|
218
277
|
*/
|
|
219
278
|
async runNewBrowser({ currentBrowserName, newBrowserName, capabilities, } = {}) {
|
|
220
|
-
|
|
279
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "runNewBrowser" from wrapped API, args: `, currentBrowserName, newBrowserName, capabilities);
|
|
221
280
|
if (!this._createNewDriver) {
|
|
222
281
|
throw new Error('createNewDriver(): seems like create driver method was not inited');
|
|
223
282
|
}
|
|
224
|
-
if (!
|
|
283
|
+
if (!isArray(this.drivers)) {
|
|
225
284
|
this.drivers = [];
|
|
226
285
|
}
|
|
227
286
|
if (this.seleniumDriver && currentBrowserName) {
|
|
@@ -248,19 +307,19 @@ class Browser {
|
|
|
248
307
|
* @return {Promise<void>}
|
|
249
308
|
*/
|
|
250
309
|
async switchToIframe(selector, jumpToDefaultFirst = false, { timeout = 30_000, message = '' } = {}) {
|
|
251
|
-
|
|
310
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "switchToIframe" from wrapped API, args: `, selector, jumpToDefaultFirst);
|
|
252
311
|
if (jumpToDefaultFirst) {
|
|
253
312
|
await this.switchToDefauldIframe();
|
|
254
313
|
}
|
|
255
314
|
if (typeof selector === 'string') {
|
|
256
|
-
await
|
|
257
|
-
const elements = await this.seleniumDriver.findElements(
|
|
315
|
+
await waitFor(async () => {
|
|
316
|
+
const elements = await this.seleniumDriver.findElements(buildBy(selector));
|
|
258
317
|
return elements.length > 0;
|
|
259
318
|
}, {
|
|
260
319
|
timeout,
|
|
261
320
|
message: (t, e = 'without error') => `switchToIframe('${selector}'): required iframe was not found, timeout ${t}, error: ${e} ${message ? '\n' + message : ''} `,
|
|
262
321
|
});
|
|
263
|
-
await this.seleniumDriver.switchTo().frame(this.seleniumDriver.findElement(
|
|
322
|
+
await this.seleniumDriver.switchTo().frame(this.seleniumDriver.findElement(buildBy(selector)));
|
|
264
323
|
}
|
|
265
324
|
if (selector.getEngineElement) {
|
|
266
325
|
await this.seleniumDriver.switchTo().frame(await selector.getEngineElement());
|
|
@@ -276,7 +335,7 @@ class Browser {
|
|
|
276
335
|
* @return {Promise<void>}
|
|
277
336
|
*/
|
|
278
337
|
async switchToDefauldIframe() {
|
|
279
|
-
|
|
338
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "switchToDefauldIframe" from wrapped API`);
|
|
280
339
|
await this.seleniumDriver.switchTo().defaultContent();
|
|
281
340
|
}
|
|
282
341
|
/**
|
|
@@ -289,7 +348,7 @@ class Browser {
|
|
|
289
348
|
* @return {Promise<void>}
|
|
290
349
|
*/
|
|
291
350
|
async switchToBrowser(browserData = {}) {
|
|
292
|
-
|
|
351
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "switchToBrowser" from wrapped API, args: `, browserData);
|
|
293
352
|
const { index, browserName, ...tabData } = browserData;
|
|
294
353
|
if (this.seleniumDriver && this.drivers && this.drivers.length) {
|
|
295
354
|
const isDriverInPool = this.drivers.find((item) => item === this.seleniumDriver);
|
|
@@ -297,7 +356,7 @@ class Browser {
|
|
|
297
356
|
this.drivers = [...this.drivers, this.seleniumDriver];
|
|
298
357
|
}
|
|
299
358
|
}
|
|
300
|
-
if (
|
|
359
|
+
if (isString(browserName)) {
|
|
301
360
|
const driver = this.drivers.find((item) => item['__promodBrowserName'] === browserName);
|
|
302
361
|
// TODO find better solution
|
|
303
362
|
if (!driver) {
|
|
@@ -306,12 +365,12 @@ class Browser {
|
|
|
306
365
|
this.seleniumDriver = driver;
|
|
307
366
|
return;
|
|
308
367
|
}
|
|
309
|
-
if (
|
|
368
|
+
if (isNumber(index) && isArray(this.drivers) && this.drivers.length > index) {
|
|
310
369
|
// TODO find better solution
|
|
311
370
|
this.seleniumDriver = this.drivers[index];
|
|
312
371
|
return;
|
|
313
372
|
}
|
|
314
|
-
if (
|
|
373
|
+
if (isNotEmptyObject(tabData)) {
|
|
315
374
|
for (const driver of this.drivers) {
|
|
316
375
|
this.seleniumDriver = driver;
|
|
317
376
|
const result = await this.switchToBrowserTab({ ...tabData })
|
|
@@ -331,7 +390,7 @@ class Browser {
|
|
|
331
390
|
this._createNewDriver = lauchNewInstance;
|
|
332
391
|
}
|
|
333
392
|
get Key() {
|
|
334
|
-
return
|
|
393
|
+
return KeysSWD;
|
|
335
394
|
}
|
|
336
395
|
get baseUrl() {
|
|
337
396
|
return this.appBaseUrl;
|
|
@@ -340,7 +399,7 @@ class Browser {
|
|
|
340
399
|
this.appBaseUrl = url;
|
|
341
400
|
}
|
|
342
401
|
async returnToInitialTab() {
|
|
343
|
-
|
|
402
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "returnToInitialTab" from wrapped API`);
|
|
344
403
|
// there was no switching in test
|
|
345
404
|
if (!this.initialTab) {
|
|
346
405
|
return;
|
|
@@ -351,7 +410,7 @@ class Browser {
|
|
|
351
410
|
this.initialTab = null;
|
|
352
411
|
}
|
|
353
412
|
async closeAllTabsExceptInitial() {
|
|
354
|
-
|
|
413
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "closeAllTabsExceptInitial" from wrapped API`);
|
|
355
414
|
const handles = await this.getTabs();
|
|
356
415
|
handles.splice(handles.indexOf(this.initialTab), 1);
|
|
357
416
|
await this.makeActionAtEveryTab(async () => this.close(), handles);
|
|
@@ -370,7 +429,7 @@ class Browser {
|
|
|
370
429
|
* @return {Promise<void>}
|
|
371
430
|
*/
|
|
372
431
|
async makeActionAtEveryTab(action, handles) {
|
|
373
|
-
|
|
432
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "makeActionAtEveryTab" from wrapped API, args: `, action);
|
|
374
433
|
handles = handles || (await this.getTabs());
|
|
375
434
|
for (const windowHandle of handles) {
|
|
376
435
|
await this.seleniumDriver.switchTo().window(windowHandle);
|
|
@@ -383,23 +442,23 @@ class Browser {
|
|
|
383
442
|
*/
|
|
384
443
|
async switchToBrowserTab(tabObject = {}) {
|
|
385
444
|
const { strictEquality = true, index, expectedQuantity, timeout = 5000, ...titleUrl } = tabObject;
|
|
386
|
-
if (
|
|
445
|
+
if (isNumber(expectedQuantity)) {
|
|
387
446
|
let errorMessage;
|
|
388
|
-
await
|
|
447
|
+
await waitFor(async () => {
|
|
389
448
|
const tabs = await this.getTabs();
|
|
390
449
|
errorMessage = () => `Expected browser tabs count is ${expectedQuantity}, current browser tabs count is ${tabs.length}`;
|
|
391
450
|
return tabs.length === expectedQuantity;
|
|
392
451
|
}, { message: errorMessage, timeout });
|
|
393
452
|
}
|
|
394
|
-
if (
|
|
453
|
+
if (isNumber(index) && (await this.getTabs()).length < index + 1) {
|
|
395
454
|
throw new Error(`Index is out available browser tabs count, index is ${index}, current browser tabs count is ${(await this.getTabs()).length}`);
|
|
396
455
|
}
|
|
397
|
-
else if (
|
|
456
|
+
else if (isNumber(index)) {
|
|
398
457
|
return await this.seleniumDriver.switchTo().window((await this.getTabs())[index]);
|
|
399
458
|
}
|
|
400
|
-
if (
|
|
459
|
+
if (isNotEmptyObject(titleUrl)) {
|
|
401
460
|
let errorMessage;
|
|
402
|
-
await
|
|
461
|
+
await waitFor(async () => {
|
|
403
462
|
const tabs = await this.getTabs();
|
|
404
463
|
for (const tab of tabs) {
|
|
405
464
|
await this.seleniumDriver.switchTo().window(tab);
|
|
@@ -407,11 +466,11 @@ class Browser {
|
|
|
407
466
|
url: await this.getCurrentUrl(),
|
|
408
467
|
title: await this.getTitle(),
|
|
409
468
|
};
|
|
410
|
-
const { result } =
|
|
469
|
+
const { result } = compare(currentBrowserState, titleUrl, { stringIncludes: !strictEquality });
|
|
411
470
|
if (result)
|
|
412
471
|
return true;
|
|
413
472
|
}
|
|
414
|
-
errorMessage = () => `Expected browser tab state is ${
|
|
473
|
+
errorMessage = () => `Expected browser tab state is ${safeJSONstringify(titleUrl)}, current browser tab states was not met`;
|
|
415
474
|
}, { message: errorMessage, timeout });
|
|
416
475
|
}
|
|
417
476
|
}
|
|
@@ -427,7 +486,7 @@ class Browser {
|
|
|
427
486
|
* @return {Promise<void>}
|
|
428
487
|
*/
|
|
429
488
|
async openNewTab(url = 'data:,') {
|
|
430
|
-
|
|
489
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "openNewTab" from wrapped API, args: `, url);
|
|
431
490
|
await this.seleniumDriver.executeScript((openUrl) => {
|
|
432
491
|
window.open(openUrl, '_blank');
|
|
433
492
|
}, url);
|
|
@@ -444,7 +503,7 @@ class Browser {
|
|
|
444
503
|
* @return {Promise<void>}
|
|
445
504
|
*/
|
|
446
505
|
async switchToTab(tabObject) {
|
|
447
|
-
|
|
506
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "switchToTab" from wrapped API, args: `, tabObject);
|
|
448
507
|
if (!this.initialTab) {
|
|
449
508
|
this.initialTab = await this.seleniumDriver.getWindowHandle();
|
|
450
509
|
}
|
|
@@ -461,8 +520,8 @@ class Browser {
|
|
|
461
520
|
* @returns {Promise<void>}
|
|
462
521
|
*/
|
|
463
522
|
async setCookies(cookies) {
|
|
464
|
-
|
|
465
|
-
const cookiesArr =
|
|
523
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "setCookies" from wrapped API, args: `, cookies);
|
|
524
|
+
const cookiesArr = toArray(cookies);
|
|
466
525
|
for (const cookie of cookiesArr) {
|
|
467
526
|
await (await this.seleniumDriver.manage()).addCookie(cookie);
|
|
468
527
|
}
|
|
@@ -476,7 +535,7 @@ class Browser {
|
|
|
476
535
|
* @return {Promise<Array<TCookie>>} cookies list
|
|
477
536
|
*/
|
|
478
537
|
async getCookies() {
|
|
479
|
-
|
|
538
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getCookies" from wrapped API`);
|
|
480
539
|
return await (await this.seleniumDriver.manage()).getCookies();
|
|
481
540
|
}
|
|
482
541
|
/**
|
|
@@ -489,7 +548,7 @@ class Browser {
|
|
|
489
548
|
* @return {Promise<{ name: string; value: string }>}
|
|
490
549
|
*/
|
|
491
550
|
async getCookieByName(name) {
|
|
492
|
-
|
|
551
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getCookieByName" from wrapped API, args: `, name);
|
|
493
552
|
return await (await this.seleniumDriver.manage()).getCookie(name);
|
|
494
553
|
}
|
|
495
554
|
/**
|
|
@@ -502,7 +561,7 @@ class Browser {
|
|
|
502
561
|
* @returns {Promise<void>}
|
|
503
562
|
*/
|
|
504
563
|
async deleteCookie(name) {
|
|
505
|
-
|
|
564
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "deleteCookie" from wrapped API, args: `, name);
|
|
506
565
|
await (await this.seleniumDriver.manage()).deleteCookie(name);
|
|
507
566
|
}
|
|
508
567
|
/**
|
|
@@ -514,7 +573,7 @@ class Browser {
|
|
|
514
573
|
* @returns {Promise<void>}
|
|
515
574
|
*/
|
|
516
575
|
async deleteAllCookies() {
|
|
517
|
-
|
|
576
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "deleteAllCookies" from wrapped API`);
|
|
518
577
|
await (await this.seleniumDriver.manage()).deleteAllCookies();
|
|
519
578
|
}
|
|
520
579
|
/**
|
|
@@ -527,7 +586,7 @@ class Browser {
|
|
|
527
586
|
* @return {Promise<string>} tab (page) title
|
|
528
587
|
*/
|
|
529
588
|
async getTitle() {
|
|
530
|
-
|
|
589
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getTitle" from wrapped API`);
|
|
531
590
|
return await this.seleniumDriver.getTitle();
|
|
532
591
|
}
|
|
533
592
|
/**
|
|
@@ -540,7 +599,7 @@ class Browser {
|
|
|
540
599
|
* @return {Promise<string>}
|
|
541
600
|
*/
|
|
542
601
|
async getCurrentUrl() {
|
|
543
|
-
|
|
602
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getCurrentUrl" from wrapped API`);
|
|
544
603
|
return await this.seleniumDriver.getCurrentUrl();
|
|
545
604
|
}
|
|
546
605
|
/**
|
|
@@ -553,7 +612,7 @@ class Browser {
|
|
|
553
612
|
* @return {Promise<{ height: number; width: number }>} window size
|
|
554
613
|
*/
|
|
555
614
|
async getWindomSize() {
|
|
556
|
-
|
|
615
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getWindomSize" from wrapped API`);
|
|
557
616
|
return await this.seleniumDriver.executeScript(() => ({ height: window.outerHeight, width: window.outerWidth }));
|
|
558
617
|
}
|
|
559
618
|
/**
|
|
@@ -566,7 +625,7 @@ class Browser {
|
|
|
566
625
|
* @returns {Promise<Buffer>}
|
|
567
626
|
*/
|
|
568
627
|
async takeScreenshot() {
|
|
569
|
-
|
|
628
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "takeScreenshot" from wrapped API`);
|
|
570
629
|
const res = await this.seleniumDriver.takeScreenshot();
|
|
571
630
|
return Buffer.from(res, 'base64');
|
|
572
631
|
}
|
|
@@ -580,7 +639,7 @@ class Browser {
|
|
|
580
639
|
* @returns {Promise<any[]>}
|
|
581
640
|
*/
|
|
582
641
|
async getTabs() {
|
|
583
|
-
|
|
642
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getTabs" from wrapped API`);
|
|
584
643
|
return await this.seleniumDriver.getAllWindowHandles();
|
|
585
644
|
}
|
|
586
645
|
/**
|
|
@@ -593,7 +652,7 @@ class Browser {
|
|
|
593
652
|
* @returns {Promise<number>}
|
|
594
653
|
*/
|
|
595
654
|
async getTabsCount() {
|
|
596
|
-
|
|
655
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getTabsCount" from wrapped API`);
|
|
597
656
|
return (await this.seleniumDriver.getAllWindowHandles()).length;
|
|
598
657
|
}
|
|
599
658
|
/**
|
|
@@ -607,8 +666,9 @@ class Browser {
|
|
|
607
666
|
* @return {Promise<void>}
|
|
608
667
|
*/
|
|
609
668
|
async get(url) {
|
|
610
|
-
|
|
611
|
-
|
|
669
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "get" from wrapped API`);
|
|
670
|
+
await this._enableRequestInterception();
|
|
671
|
+
const getUrl = resolveUrl(url, this.appBaseUrl);
|
|
612
672
|
return await this.seleniumDriver.get(getUrl);
|
|
613
673
|
}
|
|
614
674
|
/**
|
|
@@ -623,7 +683,7 @@ class Browser {
|
|
|
623
683
|
* @return {Promise<void>}
|
|
624
684
|
*/
|
|
625
685
|
async setWindowSize(width, height) {
|
|
626
|
-
|
|
686
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "setWindowSize" from wrapped API, args: `, width, height);
|
|
627
687
|
return await this.seleniumDriver.manage().window().setRect({
|
|
628
688
|
width,
|
|
629
689
|
height,
|
|
@@ -640,7 +700,7 @@ class Browser {
|
|
|
640
700
|
* @return {Promise<void>}
|
|
641
701
|
*/
|
|
642
702
|
async sleep(time) {
|
|
643
|
-
|
|
703
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "sleep" from wrapped API, args: `, time);
|
|
644
704
|
await (() => new Promise((resolve) => setTimeout(resolve, time)))();
|
|
645
705
|
}
|
|
646
706
|
/**
|
|
@@ -651,12 +711,12 @@ class Browser {
|
|
|
651
711
|
* const result = await browser.executeScript(() => document.body.offsetHeight);
|
|
652
712
|
*
|
|
653
713
|
* @param {!Function} script scripts that needs to be executed
|
|
654
|
-
* @param {any
|
|
714
|
+
* @param {any[]} [args] function args
|
|
655
715
|
* @returns {Promise<unknown>}
|
|
656
716
|
*/
|
|
657
|
-
async executeScript(script, args) {
|
|
658
|
-
|
|
659
|
-
const recomposedArgs = await
|
|
717
|
+
async executeScript(script, args = []) {
|
|
718
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "executeScript" from wrapped API, args: `, script, args);
|
|
719
|
+
const recomposedArgs = await toNativeEngineExecuteScriptArgs(args);
|
|
660
720
|
const res = await this.seleniumDriver.executeScript(script, recomposedArgs);
|
|
661
721
|
return res;
|
|
662
722
|
}
|
|
@@ -670,7 +730,7 @@ class Browser {
|
|
|
670
730
|
* @return {Promise<void>}
|
|
671
731
|
*/
|
|
672
732
|
async back() {
|
|
673
|
-
|
|
733
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "back" from wrapped API`);
|
|
674
734
|
return (await this.seleniumDriver.navigate()).back();
|
|
675
735
|
}
|
|
676
736
|
/**
|
|
@@ -683,7 +743,7 @@ class Browser {
|
|
|
683
743
|
* @return {Promise<void>}
|
|
684
744
|
*/
|
|
685
745
|
async forward() {
|
|
686
|
-
|
|
746
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "forward" from wrapped API`);
|
|
687
747
|
return (await this.seleniumDriver.navigate()).forward();
|
|
688
748
|
}
|
|
689
749
|
/**
|
|
@@ -696,7 +756,7 @@ class Browser {
|
|
|
696
756
|
* @return {Promise<void>}
|
|
697
757
|
*/
|
|
698
758
|
async refresh() {
|
|
699
|
-
|
|
759
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "refresh" from wrapped API`);
|
|
700
760
|
return (await this.seleniumDriver.navigate()).refresh();
|
|
701
761
|
}
|
|
702
762
|
/**
|
|
@@ -709,7 +769,7 @@ class Browser {
|
|
|
709
769
|
* @return {Promise<void>}
|
|
710
770
|
*/
|
|
711
771
|
async quit() {
|
|
712
|
-
|
|
772
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "quit" from wrapped API`);
|
|
713
773
|
if (this.drivers && this.drivers.length) {
|
|
714
774
|
const index = this.drivers.findIndex((driver) => driver === this.seleniumDriver);
|
|
715
775
|
if (index !== -1)
|
|
@@ -721,6 +781,7 @@ class Browser {
|
|
|
721
781
|
this.cdpPages = [];
|
|
722
782
|
}
|
|
723
783
|
this.seleniumDriver = null;
|
|
784
|
+
this._mockInterceptionEnabled = false;
|
|
724
785
|
}
|
|
725
786
|
/**
|
|
726
787
|
* @example
|
|
@@ -732,19 +793,20 @@ class Browser {
|
|
|
732
793
|
* @return {Promise<void>}
|
|
733
794
|
*/
|
|
734
795
|
async quitAll() {
|
|
735
|
-
|
|
736
|
-
const drivers =
|
|
796
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "quitAll" from wrapped API`);
|
|
797
|
+
const drivers = toArray(this.drivers);
|
|
737
798
|
this.drivers = [];
|
|
738
799
|
if (this.seleniumDriver) {
|
|
739
|
-
await this.seleniumDriver.quit().catch((e) =>
|
|
800
|
+
await this.seleniumDriver.quit().catch((e) => promodLogger.engineLog(e));
|
|
740
801
|
}
|
|
741
802
|
this.seleniumDriver = null;
|
|
803
|
+
this._mockInterceptionEnabled = false;
|
|
742
804
|
if (this.cdpPages.length) {
|
|
743
|
-
await Promise.all(this.cdpPages.map((page) => page?._wsConnection?.close())).catch((e) =>
|
|
805
|
+
await Promise.all(this.cdpPages.map((page) => page?._wsConnection?.close())).catch((e) => promodLogger.engineLog(e));
|
|
744
806
|
this.cdpPages = [];
|
|
745
807
|
}
|
|
746
808
|
for (const driver of drivers) {
|
|
747
|
-
await driver.quit().catch((e) =>
|
|
809
|
+
await driver.quit().catch((e) => promodLogger.engineLog(e));
|
|
748
810
|
}
|
|
749
811
|
}
|
|
750
812
|
/**
|
|
@@ -757,7 +819,7 @@ class Browser {
|
|
|
757
819
|
* @return {Promise<void>}
|
|
758
820
|
*/
|
|
759
821
|
async maximize() {
|
|
760
|
-
|
|
822
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "maximize" from wrapped API`);
|
|
761
823
|
const { width, height } = (await this.seleniumDriver.executeScript(() => {
|
|
762
824
|
const { availHeight, availWidth } = window.screen;
|
|
763
825
|
return { width: availWidth, height: availHeight };
|
|
@@ -775,14 +837,13 @@ class Browser {
|
|
|
775
837
|
* @return {Promise<TLogLevel[] | string>}
|
|
776
838
|
*/
|
|
777
839
|
async getBrowserLogs() {
|
|
778
|
-
|
|
840
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "getBrowserLogs" from wrapped API`);
|
|
779
841
|
try {
|
|
780
|
-
|
|
781
|
-
const manage = await this.seleniumDriver.manage();
|
|
842
|
+
const manage = this.seleniumDriver.manage();
|
|
782
843
|
return manage.logs().get('browser');
|
|
783
844
|
}
|
|
784
845
|
catch (e) {
|
|
785
|
-
return '
|
|
846
|
+
return 'Command failed: ' + e.toString();
|
|
786
847
|
}
|
|
787
848
|
}
|
|
788
849
|
/**
|
|
@@ -799,11 +860,10 @@ class Browser {
|
|
|
799
860
|
* @return {Promise<void>}
|
|
800
861
|
*/
|
|
801
862
|
async close() {
|
|
802
|
-
|
|
863
|
+
promodLogger.engineLog(`[SWD] Promod client interface calls method "close" from wrapped API`);
|
|
803
864
|
await this.seleniumDriver.close();
|
|
804
865
|
}
|
|
805
866
|
}
|
|
806
|
-
exports.Browser = Browser;
|
|
807
867
|
const browser = Browser.getBrowser();
|
|
808
|
-
|
|
868
|
+
export { browser, Browser };
|
|
809
869
|
//# sourceMappingURL=swd_client.js.map
|