automation_model 1.0.930-dev → 1.0.931-dev
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/lib/command_common.js +34 -0
- package/lib/command_common.js.map +1 -1
- package/lib/stable_browser.js +1188 -0
- package/lib/stable_browser.js.map +1 -1
- package/package.json +1 -1
package/lib/stable_browser.js
CHANGED
|
@@ -165,14 +165,20 @@ class StableBrowser {
|
|
|
165
165
|
context.playContext.on("page", async function (page) {
|
|
166
166
|
if (this.configuration && this.configuration.closePopups === true) {
|
|
167
167
|
console.log("close unexpected popups");
|
|
168
|
+
const _perf_t0 = Date.now();
|
|
169
|
+
logEvent("[registerEventListeners] before: page.close");
|
|
168
170
|
await page.close();
|
|
171
|
+
logEvent(`[registerEventListeners] after: page.close took ${Date.now() - _perf_t0}ms`);
|
|
169
172
|
return;
|
|
170
173
|
}
|
|
171
174
|
context.pageLoading.status = true;
|
|
172
175
|
this.page = page;
|
|
173
176
|
try {
|
|
174
177
|
if (this.configuration && this.configuration.acceptDialog) {
|
|
178
|
+
const _perf_t1 = Date.now();
|
|
179
|
+
logEvent("[registerEventListeners] before: page.on");
|
|
175
180
|
await page.on("dialog", (dialog) => dialog.accept());
|
|
181
|
+
logEvent(`[registerEventListeners] after: page.on took ${Date.now() - _perf_t1}ms`);
|
|
176
182
|
}
|
|
177
183
|
}
|
|
178
184
|
catch (error) {
|
|
@@ -189,7 +195,10 @@ class StableBrowser {
|
|
|
189
195
|
this.page = this.context.pages[this.context.pages.length - 1];
|
|
190
196
|
this.context.page = this.page;
|
|
191
197
|
try {
|
|
198
|
+
const _perf_t2 = Date.now();
|
|
199
|
+
logEvent("[registerEventListeners] before: page.title");
|
|
192
200
|
let title = await this.page.title();
|
|
201
|
+
logEvent(`[registerEventListeners] after: page.title took ${Date.now() - _perf_t2}ms`);
|
|
193
202
|
console.log("Switched to page " + title);
|
|
194
203
|
}
|
|
195
204
|
catch (error) {
|
|
@@ -203,7 +212,10 @@ class StableBrowser {
|
|
|
203
212
|
}
|
|
204
213
|
});
|
|
205
214
|
try {
|
|
215
|
+
const _perf_t3 = Date.now();
|
|
216
|
+
logEvent("[registerEventListeners] before: waitForPageLoad");
|
|
206
217
|
await this.waitForPageLoad();
|
|
218
|
+
logEvent(`[registerEventListeners] after: waitForPageLoad took ${Date.now() - _perf_t3}ms`);
|
|
207
219
|
console.log("Switch page: " + (await page.title()));
|
|
208
220
|
}
|
|
209
221
|
catch (e) {
|
|
@@ -224,7 +236,10 @@ class StableBrowser {
|
|
|
224
236
|
}
|
|
225
237
|
let newContextCreated = false;
|
|
226
238
|
if (!apps[appName]) {
|
|
239
|
+
const _perf_t4 = Date.now();
|
|
240
|
+
logEvent("[switchApp] before: getContext");
|
|
227
241
|
let newContext = await getContext(null, this.context.headless ? this.context.headless : false, this, this.logger, appName, false, this, -1, this.context.reportFolder, null, null, this.tags);
|
|
242
|
+
logEvent(`[switchApp] after: getContext took ${Date.now() - _perf_t4}ms`);
|
|
228
243
|
newContextCreated = true;
|
|
229
244
|
apps[appName] = {
|
|
230
245
|
context: newContext,
|
|
@@ -239,9 +254,15 @@ class StableBrowser {
|
|
|
239
254
|
this.appName = appName;
|
|
240
255
|
if (newContextCreated) {
|
|
241
256
|
this.registerEventListeners(this.context);
|
|
257
|
+
const _perf_t5 = Date.now();
|
|
258
|
+
logEvent("[switchApp] before: goto");
|
|
242
259
|
await this.goto(this.context.environment.baseUrl);
|
|
260
|
+
logEvent(`[switchApp] after: goto took ${Date.now() - _perf_t5}ms`);
|
|
243
261
|
if (!this.fastMode && !this.stepTags.includes("fast-mode")) {
|
|
262
|
+
const _perf_t6 = Date.now();
|
|
263
|
+
logEvent("[switchApp] before: waitForPageLoad");
|
|
244
264
|
await this.waitForPageLoad();
|
|
265
|
+
logEvent(`[switchApp] after: waitForPageLoad took ${Date.now() - _perf_t6}ms`);
|
|
245
266
|
}
|
|
246
267
|
}
|
|
247
268
|
}
|
|
@@ -252,18 +273,27 @@ class StableBrowser {
|
|
|
252
273
|
if (index >= 0 && index < this.context.pages.length) {
|
|
253
274
|
this.page = this.context.pages[index];
|
|
254
275
|
this.context.page = this.page;
|
|
276
|
+
const _perf_t7 = Date.now();
|
|
277
|
+
logEvent("[switchTab] before: page.bringToFront");
|
|
255
278
|
await this.page.bringToFront();
|
|
279
|
+
logEvent(`[switchTab] after: page.bringToFront took ${Date.now() - _perf_t7}ms`);
|
|
256
280
|
return;
|
|
257
281
|
}
|
|
258
282
|
}
|
|
259
283
|
// if the tabNameOrIndex is a string, find the tab by name
|
|
260
284
|
for (let i = 0; i < this.context.pages.length; i++) {
|
|
261
285
|
let page = this.context.pages[i];
|
|
286
|
+
const _perf_t8 = Date.now();
|
|
287
|
+
logEvent("[switchTab] before: page.title");
|
|
262
288
|
let title = await page.title();
|
|
289
|
+
logEvent(`[switchTab] after: page.title took ${Date.now() - _perf_t8}ms`);
|
|
263
290
|
if (title.includes(tabTitleOrIndex)) {
|
|
264
291
|
this.page = page;
|
|
265
292
|
this.context.page = this.page;
|
|
293
|
+
const _perf_t9 = Date.now();
|
|
294
|
+
logEvent("[switchTab] before: page.bringToFront");
|
|
266
295
|
await this.page.bringToFront();
|
|
296
|
+
logEvent(`[switchTab] after: page.bringToFront took ${Date.now() - _perf_t9}ms`);
|
|
267
297
|
return;
|
|
268
298
|
}
|
|
269
299
|
}
|
|
@@ -298,13 +328,19 @@ class StableBrowser {
|
|
|
298
328
|
if (pageUrl.hostname === requestUrl.hostname) {
|
|
299
329
|
const method = data.method();
|
|
300
330
|
if (["POST", "GET", "PUT", "DELETE", "PATCH"].includes(method)) {
|
|
331
|
+
const _perf_t10 = Date.now();
|
|
332
|
+
logEvent("[registerRequestListener] before: data.headerValue");
|
|
301
333
|
const token = await data.headerValue("Authorization");
|
|
334
|
+
logEvent(`[registerRequestListener] after: data.headerValue took ${Date.now() - _perf_t10}ms`);
|
|
302
335
|
if (token) {
|
|
303
336
|
context.authtoken = token;
|
|
304
337
|
}
|
|
305
338
|
}
|
|
306
339
|
}
|
|
340
|
+
const _perf_t11 = Date.now();
|
|
341
|
+
logEvent("[registerRequestListener] before: data.response");
|
|
307
342
|
const response = await data.response();
|
|
343
|
+
logEvent(`[registerRequestListener] after: data.response took ${Date.now() - _perf_t11}ms`);
|
|
308
344
|
const endTime = new Date().getTime();
|
|
309
345
|
const obj = {
|
|
310
346
|
url: data.url(),
|
|
@@ -336,7 +372,10 @@ class StableBrowser {
|
|
|
336
372
|
if (!url) {
|
|
337
373
|
throw new Error("url is null, verify that the environment file is correct");
|
|
338
374
|
}
|
|
375
|
+
const _perf_t12 = Date.now();
|
|
376
|
+
logEvent("[goto] before: _replaceWithLocalData");
|
|
339
377
|
url = await this._replaceWithLocalData(url, this.world);
|
|
378
|
+
logEvent(`[goto] after: _replaceWithLocalData took ${Date.now() - _perf_t12}ms`);
|
|
340
379
|
if (!url.startsWith("http")) {
|
|
341
380
|
url = "https://" + url;
|
|
342
381
|
}
|
|
@@ -361,18 +400,33 @@ class StableBrowser {
|
|
|
361
400
|
timeout = options["timeout"];
|
|
362
401
|
}
|
|
363
402
|
try {
|
|
403
|
+
const _perf_t13 = Date.now();
|
|
404
|
+
logEvent("[goto] before: _preCommand");
|
|
364
405
|
await _preCommand(state, this);
|
|
406
|
+
logEvent(`[goto] after: _preCommand took ${Date.now() - _perf_t13}ms`);
|
|
407
|
+
const _perf_t14 = Date.now();
|
|
408
|
+
logEvent("[goto] before: page.goto");
|
|
365
409
|
await this.page.goto(url, {
|
|
366
410
|
timeout: timeout,
|
|
367
411
|
});
|
|
412
|
+
logEvent(`[goto] after: page.goto took ${Date.now() - _perf_t14}ms`);
|
|
413
|
+
const _perf_t15 = Date.now();
|
|
414
|
+
logEvent("[goto] before: _screenshot");
|
|
368
415
|
await _screenshot(state, this);
|
|
416
|
+
logEvent(`[goto] after: _screenshot took ${Date.now() - _perf_t15}ms`);
|
|
369
417
|
}
|
|
370
418
|
catch (error) {
|
|
371
419
|
console.error("Error on goto", error);
|
|
420
|
+
const _perf_t16 = Date.now();
|
|
421
|
+
logEvent("[goto] before: _commandError");
|
|
372
422
|
await _commandError(state, error, this);
|
|
423
|
+
logEvent(`[goto] after: _commandError took ${Date.now() - _perf_t16}ms`);
|
|
373
424
|
}
|
|
374
425
|
finally {
|
|
426
|
+
const _perf_t17 = Date.now();
|
|
427
|
+
logEvent("[goto] before: _commandFinally");
|
|
375
428
|
await _commandFinally(state, this);
|
|
429
|
+
logEvent(`[goto] after: _commandFinally took ${Date.now() - _perf_t17}ms`);
|
|
376
430
|
}
|
|
377
431
|
}
|
|
378
432
|
async goBack(options, world = null) {
|
|
@@ -390,18 +444,33 @@ class StableBrowser {
|
|
|
390
444
|
highlight: false,
|
|
391
445
|
};
|
|
392
446
|
try {
|
|
447
|
+
const _perf_t18 = Date.now();
|
|
448
|
+
logEvent("[goBack] before: _preCommand");
|
|
393
449
|
await _preCommand(state, this);
|
|
450
|
+
logEvent(`[goBack] after: _preCommand took ${Date.now() - _perf_t18}ms`);
|
|
451
|
+
const _perf_t19 = Date.now();
|
|
452
|
+
logEvent("[goBack] before: page.goBack");
|
|
394
453
|
await this.page.goBack({
|
|
395
454
|
waitUntil: "load",
|
|
396
455
|
});
|
|
456
|
+
logEvent(`[goBack] after: page.goBack took ${Date.now() - _perf_t19}ms`);
|
|
457
|
+
const _perf_t20 = Date.now();
|
|
458
|
+
logEvent("[goBack] before: _screenshot");
|
|
397
459
|
await _screenshot(state, this);
|
|
460
|
+
logEvent(`[goBack] after: _screenshot took ${Date.now() - _perf_t20}ms`);
|
|
398
461
|
}
|
|
399
462
|
catch (error) {
|
|
400
463
|
console.error("Error on goBack", error);
|
|
464
|
+
const _perf_t21 = Date.now();
|
|
465
|
+
logEvent("[goBack] before: _commandError");
|
|
401
466
|
await _commandError(state, error, this);
|
|
467
|
+
logEvent(`[goBack] after: _commandError took ${Date.now() - _perf_t21}ms`);
|
|
402
468
|
}
|
|
403
469
|
finally {
|
|
470
|
+
const _perf_t22 = Date.now();
|
|
471
|
+
logEvent("[goBack] before: _commandFinally");
|
|
404
472
|
await _commandFinally(state, this);
|
|
473
|
+
logEvent(`[goBack] after: _commandFinally took ${Date.now() - _perf_t22}ms`);
|
|
405
474
|
}
|
|
406
475
|
}
|
|
407
476
|
async goForward(options, world = null) {
|
|
@@ -419,18 +488,33 @@ class StableBrowser {
|
|
|
419
488
|
highlight: false,
|
|
420
489
|
};
|
|
421
490
|
try {
|
|
491
|
+
const _perf_t23 = Date.now();
|
|
492
|
+
logEvent("[goForward] before: _preCommand");
|
|
422
493
|
await _preCommand(state, this);
|
|
494
|
+
logEvent(`[goForward] after: _preCommand took ${Date.now() - _perf_t23}ms`);
|
|
495
|
+
const _perf_t24 = Date.now();
|
|
496
|
+
logEvent("[goForward] before: page.goForward");
|
|
423
497
|
await this.page.goForward({
|
|
424
498
|
waitUntil: "load",
|
|
425
499
|
});
|
|
500
|
+
logEvent(`[goForward] after: page.goForward took ${Date.now() - _perf_t24}ms`);
|
|
501
|
+
const _perf_t25 = Date.now();
|
|
502
|
+
logEvent("[goForward] before: _screenshot");
|
|
426
503
|
await _screenshot(state, this);
|
|
504
|
+
logEvent(`[goForward] after: _screenshot took ${Date.now() - _perf_t25}ms`);
|
|
427
505
|
}
|
|
428
506
|
catch (error) {
|
|
429
507
|
console.error("Error on goForward", error);
|
|
508
|
+
const _perf_t26 = Date.now();
|
|
509
|
+
logEvent("[goForward] before: _commandError");
|
|
430
510
|
await _commandError(state, error, this);
|
|
511
|
+
logEvent(`[goForward] after: _commandError took ${Date.now() - _perf_t26}ms`);
|
|
431
512
|
}
|
|
432
513
|
finally {
|
|
514
|
+
const _perf_t27 = Date.now();
|
|
515
|
+
logEvent("[goForward] before: _commandFinally");
|
|
433
516
|
await _commandFinally(state, this);
|
|
517
|
+
logEvent(`[goForward] after: _commandFinally took ${Date.now() - _perf_t27}ms`);
|
|
434
518
|
}
|
|
435
519
|
}
|
|
436
520
|
async _getLocator(locator, scope, _params) {
|
|
@@ -440,7 +524,10 @@ class StableBrowser {
|
|
|
440
524
|
if (typeof locator[key] !== "string")
|
|
441
525
|
continue;
|
|
442
526
|
if (locator[key].includes("{{") && locator[key].includes("}}")) {
|
|
527
|
+
const _perf_t28 = Date.now();
|
|
528
|
+
logEvent("[_getLocator] before: _replaceWithLocalData");
|
|
443
529
|
locator[key] = await this._replaceWithLocalData(locator[key], this.world);
|
|
530
|
+
logEvent(`[_getLocator] after: _replaceWithLocalData took ${Date.now() - _perf_t28}ms`);
|
|
444
531
|
}
|
|
445
532
|
}
|
|
446
533
|
let locatorReturn;
|
|
@@ -493,7 +580,10 @@ class StableBrowser {
|
|
|
493
580
|
if (css && css.locator) {
|
|
494
581
|
css = css.locator;
|
|
495
582
|
}
|
|
583
|
+
const _perf_t29 = Date.now();
|
|
584
|
+
logEvent("[_locateElmentByTextClimbCss] before: _locateElementByText");
|
|
496
585
|
let result = await this._locateElementByText(scope, _fixUsingParams(text, _params), "*:not(script, style, head)", false, false, true, _params);
|
|
586
|
+
logEvent(`[_locateElmentByTextClimbCss] after: _locateElementByText took ${Date.now() - _perf_t29}ms`);
|
|
497
587
|
if (result.elementCount === 0) {
|
|
498
588
|
return;
|
|
499
589
|
}
|
|
@@ -513,7 +603,10 @@ class StableBrowser {
|
|
|
513
603
|
async _locateElementByText(scope, text1, tag1, regex1 = false, partial1, ignoreCase = true, _params) {
|
|
514
604
|
const query = `${_convertToRegexQuery(text1, regex1, !partial1, ignoreCase)}`;
|
|
515
605
|
const locator = scope.locator(query);
|
|
606
|
+
const _perf_t30 = Date.now();
|
|
607
|
+
logEvent("[_locateElementByText] before: locator.count");
|
|
516
608
|
const count = await locator.count();
|
|
609
|
+
logEvent(`[_locateElementByText] after: locator.count took ${Date.now() - _perf_t30}ms`);
|
|
517
610
|
if (!tag1) {
|
|
518
611
|
tag1 = "*";
|
|
519
612
|
}
|
|
@@ -562,18 +655,30 @@ class StableBrowser {
|
|
|
562
655
|
//info.log += "searching for locator " + JSON.stringify(locatorSearch) + "\n";
|
|
563
656
|
let locator = null;
|
|
564
657
|
if (locatorSearch.climb && locatorSearch.climb >= 0) {
|
|
658
|
+
const _perf_t31 = Date.now();
|
|
659
|
+
logEvent("[_collectLocatorInformation] before: _replaceWithLocalData");
|
|
565
660
|
const replacedText = await this._replaceWithLocalData(locatorSearch.text, this.world);
|
|
661
|
+
logEvent(`[_collectLocatorInformation] after: _replaceWithLocalData took ${Date.now() - _perf_t31}ms`);
|
|
662
|
+
const _perf_t32 = Date.now();
|
|
663
|
+
logEvent("[_collectLocatorInformation] before: _locateElmentByTextClimbCss");
|
|
566
664
|
let locatorString = await this._locateElmentByTextClimbCss(scope, replacedText, locatorSearch.climb, locatorSearch.css, _params);
|
|
665
|
+
logEvent(`[_collectLocatorInformation] after: _locateElmentByTextClimbCss took ${Date.now() - _perf_t32}ms`);
|
|
567
666
|
if (!locatorString) {
|
|
568
667
|
info.failCause.textNotFound = true;
|
|
569
668
|
info.failCause.lastError = `failed to locate ${formatElementName(element_name)} by text: ${locatorSearch.text}`;
|
|
570
669
|
return;
|
|
571
670
|
}
|
|
671
|
+
const _perf_t33 = Date.now();
|
|
672
|
+
logEvent("[_collectLocatorInformation] before: _getLocator");
|
|
572
673
|
locator = await this._getLocator({ css: locatorString }, scope, _params);
|
|
674
|
+
logEvent(`[_collectLocatorInformation] after: _getLocator took ${Date.now() - _perf_t33}ms`);
|
|
573
675
|
}
|
|
574
676
|
else if (locatorSearch.text) {
|
|
575
677
|
let text = _fixUsingParams(locatorSearch.text, _params);
|
|
678
|
+
const _perf_t34 = Date.now();
|
|
679
|
+
logEvent("[_collectLocatorInformation] before: _locateElementByText");
|
|
576
680
|
let result = await this._locateElementByText(scope, text, locatorSearch.tag, false, locatorSearch.partial === true, true, _params);
|
|
681
|
+
logEvent(`[_collectLocatorInformation] after: _locateElementByText took ${Date.now() - _perf_t34}ms`);
|
|
577
682
|
if (result.elementCount === 0) {
|
|
578
683
|
info.failCause.textNotFound = true;
|
|
579
684
|
info.failCause.lastError = `failed to locate ${formatElementName(element_name)} by text: ${text}`;
|
|
@@ -583,16 +688,25 @@ class StableBrowser {
|
|
|
583
688
|
if (locatorSearch.childCss) {
|
|
584
689
|
locatorSearch.css = locatorSearch.css + " " + locatorSearch.childCss;
|
|
585
690
|
}
|
|
691
|
+
const _perf_t35 = Date.now();
|
|
692
|
+
logEvent("[_collectLocatorInformation] before: _getLocator");
|
|
586
693
|
locator = await this._getLocator(locatorSearch, scope, _params);
|
|
694
|
+
logEvent(`[_collectLocatorInformation] after: _getLocator took ${Date.now() - _perf_t35}ms`);
|
|
587
695
|
}
|
|
588
696
|
else {
|
|
697
|
+
const _perf_t36 = Date.now();
|
|
698
|
+
logEvent("[_collectLocatorInformation] before: _getLocator");
|
|
589
699
|
locator = await this._getLocator(locatorSearch, scope, _params);
|
|
700
|
+
logEvent(`[_collectLocatorInformation] after: _getLocator took ${Date.now() - _perf_t36}ms`);
|
|
590
701
|
}
|
|
591
702
|
// let cssHref = false;
|
|
592
703
|
// if (locatorSearch.css && locatorSearch.css.includes("href=")) {
|
|
593
704
|
// cssHref = true;
|
|
594
705
|
// }
|
|
706
|
+
const _perf_t37 = Date.now();
|
|
707
|
+
logEvent("[_collectLocatorInformation] before: locator.count");
|
|
595
708
|
let count = await locator.count();
|
|
709
|
+
logEvent(`[_collectLocatorInformation] after: locator.count took ${Date.now() - _perf_t37}ms`);
|
|
596
710
|
if (count > 0 && !info.failCause.count) {
|
|
597
711
|
info.failCause.count = count;
|
|
598
712
|
}
|
|
@@ -610,8 +724,14 @@ class StableBrowser {
|
|
|
610
724
|
info.locatorLog.setLocatorSearchStatus(originalLocatorSearch, "NOT_FOUND");
|
|
611
725
|
}
|
|
612
726
|
for (let j = 0; j < count; j++) {
|
|
727
|
+
const _perf_t38 = Date.now();
|
|
728
|
+
logEvent("[_collectLocatorInformation] before: locator.nth");
|
|
613
729
|
let visible = await locator.nth(j).isVisible();
|
|
730
|
+
logEvent(`[_collectLocatorInformation] after: locator.nth took ${Date.now() - _perf_t38}ms`);
|
|
731
|
+
const _perf_t39 = Date.now();
|
|
732
|
+
logEvent("[_collectLocatorInformation] before: locator.nth");
|
|
614
733
|
const enabled = await locator.nth(j).isEnabled();
|
|
734
|
+
logEvent(`[_collectLocatorInformation] after: locator.nth took ${Date.now() - _perf_t39}ms`);
|
|
615
735
|
if (!visibleOnly) {
|
|
616
736
|
visible = true;
|
|
617
737
|
}
|
|
@@ -661,7 +781,10 @@ class StableBrowser {
|
|
|
661
781
|
let result = null;
|
|
662
782
|
let scope = null;
|
|
663
783
|
for (let i = 0; i < scopes.length; i++) {
|
|
784
|
+
const _perf_t40 = Date.now();
|
|
785
|
+
logEvent("[closeUnexpectedPopups] before: _scanLocatorsGroup");
|
|
664
786
|
result = await this._scanLocatorsGroup(handlerGroup, scopes[i], _params, info, true);
|
|
787
|
+
logEvent(`[closeUnexpectedPopups] after: _scanLocatorsGroup took ${Date.now() - _perf_t40}ms`);
|
|
665
788
|
if (result.foundElements.length > 0) {
|
|
666
789
|
scope = scopes[i];
|
|
667
790
|
break;
|
|
@@ -672,7 +795,10 @@ class StableBrowser {
|
|
|
672
795
|
const closeHandlerGroup = [];
|
|
673
796
|
closeHandlerGroup.push(this.configuration.popupHandlers[result.locatorIndex].close_dialog_locator);
|
|
674
797
|
for (let i = 0; i < scopes.length; i++) {
|
|
798
|
+
const _perf_t41 = Date.now();
|
|
799
|
+
logEvent("[closeUnexpectedPopups] before: _scanLocatorsGroup");
|
|
675
800
|
result = await this._scanLocatorsGroup(closeHandlerGroup, scopes[i], _params, info, true);
|
|
801
|
+
logEvent(`[closeUnexpectedPopups] after: _scanLocatorsGroup took ${Date.now() - _perf_t41}ms`);
|
|
676
802
|
if (result.foundElements.length > 0) {
|
|
677
803
|
break;
|
|
678
804
|
}
|
|
@@ -680,19 +806,31 @@ class StableBrowser {
|
|
|
680
806
|
if (result.foundElements.length > 0) {
|
|
681
807
|
let dialogCloseLocator = result.foundElements[0].locator;
|
|
682
808
|
try {
|
|
809
|
+
const _perf_t42 = Date.now();
|
|
810
|
+
logEvent("[closeUnexpectedPopups] before: scope");
|
|
683
811
|
await scope?.evaluate(() => {
|
|
684
812
|
window.__isClosingPopups = true;
|
|
685
813
|
});
|
|
814
|
+
logEvent(`[closeUnexpectedPopups] after: scope took ${Date.now() - _perf_t42}ms`);
|
|
815
|
+
const _perf_t43 = Date.now();
|
|
816
|
+
logEvent("[closeUnexpectedPopups] before: dialogCloseLocator.click");
|
|
686
817
|
await dialogCloseLocator.click();
|
|
818
|
+
logEvent(`[closeUnexpectedPopups] after: dialogCloseLocator.click took ${Date.now() - _perf_t43}ms`);
|
|
687
819
|
// wait for the dialog to close
|
|
820
|
+
const _perf_t44 = Date.now();
|
|
821
|
+
logEvent("[closeUnexpectedPopups] before: dialogCloseLocator.waitFor");
|
|
688
822
|
await dialogCloseLocator.waitFor({ state: "hidden" });
|
|
823
|
+
logEvent(`[closeUnexpectedPopups] after: dialogCloseLocator.waitFor took ${Date.now() - _perf_t44}ms`);
|
|
689
824
|
}
|
|
690
825
|
catch (e) {
|
|
691
826
|
}
|
|
692
827
|
finally {
|
|
828
|
+
const _perf_t45 = Date.now();
|
|
829
|
+
logEvent("[closeUnexpectedPopups] before: scope");
|
|
693
830
|
await scope?.evaluate(() => {
|
|
694
831
|
window.__isClosingPopups = false;
|
|
695
832
|
});
|
|
833
|
+
logEvent(`[closeUnexpectedPopups] after: scope took ${Date.now() - _perf_t45}ms`);
|
|
696
834
|
}
|
|
697
835
|
return { rerun: true };
|
|
698
836
|
}
|
|
@@ -787,7 +925,10 @@ class StableBrowser {
|
|
|
787
925
|
if (strategyLocators && strategyLocators.length) {
|
|
788
926
|
try {
|
|
789
927
|
selectors.locators = strategyLocators;
|
|
928
|
+
const _perf_t46 = Date.now();
|
|
929
|
+
logEvent("[_locate] before: _locate_internal");
|
|
790
930
|
element = await this._locate_internal(selectors, info, _params, 10_000, allowDisabled);
|
|
931
|
+
logEvent(`[_locate] after: _locate_internal took ${Date.now() - _perf_t46}ms`);
|
|
791
932
|
info.selectedStrategy = selectedStrategy;
|
|
792
933
|
info.log += "element found using strategy " + selectedStrategy + "\n";
|
|
793
934
|
}
|
|
@@ -805,7 +946,10 @@ class StableBrowser {
|
|
|
805
946
|
try {
|
|
806
947
|
info.log += "using strategy " + key + " with locators " + JSON.stringify(strategyLocators) + "\n";
|
|
807
948
|
selectors.locators = strategyLocators;
|
|
949
|
+
const _perf_t47 = Date.now();
|
|
950
|
+
logEvent("[_locate] before: _locate_internal");
|
|
808
951
|
element = await this._locate_internal(selectors, info, _params, 10_000, allowDisabled);
|
|
952
|
+
logEvent(`[_locate] after: _locate_internal took ${Date.now() - _perf_t47}ms`);
|
|
809
953
|
err = null;
|
|
810
954
|
info.selectedStrategy = key;
|
|
811
955
|
info.log += "element found using strategy " + key + "\n";
|
|
@@ -822,11 +966,16 @@ class StableBrowser {
|
|
|
822
966
|
}
|
|
823
967
|
}
|
|
824
968
|
else {
|
|
969
|
+
const _perf_t48 = Date.now();
|
|
970
|
+
logEvent("[_locate] before: _locate_internal");
|
|
825
971
|
element = await this._locate_internal(selectors, info, _params, timeout, allowDisabled);
|
|
972
|
+
logEvent(`[_locate] after: _locate_internal took ${Date.now() - _perf_t48}ms`);
|
|
826
973
|
}
|
|
827
974
|
if (!element.rerun) {
|
|
828
975
|
let newElementSelector = "";
|
|
829
976
|
if (this.configuration && this.configuration.stableLocatorStrategy === "csschain") {
|
|
977
|
+
const _perf_t49 = Date.now();
|
|
978
|
+
logEvent("[_locate] before: element.evaluate");
|
|
830
979
|
const cssSelector = await element.evaluate((el) => {
|
|
831
980
|
function getCssSelector(el) {
|
|
832
981
|
if (!el || el.nodeType !== 1 || el === document.body)
|
|
@@ -849,15 +998,19 @@ class StableBrowser {
|
|
|
849
998
|
const cssSelector = getCssSelector(el);
|
|
850
999
|
return cssSelector;
|
|
851
1000
|
});
|
|
1001
|
+
logEvent(`[_locate] after: element.evaluate took ${Date.now() - _perf_t49}ms`);
|
|
852
1002
|
newElementSelector = cssSelector;
|
|
853
1003
|
}
|
|
854
1004
|
else {
|
|
855
1005
|
const randomToken = "blinq_" + Math.random().toString(36).substring(7);
|
|
856
1006
|
if (this.configuration && this.configuration.stableLocatorStrategy === "data-attribute") {
|
|
857
1007
|
const dataAttribute = "data-blinq-id";
|
|
1008
|
+
const _perf_t50 = Date.now();
|
|
1009
|
+
logEvent("[_locate] before: element.evaluate");
|
|
858
1010
|
await element.evaluate((el, [dataAttribute, randomToken]) => {
|
|
859
1011
|
el.setAttribute(dataAttribute, randomToken);
|
|
860
1012
|
}, [dataAttribute, randomToken]);
|
|
1013
|
+
logEvent(`[_locate] after: element.evaluate took ${Date.now() - _perf_t50}ms`);
|
|
861
1014
|
newElementSelector = `[${dataAttribute}="${randomToken}"]`;
|
|
862
1015
|
}
|
|
863
1016
|
else {
|
|
@@ -905,9 +1058,12 @@ class StableBrowser {
|
|
|
905
1058
|
testframescope = framescope.nth(frameLocator.index);
|
|
906
1059
|
}
|
|
907
1060
|
try {
|
|
1061
|
+
const _perf_t51 = Date.now();
|
|
1062
|
+
logEvent("[_findFrameScope] before: testframescope.owner");
|
|
908
1063
|
await testframescope.owner().evaluateHandle(() => true, null, {
|
|
909
1064
|
timeout: 5000,
|
|
910
1065
|
});
|
|
1066
|
+
logEvent(`[_findFrameScope] after: testframescope.owner took ${Date.now() - _perf_t51}ms`);
|
|
911
1067
|
framescope = testframescope;
|
|
912
1068
|
break;
|
|
913
1069
|
}
|
|
@@ -917,7 +1073,10 @@ class StableBrowser {
|
|
|
917
1073
|
}
|
|
918
1074
|
}
|
|
919
1075
|
if (frame.children) {
|
|
1076
|
+
const _perf_t52 = Date.now();
|
|
1077
|
+
logEvent("[_findFrameScope] before: findFrame");
|
|
920
1078
|
return await findFrame(frame.children, framescope);
|
|
1079
|
+
logEvent(`[_findFrameScope] after: findFrame took ${Date.now() - _perf_t52}ms`);
|
|
921
1080
|
}
|
|
922
1081
|
return framescope;
|
|
923
1082
|
};
|
|
@@ -926,7 +1085,10 @@ class StableBrowser {
|
|
|
926
1085
|
let frameFound = false;
|
|
927
1086
|
if (selectors.nestFrmLoc) {
|
|
928
1087
|
fLocator = selectors.nestFrmLoc;
|
|
1088
|
+
const _perf_t53 = Date.now();
|
|
1089
|
+
logEvent("[_findFrameScope] before: findFrame");
|
|
929
1090
|
scope = await findFrame(selectors.nestFrmLoc, scope);
|
|
1091
|
+
logEvent(`[_findFrameScope] after: findFrame took ${Date.now() - _perf_t53}ms`);
|
|
930
1092
|
frameFound = true;
|
|
931
1093
|
break;
|
|
932
1094
|
}
|
|
@@ -955,7 +1117,10 @@ class StableBrowser {
|
|
|
955
1117
|
info.failCause.lastError = `unable to locate iframe "${selectors.iframe_src}"`;
|
|
956
1118
|
throw new Error("unable to locate iframe " + selectors.iframe_src);
|
|
957
1119
|
}
|
|
1120
|
+
const _perf_t54 = Date.now();
|
|
1121
|
+
logEvent("[_findFrameScope] before: new Promise");
|
|
958
1122
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1123
|
+
logEvent(`[_findFrameScope] after: new Promise took ${Date.now() - _perf_t54}ms`);
|
|
959
1124
|
}
|
|
960
1125
|
else {
|
|
961
1126
|
if (info && info.locatorLog) {
|
|
@@ -971,7 +1136,10 @@ class StableBrowser {
|
|
|
971
1136
|
return scope;
|
|
972
1137
|
}
|
|
973
1138
|
async _getDocumentBody(selectors, timeout = 30000, info) {
|
|
1139
|
+
const _perf_t55 = Date.now();
|
|
1140
|
+
logEvent("[_getDocumentBody] before: _findFrameScope");
|
|
974
1141
|
let scope = await this._findFrameScope(selectors, timeout, info);
|
|
1142
|
+
logEvent(`[_getDocumentBody] after: _findFrameScope took ${Date.now() - _perf_t55}ms`);
|
|
975
1143
|
return scope.evaluate(() => {
|
|
976
1144
|
var bodyContent = document.body.innerHTML;
|
|
977
1145
|
return bodyContent;
|
|
@@ -1026,22 +1194,37 @@ class StableBrowser {
|
|
|
1026
1194
|
let highPriorityOnly = true;
|
|
1027
1195
|
let visibleOnly = true;
|
|
1028
1196
|
while (true) {
|
|
1197
|
+
const _perf_t56 = Date.now();
|
|
1198
|
+
logEvent("[_locate_internal] before: _findFrameScope");
|
|
1029
1199
|
let scope = await this._findFrameScope(selectors, timeout, info);
|
|
1200
|
+
logEvent(`[_locate_internal] after: _findFrameScope took ${Date.now() - _perf_t56}ms`);
|
|
1030
1201
|
locatorsCount = 0;
|
|
1031
1202
|
let result = [];
|
|
1203
|
+
const _perf_t57 = Date.now();
|
|
1204
|
+
logEvent("[_locate_internal] before: closeUnexpectedPopups");
|
|
1032
1205
|
let popupResult = await this.closeUnexpectedPopups(info, _params);
|
|
1206
|
+
logEvent(`[_locate_internal] after: closeUnexpectedPopups took ${Date.now() - _perf_t57}ms`);
|
|
1033
1207
|
if (popupResult.rerun) {
|
|
1034
1208
|
return popupResult;
|
|
1035
1209
|
}
|
|
1036
1210
|
// info.log += "scanning locators in priority 1" + "\n";
|
|
1037
1211
|
let onlyPriority3 = selectorsLocators[0].priority === 3;
|
|
1212
|
+
const _perf_t58 = Date.now();
|
|
1213
|
+
logEvent("[_locate_internal] before: _scanLocatorsGroup");
|
|
1038
1214
|
result = await this._scanLocatorsGroup(locatorsByPriority["1"], scope, _params, info, visibleOnly, allowDisabled, selectors?.element_name);
|
|
1215
|
+
logEvent(`[_locate_internal] after: _scanLocatorsGroup took ${Date.now() - _perf_t58}ms`);
|
|
1039
1216
|
if (result.foundElements.length === 0) {
|
|
1040
1217
|
// info.log += "scanning locators in priority 2" + "\n";
|
|
1218
|
+
const _perf_t59 = Date.now();
|
|
1219
|
+
logEvent("[_locate_internal] before: _scanLocatorsGroup");
|
|
1041
1220
|
result = await this._scanLocatorsGroup(locatorsByPriority["2"], scope, _params, info, visibleOnly, allowDisabled, selectors?.element_name);
|
|
1221
|
+
logEvent(`[_locate_internal] after: _scanLocatorsGroup took ${Date.now() - _perf_t59}ms`);
|
|
1042
1222
|
}
|
|
1043
1223
|
if (result.foundElements.length === 0 && (onlyPriority3 || !highPriorityOnly)) {
|
|
1224
|
+
const _perf_t60 = Date.now();
|
|
1225
|
+
logEvent("[_locate_internal] before: _scanLocatorsGroup");
|
|
1044
1226
|
result = await this._scanLocatorsGroup(locatorsByPriority["3"], scope, _params, info, visibleOnly, allowDisabled, selectors?.element_name);
|
|
1227
|
+
logEvent(`[_locate_internal] after: _scanLocatorsGroup took ${Date.now() - _perf_t60}ms`);
|
|
1045
1228
|
}
|
|
1046
1229
|
let foundElements = result.foundElements;
|
|
1047
1230
|
if (foundElements.length === 1 && foundElements[0].unique) {
|
|
@@ -1077,7 +1260,10 @@ class StableBrowser {
|
|
|
1077
1260
|
}
|
|
1078
1261
|
if (maxCountElement) {
|
|
1079
1262
|
info.log += "unique element was found, locator: " + maxCountElement.locator + "\n";
|
|
1263
|
+
const _perf_t61 = Date.now();
|
|
1264
|
+
logEvent("[_locate_internal] before: maxCountElement.locator.boundingBox");
|
|
1080
1265
|
info.box = await maxCountElement.locator.boundingBox();
|
|
1266
|
+
logEvent(`[_locate_internal] after: maxCountElement.locator.boundingBox took ${Date.now() - _perf_t61}ms`);
|
|
1081
1267
|
return maxCountElement.locator;
|
|
1082
1268
|
}
|
|
1083
1269
|
}
|
|
@@ -1089,14 +1275,20 @@ class StableBrowser {
|
|
|
1089
1275
|
highPriorityOnly = false;
|
|
1090
1276
|
if (this.configuration && this.configuration.load_all_lazy === true && !lazy_scroll) {
|
|
1091
1277
|
lazy_scroll = true;
|
|
1278
|
+
const _perf_t62 = Date.now();
|
|
1279
|
+
logEvent("[_locate_internal] before: scrollPageToLoadLazyElements");
|
|
1092
1280
|
await scrollPageToLoadLazyElements(this.page);
|
|
1281
|
+
logEvent(`[_locate_internal] after: scrollPageToLoadLazyElements took ${Date.now() - _perf_t62}ms`);
|
|
1093
1282
|
}
|
|
1094
1283
|
}
|
|
1095
1284
|
if (Date.now() - startTime > visibleOnlyTimeout) {
|
|
1096
1285
|
//info.log += "visible only timeout, will try all elements" + "\n";
|
|
1097
1286
|
visibleOnly = false;
|
|
1098
1287
|
}
|
|
1288
|
+
const _perf_t63 = Date.now();
|
|
1289
|
+
logEvent("[_locate_internal] before: new Promise");
|
|
1099
1290
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1291
|
+
logEvent(`[_locate_internal] after: new Promise took ${Date.now() - _perf_t63}ms`);
|
|
1100
1292
|
// sheck of more of half of the timeout has passed
|
|
1101
1293
|
if (Date.now() - startTime > timeout / 2) {
|
|
1102
1294
|
highPriorityOnly = false;
|
|
@@ -1125,7 +1317,10 @@ class StableBrowser {
|
|
|
1125
1317
|
for (let i = 0; i < locatorsGroup.length; i++) {
|
|
1126
1318
|
let foundLocators = [];
|
|
1127
1319
|
try {
|
|
1320
|
+
const _perf_t64 = Date.now();
|
|
1321
|
+
logEvent("[_scanLocatorsGroup] before: _collectLocatorInformation");
|
|
1128
1322
|
await this._collectLocatorInformation(locatorsGroup, i, scope, foundLocators, _params, info, visibleOnly, allowDisabled, element_name);
|
|
1323
|
+
logEvent(`[_scanLocatorsGroup] after: _collectLocatorInformation took ${Date.now() - _perf_t64}ms`);
|
|
1129
1324
|
}
|
|
1130
1325
|
catch (e) {
|
|
1131
1326
|
// this call can fail it the browser is navigating
|
|
@@ -1133,7 +1328,10 @@ class StableBrowser {
|
|
|
1133
1328
|
// logEvent(e);
|
|
1134
1329
|
foundLocators = [];
|
|
1135
1330
|
try {
|
|
1331
|
+
const _perf_t65 = Date.now();
|
|
1332
|
+
logEvent("[_scanLocatorsGroup] before: _collectLocatorInformation");
|
|
1136
1333
|
await this._collectLocatorInformation(locatorsGroup, i, this.page, foundLocators, _params, info, visibleOnly, allowDisabled, element_name);
|
|
1334
|
+
logEvent(`[_scanLocatorsGroup] after: _collectLocatorInformation took ${Date.now() - _perf_t65}ms`);
|
|
1137
1335
|
}
|
|
1138
1336
|
catch (e) {
|
|
1139
1337
|
if (logErrors) {
|
|
@@ -1144,7 +1342,10 @@ class StableBrowser {
|
|
|
1144
1342
|
if (foundLocators.length === 1) {
|
|
1145
1343
|
let box = null;
|
|
1146
1344
|
if (!this.onlyFailuresScreenshot) {
|
|
1345
|
+
const _perf_t66 = Date.now();
|
|
1346
|
+
logEvent("[_scanLocatorsGroup] before: foundLocators[0]");
|
|
1147
1347
|
box = await foundLocators[0].boundingBox();
|
|
1348
|
+
logEvent(`[_scanLocatorsGroup] after: foundLocators[0] took ${Date.now() - _perf_t66}ms`);
|
|
1148
1349
|
}
|
|
1149
1350
|
result.foundElements.push({
|
|
1150
1351
|
locator: foundLocators[0],
|
|
@@ -1206,7 +1407,10 @@ class StableBrowser {
|
|
|
1206
1407
|
operation: "simpleClick",
|
|
1207
1408
|
log: "***** click on " + elementDescription + " *****\n",
|
|
1208
1409
|
};
|
|
1410
|
+
const _perf_t67 = Date.now();
|
|
1411
|
+
logEvent("[simpleClick] before: _preCommand");
|
|
1209
1412
|
await _preCommand(state, this);
|
|
1413
|
+
logEvent(`[simpleClick] after: _preCommand took ${Date.now() - _perf_t67}ms`);
|
|
1210
1414
|
const startTime = Date.now();
|
|
1211
1415
|
let timeout = 30000;
|
|
1212
1416
|
if (options && options.timeout) {
|
|
@@ -1214,7 +1418,10 @@ class StableBrowser {
|
|
|
1214
1418
|
}
|
|
1215
1419
|
while (true) {
|
|
1216
1420
|
try {
|
|
1421
|
+
const _perf_t68 = Date.now();
|
|
1422
|
+
logEvent("[simpleClick] before: locate_element");
|
|
1217
1423
|
const result = await locate_element(this.context, elementDescription, "click");
|
|
1424
|
+
logEvent(`[simpleClick] after: locate_element took ${Date.now() - _perf_t68}ms`);
|
|
1218
1425
|
if (result?.elementNumber >= 0) {
|
|
1219
1426
|
const selectors = {
|
|
1220
1427
|
frame: result?.frame,
|
|
@@ -1224,7 +1431,10 @@ class StableBrowser {
|
|
|
1224
1431
|
},
|
|
1225
1432
|
],
|
|
1226
1433
|
};
|
|
1434
|
+
const _perf_t69 = Date.now();
|
|
1435
|
+
logEvent("[simpleClick] before: click");
|
|
1227
1436
|
await this.click(selectors, _params, options, world);
|
|
1437
|
+
logEvent(`[simpleClick] after: click took ${Date.now() - _perf_t69}ms`);
|
|
1228
1438
|
return;
|
|
1229
1439
|
}
|
|
1230
1440
|
}
|
|
@@ -1232,14 +1442,23 @@ class StableBrowser {
|
|
|
1232
1442
|
if (performance.now() - startTime > timeout) {
|
|
1233
1443
|
// throw e;
|
|
1234
1444
|
try {
|
|
1445
|
+
const _perf_t70 = Date.now();
|
|
1446
|
+
logEvent("[simpleClick] before: _commandError");
|
|
1235
1447
|
await _commandError(state, "timeout looking for " + elementDescription, this);
|
|
1448
|
+
logEvent(`[simpleClick] after: _commandError took ${Date.now() - _perf_t70}ms`);
|
|
1236
1449
|
}
|
|
1237
1450
|
finally {
|
|
1451
|
+
const _perf_t71 = Date.now();
|
|
1452
|
+
logEvent("[simpleClick] before: _commandFinally");
|
|
1238
1453
|
await _commandFinally(state, this);
|
|
1454
|
+
logEvent(`[simpleClick] after: _commandFinally took ${Date.now() - _perf_t71}ms`);
|
|
1239
1455
|
}
|
|
1240
1456
|
}
|
|
1241
1457
|
}
|
|
1458
|
+
const _perf_t72 = Date.now();
|
|
1459
|
+
logEvent("[simpleClick] before: new Promise");
|
|
1242
1460
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
1461
|
+
logEvent(`[simpleClick] after: new Promise took ${Date.now() - _perf_t72}ms`);
|
|
1243
1462
|
}
|
|
1244
1463
|
}
|
|
1245
1464
|
async simpleClickType(elementDescription, value, _params, options = {}, world = null) {
|
|
@@ -1255,7 +1474,10 @@ class StableBrowser {
|
|
|
1255
1474
|
operation: "simpleClickType",
|
|
1256
1475
|
log: "***** click type on " + elementDescription + " *****\n",
|
|
1257
1476
|
};
|
|
1477
|
+
const _perf_t73 = Date.now();
|
|
1478
|
+
logEvent("[simpleClickType] before: _preCommand");
|
|
1258
1479
|
await _preCommand(state, this);
|
|
1480
|
+
logEvent(`[simpleClickType] after: _preCommand took ${Date.now() - _perf_t73}ms`);
|
|
1259
1481
|
const startTime = Date.now();
|
|
1260
1482
|
let timeout = 30000;
|
|
1261
1483
|
if (options && options.timeout) {
|
|
@@ -1263,7 +1485,10 @@ class StableBrowser {
|
|
|
1263
1485
|
}
|
|
1264
1486
|
while (true) {
|
|
1265
1487
|
try {
|
|
1488
|
+
const _perf_t74 = Date.now();
|
|
1489
|
+
logEvent("[simpleClickType] before: locate_element");
|
|
1266
1490
|
const result = await locate_element(this.context, elementDescription, "fill", value);
|
|
1491
|
+
logEvent(`[simpleClickType] after: locate_element took ${Date.now() - _perf_t74}ms`);
|
|
1267
1492
|
if (result?.elementNumber >= 0) {
|
|
1268
1493
|
const selectors = {
|
|
1269
1494
|
frame: result?.frame,
|
|
@@ -1273,7 +1498,10 @@ class StableBrowser {
|
|
|
1273
1498
|
},
|
|
1274
1499
|
],
|
|
1275
1500
|
};
|
|
1501
|
+
const _perf_t75 = Date.now();
|
|
1502
|
+
logEvent("[simpleClickType] before: clickType");
|
|
1276
1503
|
await this.clickType(selectors, value, false, _params, options, world);
|
|
1504
|
+
logEvent(`[simpleClickType] after: clickType took ${Date.now() - _perf_t75}ms`);
|
|
1277
1505
|
return;
|
|
1278
1506
|
}
|
|
1279
1507
|
}
|
|
@@ -1281,14 +1509,23 @@ class StableBrowser {
|
|
|
1281
1509
|
if (performance.now() - startTime > timeout) {
|
|
1282
1510
|
// throw e;
|
|
1283
1511
|
try {
|
|
1512
|
+
const _perf_t76 = Date.now();
|
|
1513
|
+
logEvent("[simpleClickType] before: _commandError");
|
|
1284
1514
|
await _commandError(state, "timeout looking for " + elementDescription, this);
|
|
1515
|
+
logEvent(`[simpleClickType] after: _commandError took ${Date.now() - _perf_t76}ms`);
|
|
1285
1516
|
}
|
|
1286
1517
|
finally {
|
|
1518
|
+
const _perf_t77 = Date.now();
|
|
1519
|
+
logEvent("[simpleClickType] before: _commandFinally");
|
|
1287
1520
|
await _commandFinally(state, this);
|
|
1521
|
+
logEvent(`[simpleClickType] after: _commandFinally took ${Date.now() - _perf_t77}ms`);
|
|
1288
1522
|
}
|
|
1289
1523
|
}
|
|
1290
1524
|
}
|
|
1525
|
+
const _perf_t78 = Date.now();
|
|
1526
|
+
logEvent("[simpleClickType] before: new Promise");
|
|
1291
1527
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
1528
|
+
logEvent(`[simpleClickType] after: new Promise took ${Date.now() - _perf_t78}ms`);
|
|
1292
1529
|
}
|
|
1293
1530
|
}
|
|
1294
1531
|
async click(selectors, _params, options = {}, world = null) {
|
|
@@ -1312,22 +1549,37 @@ class StableBrowser {
|
|
|
1312
1549
|
}
|
|
1313
1550
|
try {
|
|
1314
1551
|
check_performance("click_preCommand", this.context, true);
|
|
1552
|
+
const _perf_t79 = Date.now();
|
|
1553
|
+
logEvent("[click] before: _preCommand");
|
|
1315
1554
|
await _preCommand(state, this);
|
|
1555
|
+
logEvent(`[click] after: _preCommand took ${Date.now() - _perf_t79}ms`);
|
|
1316
1556
|
check_performance("click_preCommand", this.context, false);
|
|
1557
|
+
const _perf_t80 = Date.now();
|
|
1558
|
+
logEvent("[click] before: performAction");
|
|
1317
1559
|
await performAction("click", state.element, options, this, state, _params);
|
|
1560
|
+
logEvent(`[click] after: performAction took ${Date.now() - _perf_t80}ms`);
|
|
1318
1561
|
if (!this.fastMode && !this.stepTags.includes("fast-mode")) {
|
|
1319
1562
|
check_performance("click_waitForPageLoad", this.context, true);
|
|
1563
|
+
const _perf_t81 = Date.now();
|
|
1564
|
+
logEvent("[click] before: waitForPageLoad");
|
|
1320
1565
|
await this.waitForPageLoad({ noSleep: true });
|
|
1566
|
+
logEvent(`[click] after: waitForPageLoad took ${Date.now() - _perf_t81}ms`);
|
|
1321
1567
|
check_performance("click_waitForPageLoad", this.context, false);
|
|
1322
1568
|
}
|
|
1323
1569
|
return state.info;
|
|
1324
1570
|
}
|
|
1325
1571
|
catch (e) {
|
|
1572
|
+
const _perf_t82 = Date.now();
|
|
1573
|
+
logEvent("[click] before: _commandError");
|
|
1326
1574
|
await _commandError(state, e, this);
|
|
1575
|
+
logEvent(`[click] after: _commandError took ${Date.now() - _perf_t82}ms`);
|
|
1327
1576
|
}
|
|
1328
1577
|
finally {
|
|
1329
1578
|
check_performance("click_commandFinally", this.context, true);
|
|
1579
|
+
const _perf_t83 = Date.now();
|
|
1580
|
+
logEvent("[click] before: _commandFinally");
|
|
1330
1581
|
await _commandFinally(state, this);
|
|
1582
|
+
logEvent(`[click] after: _commandFinally took ${Date.now() - _perf_t83}ms`);
|
|
1331
1583
|
check_performance("click_commandFinally", this.context, false);
|
|
1332
1584
|
check_performance("click_all ***", this.context, false);
|
|
1333
1585
|
if (this.context.profile) {
|
|
@@ -1350,11 +1602,17 @@ class StableBrowser {
|
|
|
1350
1602
|
};
|
|
1351
1603
|
let found = false;
|
|
1352
1604
|
try {
|
|
1605
|
+
const _perf_t84 = Date.now();
|
|
1606
|
+
logEvent("[waitForElement] before: _preCommand");
|
|
1353
1607
|
await _preCommand(state, this);
|
|
1608
|
+
logEvent(`[waitForElement] after: _preCommand took ${Date.now() - _perf_t84}ms`);
|
|
1354
1609
|
// if (state.options && state.options.context) {
|
|
1355
1610
|
// state.selectors.locators[0].text = state.options.context;
|
|
1356
1611
|
// }
|
|
1612
|
+
const _perf_t85 = Date.now();
|
|
1613
|
+
logEvent("[waitForElement] before: state.element.waitFor");
|
|
1357
1614
|
await state.element.waitFor({ timeout: timeout });
|
|
1615
|
+
logEvent(`[waitForElement] after: state.element.waitFor took ${Date.now() - _perf_t85}ms`);
|
|
1358
1616
|
found = true;
|
|
1359
1617
|
// await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1360
1618
|
}
|
|
@@ -1363,7 +1621,10 @@ class StableBrowser {
|
|
|
1363
1621
|
// await _commandError(state, e, this);
|
|
1364
1622
|
}
|
|
1365
1623
|
finally {
|
|
1624
|
+
const _perf_t86 = Date.now();
|
|
1625
|
+
logEvent("[waitForElement] before: _commandFinally");
|
|
1366
1626
|
await _commandFinally(state, this);
|
|
1627
|
+
logEvent(`[waitForElement] after: _commandFinally took ${Date.now() - _perf_t86}ms`);
|
|
1367
1628
|
}
|
|
1368
1629
|
return found;
|
|
1369
1630
|
}
|
|
@@ -1380,16 +1641,28 @@ class StableBrowser {
|
|
|
1380
1641
|
log: "***** check " + selectors.element_name + " *****\n",
|
|
1381
1642
|
};
|
|
1382
1643
|
try {
|
|
1644
|
+
const _perf_t87 = Date.now();
|
|
1645
|
+
logEvent("[setCheck] before: _preCommand");
|
|
1383
1646
|
await _preCommand(state, this);
|
|
1647
|
+
logEvent(`[setCheck] after: _preCommand took ${Date.now() - _perf_t87}ms`);
|
|
1384
1648
|
state.info.checked = checked;
|
|
1385
1649
|
// let element = await this._locate(selectors, info, _params);
|
|
1386
1650
|
// ({ screenshotId, screenshotPath } = await this._screenShot(options, world, info));
|
|
1387
1651
|
try {
|
|
1388
1652
|
// if (world && world.screenshot && !world.screenshotPath) {
|
|
1389
1653
|
// console.log(`Highlighting while running from recorder`);
|
|
1654
|
+
const _perf_t88 = Date.now();
|
|
1655
|
+
logEvent("[setCheck] before: _highlightElements");
|
|
1390
1656
|
await this._highlightElements(state.element);
|
|
1657
|
+
logEvent(`[setCheck] after: _highlightElements took ${Date.now() - _perf_t88}ms`);
|
|
1658
|
+
const _perf_t89 = Date.now();
|
|
1659
|
+
logEvent("[setCheck] before: state.element.setChecked");
|
|
1391
1660
|
await state.element.setChecked(checked, { timeout: 2000 });
|
|
1661
|
+
logEvent(`[setCheck] after: state.element.setChecked took ${Date.now() - _perf_t89}ms`);
|
|
1662
|
+
const _perf_t90 = Date.now();
|
|
1663
|
+
logEvent("[setCheck] before: new Promise");
|
|
1392
1664
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1665
|
+
logEvent(`[setCheck] after: new Promise took ${Date.now() - _perf_t90}ms`);
|
|
1393
1666
|
// await this._unHighlightElements(element);
|
|
1394
1667
|
// }
|
|
1395
1668
|
// await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
@@ -1400,12 +1673,18 @@ class StableBrowser {
|
|
|
1400
1673
|
this.logger.info("element did not change its state, ignoring...");
|
|
1401
1674
|
}
|
|
1402
1675
|
else {
|
|
1676
|
+
const _perf_t91 = Date.now();
|
|
1677
|
+
logEvent("[setCheck] before: new Promise");
|
|
1403
1678
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1679
|
+
logEvent(`[setCheck] after: new Promise took ${Date.now() - _perf_t91}ms`);
|
|
1404
1680
|
//await this.closeUnexpectedPopups();
|
|
1405
1681
|
state.info.log += "setCheck failed, will try again" + "\n";
|
|
1406
1682
|
state.element_found = false;
|
|
1407
1683
|
try {
|
|
1684
|
+
const _perf_t92 = Date.now();
|
|
1685
|
+
logEvent("[setCheck] before: _locate");
|
|
1408
1686
|
state.element = await this._locate(selectors, state.info, _params, 100);
|
|
1687
|
+
logEvent(`[setCheck] after: _locate took ${Date.now() - _perf_t92}ms`);
|
|
1409
1688
|
state.element_found = true;
|
|
1410
1689
|
// check the check state
|
|
1411
1690
|
}
|
|
@@ -1413,10 +1692,16 @@ class StableBrowser {
|
|
|
1413
1692
|
// element dismissed
|
|
1414
1693
|
}
|
|
1415
1694
|
if (state.element_found) {
|
|
1695
|
+
const _perf_t93 = Date.now();
|
|
1696
|
+
logEvent("[setCheck] before: state.element.isChecked");
|
|
1416
1697
|
const isChecked = await state.element.isChecked();
|
|
1698
|
+
logEvent(`[setCheck] after: state.element.isChecked took ${Date.now() - _perf_t93}ms`);
|
|
1417
1699
|
if (isChecked !== checked) {
|
|
1418
1700
|
// perform click
|
|
1701
|
+
const _perf_t94 = Date.now();
|
|
1702
|
+
logEvent("[setCheck] before: state.element.click");
|
|
1419
1703
|
await state.element.click({ timeout: 2000, force: true });
|
|
1704
|
+
logEvent(`[setCheck] after: state.element.click took ${Date.now() - _perf_t94}ms`);
|
|
1420
1705
|
}
|
|
1421
1706
|
else {
|
|
1422
1707
|
this.logger.info(`Element ${selectors.element_name} is already in the desired state (${checked})`);
|
|
@@ -1428,10 +1713,16 @@ class StableBrowser {
|
|
|
1428
1713
|
return state.info;
|
|
1429
1714
|
}
|
|
1430
1715
|
catch (e) {
|
|
1716
|
+
const _perf_t95 = Date.now();
|
|
1717
|
+
logEvent("[setCheck] before: _commandError");
|
|
1431
1718
|
await _commandError(state, e, this);
|
|
1719
|
+
logEvent(`[setCheck] after: _commandError took ${Date.now() - _perf_t95}ms`);
|
|
1432
1720
|
}
|
|
1433
1721
|
finally {
|
|
1722
|
+
const _perf_t96 = Date.now();
|
|
1723
|
+
logEvent("[setCheck] before: _commandFinally");
|
|
1434
1724
|
await _commandFinally(state, this);
|
|
1725
|
+
logEvent(`[setCheck] after: _commandFinally took ${Date.now() - _perf_t96}ms`);
|
|
1435
1726
|
}
|
|
1436
1727
|
}
|
|
1437
1728
|
async hover(selectors, _params, options = {}, world = null) {
|
|
@@ -1447,17 +1738,32 @@ class StableBrowser {
|
|
|
1447
1738
|
log: "***** hover " + selectors.element_name + " *****\n",
|
|
1448
1739
|
};
|
|
1449
1740
|
try {
|
|
1741
|
+
const _perf_t97 = Date.now();
|
|
1742
|
+
logEvent("[hover] before: _preCommand");
|
|
1450
1743
|
await _preCommand(state, this);
|
|
1744
|
+
logEvent(`[hover] after: _preCommand took ${Date.now() - _perf_t97}ms`);
|
|
1745
|
+
const _perf_t98 = Date.now();
|
|
1746
|
+
logEvent("[hover] before: performAction");
|
|
1451
1747
|
await performAction("hover", state.element, options, this, state, _params);
|
|
1748
|
+
logEvent(`[hover] after: performAction took ${Date.now() - _perf_t98}ms`);
|
|
1749
|
+
const _perf_t99 = Date.now();
|
|
1750
|
+
logEvent("[hover] before: _screenshot");
|
|
1452
1751
|
await _screenshot(state, this);
|
|
1752
|
+
logEvent(`[hover] after: _screenshot took ${Date.now() - _perf_t99}ms`);
|
|
1453
1753
|
//await this.waitForPageLoad();
|
|
1454
1754
|
return state.info;
|
|
1455
1755
|
}
|
|
1456
1756
|
catch (e) {
|
|
1757
|
+
const _perf_t100 = Date.now();
|
|
1758
|
+
logEvent("[hover] before: _commandError");
|
|
1457
1759
|
await _commandError(state, e, this);
|
|
1760
|
+
logEvent(`[hover] after: _commandError took ${Date.now() - _perf_t100}ms`);
|
|
1458
1761
|
}
|
|
1459
1762
|
finally {
|
|
1763
|
+
const _perf_t101 = Date.now();
|
|
1764
|
+
logEvent("[hover] before: _commandFinally");
|
|
1460
1765
|
await _commandFinally(state, this);
|
|
1766
|
+
logEvent(`[hover] after: _commandFinally took ${Date.now() - _perf_t101}ms`);
|
|
1461
1767
|
}
|
|
1462
1768
|
}
|
|
1463
1769
|
async selectOption(selectors, values, _params = null, options = {}, world = null) {
|
|
@@ -1478,23 +1784,38 @@ class StableBrowser {
|
|
|
1478
1784
|
log: "***** select option " + selectors.element_name + " *****\n",
|
|
1479
1785
|
};
|
|
1480
1786
|
try {
|
|
1787
|
+
const _perf_t102 = Date.now();
|
|
1788
|
+
logEvent("[selectOption] before: _preCommand");
|
|
1481
1789
|
await _preCommand(state, this);
|
|
1790
|
+
logEvent(`[selectOption] after: _preCommand took ${Date.now() - _perf_t102}ms`);
|
|
1482
1791
|
try {
|
|
1792
|
+
const _perf_t103 = Date.now();
|
|
1793
|
+
logEvent("[selectOption] before: state.element.selectOption");
|
|
1483
1794
|
await state.element.selectOption(values);
|
|
1795
|
+
logEvent(`[selectOption] after: state.element.selectOption took ${Date.now() - _perf_t103}ms`);
|
|
1484
1796
|
}
|
|
1485
1797
|
catch (e) {
|
|
1486
1798
|
//await this.closeUnexpectedPopups();
|
|
1487
1799
|
state.info.log += "selectOption failed, will try force" + "\n";
|
|
1800
|
+
const _perf_t104 = Date.now();
|
|
1801
|
+
logEvent("[selectOption] before: state.element.selectOption");
|
|
1488
1802
|
await state.element.selectOption(values, { timeout: 10000, force: true });
|
|
1803
|
+
logEvent(`[selectOption] after: state.element.selectOption took ${Date.now() - _perf_t104}ms`);
|
|
1489
1804
|
}
|
|
1490
1805
|
//await this.waitForPageLoad();
|
|
1491
1806
|
return state.info;
|
|
1492
1807
|
}
|
|
1493
1808
|
catch (e) {
|
|
1809
|
+
const _perf_t105 = Date.now();
|
|
1810
|
+
logEvent("[selectOption] before: _commandError");
|
|
1494
1811
|
await _commandError(state, e, this);
|
|
1812
|
+
logEvent(`[selectOption] after: _commandError took ${Date.now() - _perf_t105}ms`);
|
|
1495
1813
|
}
|
|
1496
1814
|
finally {
|
|
1815
|
+
const _perf_t106 = Date.now();
|
|
1816
|
+
logEvent("[selectOption] before: _commandFinally");
|
|
1497
1817
|
await _commandFinally(state, this);
|
|
1818
|
+
logEvent(`[selectOption] after: _commandFinally took ${Date.now() - _perf_t106}ms`);
|
|
1498
1819
|
}
|
|
1499
1820
|
}
|
|
1500
1821
|
async type(_value, _params = null, options = {}, world = null) {
|
|
@@ -1513,14 +1834,23 @@ class StableBrowser {
|
|
|
1513
1834
|
log: "",
|
|
1514
1835
|
};
|
|
1515
1836
|
try {
|
|
1837
|
+
const _perf_t107 = Date.now();
|
|
1838
|
+
logEvent("[type] before: _preCommand");
|
|
1516
1839
|
await _preCommand(state, this);
|
|
1840
|
+
logEvent(`[type] after: _preCommand took ${Date.now() - _perf_t107}ms`);
|
|
1517
1841
|
const valueSegment = state.value.split("&&");
|
|
1518
1842
|
for (let i = 0; i < valueSegment.length; i++) {
|
|
1519
1843
|
if (i > 0) {
|
|
1844
|
+
const _perf_t108 = Date.now();
|
|
1845
|
+
logEvent("[type] before: new Promise");
|
|
1520
1846
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
1847
|
+
logEvent(`[type] after: new Promise took ${Date.now() - _perf_t108}ms`);
|
|
1521
1848
|
}
|
|
1522
1849
|
let value = valueSegment[i];
|
|
1850
|
+
const _perf_t109 = Date.now();
|
|
1851
|
+
logEvent("[type] before: _replaceWithLocalData");
|
|
1523
1852
|
value = await this._replaceWithLocalData(value, this);
|
|
1853
|
+
logEvent(`[type] after: _replaceWithLocalData took ${Date.now() - _perf_t109}ms`);
|
|
1524
1854
|
let keyEvent = false;
|
|
1525
1855
|
KEYBOARD_EVENTS.forEach((event) => {
|
|
1526
1856
|
if (value === event || value.startsWith(event + "+")) {
|
|
@@ -1528,19 +1858,31 @@ class StableBrowser {
|
|
|
1528
1858
|
}
|
|
1529
1859
|
});
|
|
1530
1860
|
if (keyEvent) {
|
|
1861
|
+
const _perf_t110 = Date.now();
|
|
1862
|
+
logEvent("[type] before: page.keyboard.press");
|
|
1531
1863
|
await this.page.keyboard.press(value);
|
|
1864
|
+
logEvent(`[type] after: page.keyboard.press took ${Date.now() - _perf_t110}ms`);
|
|
1532
1865
|
}
|
|
1533
1866
|
else {
|
|
1867
|
+
const _perf_t111 = Date.now();
|
|
1868
|
+
logEvent("[type] before: page.keyboard.type");
|
|
1534
1869
|
await this.page.keyboard.type(value);
|
|
1870
|
+
logEvent(`[type] after: page.keyboard.type took ${Date.now() - _perf_t111}ms`);
|
|
1535
1871
|
}
|
|
1536
1872
|
}
|
|
1537
1873
|
return state.info;
|
|
1538
1874
|
}
|
|
1539
1875
|
catch (e) {
|
|
1876
|
+
const _perf_t112 = Date.now();
|
|
1877
|
+
logEvent("[type] before: _commandError");
|
|
1540
1878
|
await _commandError(state, e, this);
|
|
1879
|
+
logEvent(`[type] after: _commandError took ${Date.now() - _perf_t112}ms`);
|
|
1541
1880
|
}
|
|
1542
1881
|
finally {
|
|
1882
|
+
const _perf_t113 = Date.now();
|
|
1883
|
+
logEvent("[type] before: _commandFinally");
|
|
1543
1884
|
await _commandFinally(state, this);
|
|
1885
|
+
logEvent(`[type] after: _commandFinally took ${Date.now() - _perf_t113}ms`);
|
|
1544
1886
|
}
|
|
1545
1887
|
}
|
|
1546
1888
|
async setInputValue(selectors, value, _params = null, options = {}, world = null) {
|
|
@@ -1556,27 +1898,48 @@ class StableBrowser {
|
|
|
1556
1898
|
log: "***** set input value " + selectors.element_name + " *****\n",
|
|
1557
1899
|
};
|
|
1558
1900
|
try {
|
|
1901
|
+
const _perf_t114 = Date.now();
|
|
1902
|
+
logEvent("[setInputValue] before: _preCommand");
|
|
1559
1903
|
await _preCommand(state, this);
|
|
1904
|
+
logEvent(`[setInputValue] after: _preCommand took ${Date.now() - _perf_t114}ms`);
|
|
1905
|
+
const _perf_t115 = Date.now();
|
|
1906
|
+
logEvent("[setInputValue] before: _replaceWithLocalData");
|
|
1560
1907
|
let value = await this._replaceWithLocalData(state.value, this);
|
|
1908
|
+
logEvent(`[setInputValue] after: _replaceWithLocalData took ${Date.now() - _perf_t115}ms`);
|
|
1561
1909
|
try {
|
|
1910
|
+
const _perf_t116 = Date.now();
|
|
1911
|
+
logEvent("[setInputValue] before: state.element.evaluateHandle");
|
|
1562
1912
|
await state.element.evaluateHandle((el, value) => {
|
|
1563
1913
|
el.value = value;
|
|
1564
1914
|
}, value);
|
|
1915
|
+
logEvent(`[setInputValue] after: state.element.evaluateHandle took ${Date.now() - _perf_t116}ms`);
|
|
1565
1916
|
}
|
|
1566
1917
|
catch (error) {
|
|
1567
1918
|
this.logger.error("setInputValue failed, will try again");
|
|
1919
|
+
const _perf_t117 = Date.now();
|
|
1920
|
+
logEvent("[setInputValue] before: _screenshot");
|
|
1568
1921
|
await _screenshot(state, this);
|
|
1922
|
+
logEvent(`[setInputValue] after: _screenshot took ${Date.now() - _perf_t117}ms`);
|
|
1569
1923
|
Object.assign(error, { info: state.info });
|
|
1924
|
+
const _perf_t118 = Date.now();
|
|
1925
|
+
logEvent("[setInputValue] before: state.element.evaluateHandle");
|
|
1570
1926
|
await state.element.evaluateHandle((el, value) => {
|
|
1571
1927
|
el.value = value;
|
|
1572
1928
|
});
|
|
1929
|
+
logEvent(`[setInputValue] after: state.element.evaluateHandle took ${Date.now() - _perf_t118}ms`);
|
|
1573
1930
|
}
|
|
1574
1931
|
}
|
|
1575
1932
|
catch (e) {
|
|
1933
|
+
const _perf_t119 = Date.now();
|
|
1934
|
+
logEvent("[setInputValue] before: _commandError");
|
|
1576
1935
|
await _commandError(state, e, this);
|
|
1936
|
+
logEvent(`[setInputValue] after: _commandError took ${Date.now() - _perf_t119}ms`);
|
|
1577
1937
|
}
|
|
1578
1938
|
finally {
|
|
1939
|
+
const _perf_t120 = Date.now();
|
|
1940
|
+
logEvent("[setInputValue] before: _commandFinally");
|
|
1579
1941
|
await _commandFinally(state, this);
|
|
1942
|
+
logEvent(`[setInputValue] after: _commandFinally took ${Date.now() - _perf_t120}ms`);
|
|
1580
1943
|
}
|
|
1581
1944
|
}
|
|
1582
1945
|
async setDateTime(selectors, value, format = null, enter = false, _params = null, options = {}, world = null) {
|
|
@@ -1594,63 +1957,126 @@ class StableBrowser {
|
|
|
1594
1957
|
// throwError: false,
|
|
1595
1958
|
};
|
|
1596
1959
|
try {
|
|
1960
|
+
const _perf_t121 = Date.now();
|
|
1961
|
+
logEvent("[setDateTime] before: _preCommand");
|
|
1597
1962
|
await _preCommand(state, this);
|
|
1963
|
+
logEvent(`[setDateTime] after: _preCommand took ${Date.now() - _perf_t121}ms`);
|
|
1598
1964
|
try {
|
|
1965
|
+
const _perf_t122 = Date.now();
|
|
1966
|
+
logEvent("[setDateTime] before: performAction");
|
|
1599
1967
|
await performAction("click", state.element, options, this, state, _params);
|
|
1968
|
+
logEvent(`[setDateTime] after: performAction took ${Date.now() - _perf_t122}ms`);
|
|
1969
|
+
const _perf_t123 = Date.now();
|
|
1970
|
+
logEvent("[setDateTime] before: new Promise");
|
|
1600
1971
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
1972
|
+
logEvent(`[setDateTime] after: new Promise took ${Date.now() - _perf_t123}ms`);
|
|
1601
1973
|
if (format) {
|
|
1602
1974
|
state.value = dayjs(state.value).format(format);
|
|
1975
|
+
const _perf_t124 = Date.now();
|
|
1976
|
+
logEvent("[setDateTime] before: state.element.fill");
|
|
1603
1977
|
await state.element.fill(state.value);
|
|
1978
|
+
logEvent(`[setDateTime] after: state.element.fill took ${Date.now() - _perf_t124}ms`);
|
|
1604
1979
|
}
|
|
1605
1980
|
else {
|
|
1981
|
+
const _perf_t125 = Date.now();
|
|
1982
|
+
logEvent("[setDateTime] before: getDateTimeValue");
|
|
1606
1983
|
const dateTimeValue = await getDateTimeValue({ value: state.value, element: state.element });
|
|
1984
|
+
logEvent(`[setDateTime] after: getDateTimeValue took ${Date.now() - _perf_t125}ms`);
|
|
1985
|
+
const _perf_t126 = Date.now();
|
|
1986
|
+
logEvent("[setDateTime] before: state.element.evaluateHandle");
|
|
1607
1987
|
await state.element.evaluateHandle((el, dateTimeValue) => {
|
|
1608
1988
|
el.value = ""; // clear input
|
|
1609
1989
|
el.value = dateTimeValue;
|
|
1610
1990
|
}, dateTimeValue);
|
|
1991
|
+
logEvent(`[setDateTime] after: state.element.evaluateHandle took ${Date.now() - _perf_t126}ms`);
|
|
1611
1992
|
}
|
|
1612
1993
|
if (enter) {
|
|
1994
|
+
const _perf_t127 = Date.now();
|
|
1995
|
+
logEvent("[setDateTime] before: new Promise");
|
|
1613
1996
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
1997
|
+
logEvent(`[setDateTime] after: new Promise took ${Date.now() - _perf_t127}ms`);
|
|
1998
|
+
const _perf_t128 = Date.now();
|
|
1999
|
+
logEvent("[setDateTime] before: page.keyboard.press");
|
|
1614
2000
|
await this.page.keyboard.press("Enter");
|
|
2001
|
+
logEvent(`[setDateTime] after: page.keyboard.press took ${Date.now() - _perf_t128}ms`);
|
|
2002
|
+
const _perf_t129 = Date.now();
|
|
2003
|
+
logEvent("[setDateTime] before: waitForPageLoad");
|
|
1615
2004
|
await this.waitForPageLoad();
|
|
2005
|
+
logEvent(`[setDateTime] after: waitForPageLoad took ${Date.now() - _perf_t129}ms`);
|
|
1616
2006
|
}
|
|
1617
2007
|
}
|
|
1618
2008
|
catch (err) {
|
|
1619
2009
|
//await this.closeUnexpectedPopups();
|
|
1620
2010
|
this.logger.error("setting date time input failed " + JSON.stringify(state.info));
|
|
1621
2011
|
this.logger.info("Trying again");
|
|
2012
|
+
const _perf_t130 = Date.now();
|
|
2013
|
+
logEvent("[setDateTime] before: _screenshot");
|
|
1622
2014
|
await _screenshot(state, this);
|
|
2015
|
+
logEvent(`[setDateTime] after: _screenshot took ${Date.now() - _perf_t130}ms`);
|
|
1623
2016
|
Object.assign(err, { info: state.info });
|
|
2017
|
+
const _perf_t131 = Date.now();
|
|
2018
|
+
logEvent("[setDateTime] before: element.click");
|
|
1624
2019
|
await element.click();
|
|
2020
|
+
logEvent(`[setDateTime] after: element.click took ${Date.now() - _perf_t131}ms`);
|
|
2021
|
+
const _perf_t132 = Date.now();
|
|
2022
|
+
logEvent("[setDateTime] before: new Promise");
|
|
1625
2023
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
2024
|
+
logEvent(`[setDateTime] after: new Promise took ${Date.now() - _perf_t132}ms`);
|
|
1626
2025
|
if (format) {
|
|
1627
2026
|
state.value = dayjs(state.value).format(format);
|
|
2027
|
+
const _perf_t133 = Date.now();
|
|
2028
|
+
logEvent("[setDateTime] before: state.element.fill");
|
|
1628
2029
|
await state.element.fill(state.value);
|
|
2030
|
+
logEvent(`[setDateTime] after: state.element.fill took ${Date.now() - _perf_t133}ms`);
|
|
1629
2031
|
}
|
|
1630
2032
|
else {
|
|
2033
|
+
const _perf_t134 = Date.now();
|
|
2034
|
+
logEvent("[setDateTime] before: getDateTimeValue");
|
|
1631
2035
|
const dateTimeValue = await getDateTimeValue({ value: state.value, element: state.element });
|
|
2036
|
+
logEvent(`[setDateTime] after: getDateTimeValue took ${Date.now() - _perf_t134}ms`);
|
|
2037
|
+
const _perf_t135 = Date.now();
|
|
2038
|
+
logEvent("[setDateTime] before: state.element.evaluateHandle");
|
|
1632
2039
|
await state.element.evaluateHandle((el, dateTimeValue) => {
|
|
1633
2040
|
el.value = ""; // clear input
|
|
1634
2041
|
el.value = dateTimeValue;
|
|
1635
2042
|
}, dateTimeValue);
|
|
2043
|
+
logEvent(`[setDateTime] after: state.element.evaluateHandle took ${Date.now() - _perf_t135}ms`);
|
|
1636
2044
|
}
|
|
1637
2045
|
if (enter) {
|
|
2046
|
+
const _perf_t136 = Date.now();
|
|
2047
|
+
logEvent("[setDateTime] before: new Promise");
|
|
1638
2048
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
2049
|
+
logEvent(`[setDateTime] after: new Promise took ${Date.now() - _perf_t136}ms`);
|
|
2050
|
+
const _perf_t137 = Date.now();
|
|
2051
|
+
logEvent("[setDateTime] before: page.keyboard.press");
|
|
1639
2052
|
await this.page.keyboard.press("Enter");
|
|
2053
|
+
logEvent(`[setDateTime] after: page.keyboard.press took ${Date.now() - _perf_t137}ms`);
|
|
2054
|
+
const _perf_t138 = Date.now();
|
|
2055
|
+
logEvent("[setDateTime] before: waitForPageLoad");
|
|
1640
2056
|
await this.waitForPageLoad();
|
|
2057
|
+
logEvent(`[setDateTime] after: waitForPageLoad took ${Date.now() - _perf_t138}ms`);
|
|
1641
2058
|
}
|
|
1642
2059
|
}
|
|
1643
2060
|
}
|
|
1644
2061
|
catch (e) {
|
|
2062
|
+
const _perf_t139 = Date.now();
|
|
2063
|
+
logEvent("[setDateTime] before: _commandError");
|
|
1645
2064
|
await _commandError(state, e, this);
|
|
2065
|
+
logEvent(`[setDateTime] after: _commandError took ${Date.now() - _perf_t139}ms`);
|
|
1646
2066
|
}
|
|
1647
2067
|
finally {
|
|
2068
|
+
const _perf_t140 = Date.now();
|
|
2069
|
+
logEvent("[setDateTime] before: _commandFinally");
|
|
1648
2070
|
await _commandFinally(state, this);
|
|
2071
|
+
logEvent(`[setDateTime] after: _commandFinally took ${Date.now() - _perf_t140}ms`);
|
|
1649
2072
|
}
|
|
1650
2073
|
}
|
|
1651
2074
|
async clickType(selectors, _value, enter = false, _params = null, options = {}, world = null) {
|
|
1652
2075
|
_value = unEscapeString(_value);
|
|
2076
|
+
const _perf_t141 = Date.now();
|
|
2077
|
+
logEvent("[clickType] before: _replaceWithLocalData");
|
|
1653
2078
|
const newValue = await this._replaceWithLocalData(_value, world);
|
|
2079
|
+
logEvent(`[clickType] after: _replaceWithLocalData took ${Date.now() - _perf_t141}ms`);
|
|
1654
2080
|
const state = {
|
|
1655
2081
|
selectors,
|
|
1656
2082
|
_params,
|
|
@@ -1672,21 +2098,33 @@ class StableBrowser {
|
|
|
1672
2098
|
_value = newValue;
|
|
1673
2099
|
}
|
|
1674
2100
|
try {
|
|
2101
|
+
const _perf_t142 = Date.now();
|
|
2102
|
+
logEvent("[clickType] before: _preCommand");
|
|
1675
2103
|
await _preCommand(state, this);
|
|
2104
|
+
logEvent(`[clickType] after: _preCommand took ${Date.now() - _perf_t142}ms`);
|
|
1676
2105
|
const randomToken = "blinq_" + Math.random().toString(36).substring(7);
|
|
1677
2106
|
// tag the element
|
|
2107
|
+
const _perf_t143 = Date.now();
|
|
2108
|
+
logEvent("[clickType] before: state.element.evaluate");
|
|
1678
2109
|
let newElementSelector = await state.element.evaluate((el, token) => {
|
|
1679
2110
|
// use attribute and not id
|
|
1680
2111
|
const attrName = `data-blinq-id-${token}`;
|
|
1681
2112
|
el.setAttribute(attrName, "");
|
|
1682
2113
|
return `[${attrName}]`;
|
|
1683
2114
|
}, randomToken);
|
|
2115
|
+
logEvent(`[clickType] after: state.element.evaluate took ${Date.now() - _perf_t143}ms`);
|
|
1684
2116
|
state.info.value = _value;
|
|
1685
2117
|
if (!options.press) {
|
|
1686
2118
|
try {
|
|
2119
|
+
const _perf_t144 = Date.now();
|
|
2120
|
+
logEvent("[clickType] before: state.element.inputValue");
|
|
1687
2121
|
let currentValue = await state.element.inputValue();
|
|
2122
|
+
logEvent(`[clickType] after: state.element.inputValue took ${Date.now() - _perf_t144}ms`);
|
|
1688
2123
|
if (currentValue) {
|
|
2124
|
+
const _perf_t145 = Date.now();
|
|
2125
|
+
logEvent("[clickType] before: state.element.fill");
|
|
1689
2126
|
await state.element.fill("");
|
|
2127
|
+
logEvent(`[clickType] after: state.element.fill took ${Date.now() - _perf_t145}ms`);
|
|
1690
2128
|
}
|
|
1691
2129
|
}
|
|
1692
2130
|
catch (e) {
|
|
@@ -1695,19 +2133,34 @@ class StableBrowser {
|
|
|
1695
2133
|
}
|
|
1696
2134
|
if (options.press) {
|
|
1697
2135
|
options.timeout = 5000;
|
|
2136
|
+
const _perf_t146 = Date.now();
|
|
2137
|
+
logEvent("[clickType] before: performAction");
|
|
1698
2138
|
await performAction("click", state.element, options, this, state, _params);
|
|
2139
|
+
logEvent(`[clickType] after: performAction took ${Date.now() - _perf_t146}ms`);
|
|
1699
2140
|
}
|
|
1700
2141
|
else {
|
|
1701
2142
|
try {
|
|
2143
|
+
const _perf_t147 = Date.now();
|
|
2144
|
+
logEvent("[clickType] before: state.element.focus");
|
|
1702
2145
|
await state.element.focus();
|
|
2146
|
+
logEvent(`[clickType] after: state.element.focus took ${Date.now() - _perf_t147}ms`);
|
|
1703
2147
|
}
|
|
1704
2148
|
catch (e) {
|
|
2149
|
+
const _perf_t148 = Date.now();
|
|
2150
|
+
logEvent("[clickType] before: state.element.dispatchEvent");
|
|
1705
2151
|
await state.element.dispatchEvent("focus");
|
|
2152
|
+
logEvent(`[clickType] after: state.element.dispatchEvent took ${Date.now() - _perf_t148}ms`);
|
|
1706
2153
|
}
|
|
1707
2154
|
}
|
|
2155
|
+
const _perf_t149 = Date.now();
|
|
2156
|
+
logEvent("[clickType] before: new Promise");
|
|
1708
2157
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
2158
|
+
logEvent(`[clickType] after: new Promise took ${Date.now() - _perf_t149}ms`);
|
|
1709
2159
|
// check if the element exist after the click (no wait)
|
|
2160
|
+
const _perf_t150 = Date.now();
|
|
2161
|
+
logEvent("[clickType] before: state.element.count");
|
|
1710
2162
|
const count = await state.element.count({ timeout: 0 });
|
|
2163
|
+
logEvent(`[clickType] after: state.element.count took ${Date.now() - _perf_t150}ms`);
|
|
1711
2164
|
if (count === 0) {
|
|
1712
2165
|
// the locator changed after the click (placeholder) we need to locate the element using the data-blinq-id
|
|
1713
2166
|
const scope = state.element._frame ?? element.page();
|
|
@@ -1728,7 +2181,10 @@ class StableBrowser {
|
|
|
1728
2181
|
const valueSegment = state.value.split("&&");
|
|
1729
2182
|
for (let i = 0; i < valueSegment.length; i++) {
|
|
1730
2183
|
if (i > 0) {
|
|
2184
|
+
const _perf_t151 = Date.now();
|
|
2185
|
+
logEvent("[clickType] before: new Promise");
|
|
1731
2186
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
2187
|
+
logEvent(`[clickType] after: new Promise took ${Date.now() - _perf_t151}ms`);
|
|
1732
2188
|
}
|
|
1733
2189
|
let value = valueSegment[i];
|
|
1734
2190
|
let keyEvent = false;
|
|
@@ -1738,24 +2194,48 @@ class StableBrowser {
|
|
|
1738
2194
|
}
|
|
1739
2195
|
});
|
|
1740
2196
|
if (keyEvent) {
|
|
2197
|
+
const _perf_t152 = Date.now();
|
|
2198
|
+
logEvent("[clickType] before: page.keyboard.press");
|
|
1741
2199
|
await this.page.keyboard.press(value);
|
|
2200
|
+
logEvent(`[clickType] after: page.keyboard.press took ${Date.now() - _perf_t152}ms`);
|
|
1742
2201
|
}
|
|
1743
2202
|
else {
|
|
2203
|
+
const _perf_t153 = Date.now();
|
|
2204
|
+
logEvent("[clickType] before: page.keyboard.type");
|
|
1744
2205
|
await this.page.keyboard.type(value);
|
|
2206
|
+
logEvent(`[clickType] after: page.keyboard.type took ${Date.now() - _perf_t153}ms`);
|
|
2207
|
+
const _perf_t154 = Date.now();
|
|
2208
|
+
logEvent("[clickType] before: new Promise");
|
|
1745
2209
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
2210
|
+
logEvent(`[clickType] after: new Promise took ${Date.now() - _perf_t154}ms`);
|
|
1746
2211
|
}
|
|
1747
2212
|
}
|
|
1748
2213
|
//if (!this.fastMode) {
|
|
2214
|
+
const _perf_t155 = Date.now();
|
|
2215
|
+
logEvent("[clickType] before: _screenshot");
|
|
1749
2216
|
await _screenshot(state, this);
|
|
2217
|
+
logEvent(`[clickType] after: _screenshot took ${Date.now() - _perf_t155}ms`);
|
|
1750
2218
|
//}
|
|
1751
2219
|
if (enter === true) {
|
|
2220
|
+
const _perf_t156 = Date.now();
|
|
2221
|
+
logEvent("[clickType] before: new Promise");
|
|
1752
2222
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
2223
|
+
logEvent(`[clickType] after: new Promise took ${Date.now() - _perf_t156}ms`);
|
|
2224
|
+
const _perf_t157 = Date.now();
|
|
2225
|
+
logEvent("[clickType] before: page.keyboard.press");
|
|
1753
2226
|
await this.page.keyboard.press("Enter");
|
|
2227
|
+
logEvent(`[clickType] after: page.keyboard.press took ${Date.now() - _perf_t157}ms`);
|
|
2228
|
+
const _perf_t158 = Date.now();
|
|
2229
|
+
logEvent("[clickType] before: waitForPageLoad");
|
|
1754
2230
|
await this.waitForPageLoad();
|
|
2231
|
+
logEvent(`[clickType] after: waitForPageLoad took ${Date.now() - _perf_t158}ms`);
|
|
1755
2232
|
}
|
|
1756
2233
|
else if (enter === false) {
|
|
1757
2234
|
try {
|
|
2235
|
+
const _perf_t159 = Date.now();
|
|
2236
|
+
logEvent("[clickType] before: state.element.dispatchEvent");
|
|
1758
2237
|
await state.element.dispatchEvent("change", null, { timeout: 5000 });
|
|
2238
|
+
logEvent(`[clickType] after: state.element.dispatchEvent took ${Date.now() - _perf_t159}ms`);
|
|
1759
2239
|
}
|
|
1760
2240
|
catch (e) {
|
|
1761
2241
|
// ignore
|
|
@@ -1764,17 +2244,29 @@ class StableBrowser {
|
|
|
1764
2244
|
}
|
|
1765
2245
|
else {
|
|
1766
2246
|
if (enter !== "" && enter !== null && enter !== undefined) {
|
|
2247
|
+
const _perf_t160 = Date.now();
|
|
2248
|
+
logEvent("[clickType] before: page.keyboard.press");
|
|
1767
2249
|
await this.page.keyboard.press(enter);
|
|
2250
|
+
logEvent(`[clickType] after: page.keyboard.press took ${Date.now() - _perf_t160}ms`);
|
|
2251
|
+
const _perf_t161 = Date.now();
|
|
2252
|
+
logEvent("[clickType] before: waitForPageLoad");
|
|
1768
2253
|
await this.waitForPageLoad();
|
|
2254
|
+
logEvent(`[clickType] after: waitForPageLoad took ${Date.now() - _perf_t161}ms`);
|
|
1769
2255
|
}
|
|
1770
2256
|
}
|
|
1771
2257
|
return state.info;
|
|
1772
2258
|
}
|
|
1773
2259
|
catch (e) {
|
|
2260
|
+
const _perf_t162 = Date.now();
|
|
2261
|
+
logEvent("[clickType] before: _commandError");
|
|
1774
2262
|
await _commandError(state, e, this);
|
|
2263
|
+
logEvent(`[clickType] after: _commandError took ${Date.now() - _perf_t162}ms`);
|
|
1775
2264
|
}
|
|
1776
2265
|
finally {
|
|
2266
|
+
const _perf_t163 = Date.now();
|
|
2267
|
+
logEvent("[clickType] before: _commandFinally");
|
|
1777
2268
|
await _commandFinally(state, this);
|
|
2269
|
+
logEvent(`[clickType] after: _commandFinally took ${Date.now() - _perf_t163}ms`);
|
|
1778
2270
|
}
|
|
1779
2271
|
}
|
|
1780
2272
|
async fill(selectors, value, enter = false, _params = null, options = {}, world = null) {
|
|
@@ -1790,21 +2282,45 @@ class StableBrowser {
|
|
|
1790
2282
|
log: "***** fill on " + selectors.element_name + " with value " + value + "*****\n",
|
|
1791
2283
|
};
|
|
1792
2284
|
try {
|
|
2285
|
+
const _perf_t164 = Date.now();
|
|
2286
|
+
logEvent("[fill] before: _preCommand");
|
|
1793
2287
|
await _preCommand(state, this);
|
|
2288
|
+
logEvent(`[fill] after: _preCommand took ${Date.now() - _perf_t164}ms`);
|
|
2289
|
+
const _perf_t165 = Date.now();
|
|
2290
|
+
logEvent("[fill] before: state.element.fill");
|
|
1794
2291
|
await state.element.fill(value);
|
|
2292
|
+
logEvent(`[fill] after: state.element.fill took ${Date.now() - _perf_t165}ms`);
|
|
2293
|
+
const _perf_t166 = Date.now();
|
|
2294
|
+
logEvent("[fill] before: state.element.dispatchEvent");
|
|
1795
2295
|
await state.element.dispatchEvent("change");
|
|
2296
|
+
logEvent(`[fill] after: state.element.dispatchEvent took ${Date.now() - _perf_t166}ms`);
|
|
1796
2297
|
if (enter) {
|
|
2298
|
+
const _perf_t167 = Date.now();
|
|
2299
|
+
logEvent("[fill] before: new Promise");
|
|
1797
2300
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
2301
|
+
logEvent(`[fill] after: new Promise took ${Date.now() - _perf_t167}ms`);
|
|
2302
|
+
const _perf_t168 = Date.now();
|
|
2303
|
+
logEvent("[fill] before: page.keyboard.press");
|
|
1798
2304
|
await this.page.keyboard.press("Enter");
|
|
2305
|
+
logEvent(`[fill] after: page.keyboard.press took ${Date.now() - _perf_t168}ms`);
|
|
2306
|
+
const _perf_t169 = Date.now();
|
|
2307
|
+
logEvent("[fill] before: waitForPageLoad");
|
|
1799
2308
|
await this.waitForPageLoad();
|
|
2309
|
+
logEvent(`[fill] after: waitForPageLoad took ${Date.now() - _perf_t169}ms`);
|
|
1800
2310
|
}
|
|
1801
2311
|
return state.info;
|
|
1802
2312
|
}
|
|
1803
2313
|
catch (e) {
|
|
2314
|
+
const _perf_t170 = Date.now();
|
|
2315
|
+
logEvent("[fill] before: _commandError");
|
|
1804
2316
|
await _commandError(state, e, this);
|
|
2317
|
+
logEvent(`[fill] after: _commandError took ${Date.now() - _perf_t170}ms`);
|
|
1805
2318
|
}
|
|
1806
2319
|
finally {
|
|
2320
|
+
const _perf_t171 = Date.now();
|
|
2321
|
+
logEvent("[fill] before: _commandFinally");
|
|
1807
2322
|
await _commandFinally(state, this);
|
|
2323
|
+
logEvent(`[fill] after: _commandFinally took ${Date.now() - _perf_t171}ms`);
|
|
1808
2324
|
}
|
|
1809
2325
|
}
|
|
1810
2326
|
async setInputFiles(selectors, files, _params = null, options = {}, world = null) {
|
|
@@ -1823,7 +2339,10 @@ class StableBrowser {
|
|
|
1823
2339
|
};
|
|
1824
2340
|
const uploadsFolder = this.configuration.uploadsFolder ?? "data/uploads";
|
|
1825
2341
|
try {
|
|
2342
|
+
const _perf_t172 = Date.now();
|
|
2343
|
+
logEvent("[setInputFiles] before: _preCommand");
|
|
1826
2344
|
await _preCommand(state, this);
|
|
2345
|
+
logEvent(`[setInputFiles] after: _preCommand took ${Date.now() - _perf_t172}ms`);
|
|
1827
2346
|
for (let i = 0; i < files.length; i++) {
|
|
1828
2347
|
const file = files[i];
|
|
1829
2348
|
const filePath = path.join(uploadsFolder, file);
|
|
@@ -1832,18 +2351,30 @@ class StableBrowser {
|
|
|
1832
2351
|
}
|
|
1833
2352
|
state.files[i] = filePath;
|
|
1834
2353
|
}
|
|
2354
|
+
const _perf_t173 = Date.now();
|
|
2355
|
+
logEvent("[setInputFiles] before: state.element.setInputFiles");
|
|
1835
2356
|
await state.element.setInputFiles(files);
|
|
2357
|
+
logEvent(`[setInputFiles] after: state.element.setInputFiles took ${Date.now() - _perf_t173}ms`);
|
|
1836
2358
|
return state.info;
|
|
1837
2359
|
}
|
|
1838
2360
|
catch (e) {
|
|
2361
|
+
const _perf_t174 = Date.now();
|
|
2362
|
+
logEvent("[setInputFiles] before: _commandError");
|
|
1839
2363
|
await _commandError(state, e, this);
|
|
2364
|
+
logEvent(`[setInputFiles] after: _commandError took ${Date.now() - _perf_t174}ms`);
|
|
1840
2365
|
}
|
|
1841
2366
|
finally {
|
|
2367
|
+
const _perf_t175 = Date.now();
|
|
2368
|
+
logEvent("[setInputFiles] before: _commandFinally");
|
|
1842
2369
|
await _commandFinally(state, this);
|
|
2370
|
+
logEvent(`[setInputFiles] after: _commandFinally took ${Date.now() - _perf_t175}ms`);
|
|
1843
2371
|
}
|
|
1844
2372
|
}
|
|
1845
2373
|
async getText(selectors, _params = null, options = {}, info = {}, world = null) {
|
|
2374
|
+
const _perf_t176 = Date.now();
|
|
2375
|
+
logEvent("[getText] before: _getText");
|
|
1846
2376
|
return await this._getText(selectors, 0, _params, options, info, world);
|
|
2377
|
+
logEvent(`[getText] after: _getText took ${Date.now() - _perf_t176}ms`);
|
|
1847
2378
|
}
|
|
1848
2379
|
async _getText(selectors, climb, _params = null, options = {}, info = {}, world = null) {
|
|
1849
2380
|
const timeout = this._getFindElementTimeout(options);
|
|
@@ -1856,7 +2387,10 @@ class StableBrowser {
|
|
|
1856
2387
|
}
|
|
1857
2388
|
info.operation = "getText";
|
|
1858
2389
|
info.selectors = selectors;
|
|
2390
|
+
const _perf_t177 = Date.now();
|
|
2391
|
+
logEvent("[_getText] before: _locate");
|
|
1859
2392
|
let element = await this._locate(selectors, info, _params, timeout);
|
|
2393
|
+
logEvent(`[_getText] after: _locate took ${Date.now() - _perf_t177}ms`);
|
|
1860
2394
|
if (climb > 0) {
|
|
1861
2395
|
const climbArray = [];
|
|
1862
2396
|
for (let i = 0; i < climb; i++) {
|
|
@@ -1867,14 +2401,20 @@ class StableBrowser {
|
|
|
1867
2401
|
}
|
|
1868
2402
|
let value = null;
|
|
1869
2403
|
try {
|
|
2404
|
+
const _perf_t178 = Date.now();
|
|
2405
|
+
logEvent("[_getText] before: element.inputValue");
|
|
1870
2406
|
value = await element.inputValue();
|
|
2407
|
+
logEvent(`[_getText] after: element.inputValue took ${Date.now() - _perf_t178}ms`);
|
|
1871
2408
|
}
|
|
1872
2409
|
catch (e) {
|
|
1873
2410
|
//ignore
|
|
1874
2411
|
}
|
|
1875
2412
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world, info));
|
|
1876
2413
|
try {
|
|
2414
|
+
const _perf_t179 = Date.now();
|
|
2415
|
+
logEvent("[_getText] before: _highlightElements");
|
|
1877
2416
|
await this._highlightElements(element);
|
|
2417
|
+
logEvent(`[_getText] after: _highlightElements took ${Date.now() - _perf_t179}ms`);
|
|
1878
2418
|
// if (world && world.screenshot && !world.screenshotPath) {
|
|
1879
2419
|
// // console.log(`Highlighting for get text while running from recorder`);
|
|
1880
2420
|
// this._highlightElements(element)
|
|
@@ -1887,7 +2427,10 @@ class StableBrowser {
|
|
|
1887
2427
|
// })
|
|
1888
2428
|
// .catch(e);
|
|
1889
2429
|
// }
|
|
2430
|
+
const _perf_t180 = Date.now();
|
|
2431
|
+
logEvent("[_getText] before: element.innerText");
|
|
1890
2432
|
const elementText = await element.innerText();
|
|
2433
|
+
logEvent(`[_getText] after: element.innerText took ${Date.now() - _perf_t180}ms`);
|
|
1891
2434
|
return {
|
|
1892
2435
|
text: elementText,
|
|
1893
2436
|
screenshotId,
|
|
@@ -1899,7 +2442,10 @@ class StableBrowser {
|
|
|
1899
2442
|
catch (e) {
|
|
1900
2443
|
//await this.closeUnexpectedPopups();
|
|
1901
2444
|
this.logger.info("no innerText, will use textContent");
|
|
2445
|
+
const _perf_t181 = Date.now();
|
|
2446
|
+
logEvent("[_getText] before: element.textContent");
|
|
1902
2447
|
const elementText = await element.textContent();
|
|
2448
|
+
logEvent(`[_getText] after: element.textContent took ${Date.now() - _perf_t181}ms`);
|
|
1903
2449
|
return { text: elementText, screenshotId, screenshotPath, value: value };
|
|
1904
2450
|
}
|
|
1905
2451
|
}
|
|
@@ -1927,20 +2473,35 @@ class StableBrowser {
|
|
|
1927
2473
|
operation: "containsPattern",
|
|
1928
2474
|
log: "***** verify element " + selectors.element_name + " contains pattern " + pattern + " *****\n",
|
|
1929
2475
|
};
|
|
2476
|
+
const _perf_t182 = Date.now();
|
|
2477
|
+
logEvent("[containsPattern] before: _replaceWithLocalData");
|
|
1930
2478
|
const newValue = await this._replaceWithLocalData(text, world);
|
|
2479
|
+
logEvent(`[containsPattern] after: _replaceWithLocalData took ${Date.now() - _perf_t182}ms`);
|
|
1931
2480
|
if (newValue !== text) {
|
|
1932
2481
|
this.logger.info(text + "=" + newValue);
|
|
1933
2482
|
text = newValue;
|
|
1934
2483
|
}
|
|
1935
2484
|
let foundObj = null;
|
|
1936
2485
|
try {
|
|
2486
|
+
const _perf_t183 = Date.now();
|
|
2487
|
+
logEvent("[containsPattern] before: _preCommand");
|
|
1937
2488
|
await _preCommand(state, this);
|
|
2489
|
+
logEvent(`[containsPattern] after: _preCommand took ${Date.now() - _perf_t183}ms`);
|
|
1938
2490
|
state.info.pattern = pattern;
|
|
2491
|
+
const _perf_t184 = Date.now();
|
|
2492
|
+
logEvent("[containsPattern] before: _getText");
|
|
1939
2493
|
foundObj = await this._getText(selectors, 0, _params, options, state.info, world);
|
|
2494
|
+
logEvent(`[containsPattern] after: _getText took ${Date.now() - _perf_t184}ms`);
|
|
1940
2495
|
if (foundObj && foundObj.element) {
|
|
2496
|
+
const _perf_t185 = Date.now();
|
|
2497
|
+
logEvent("[containsPattern] before: scrollIfNeeded");
|
|
1941
2498
|
await this.scrollIfNeeded(foundObj.element, state.info);
|
|
2499
|
+
logEvent(`[containsPattern] after: scrollIfNeeded took ${Date.now() - _perf_t185}ms`);
|
|
1942
2500
|
}
|
|
2501
|
+
const _perf_t186 = Date.now();
|
|
2502
|
+
logEvent("[containsPattern] before: _screenshot");
|
|
1943
2503
|
await _screenshot(state, this);
|
|
2504
|
+
logEvent(`[containsPattern] after: _screenshot took ${Date.now() - _perf_t186}ms`);
|
|
1944
2505
|
let escapedText = text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
1945
2506
|
pattern = pattern.replace("{text}", escapedText);
|
|
1946
2507
|
let regex = new RegExp(pattern, "im");
|
|
@@ -1952,10 +2513,16 @@ class StableBrowser {
|
|
|
1952
2513
|
}
|
|
1953
2514
|
catch (e) {
|
|
1954
2515
|
this.logger.error("found text " + foundObj?.text + " pattern " + pattern);
|
|
2516
|
+
const _perf_t187 = Date.now();
|
|
2517
|
+
logEvent("[containsPattern] before: _commandError");
|
|
1955
2518
|
await _commandError(state, e, this);
|
|
2519
|
+
logEvent(`[containsPattern] after: _commandError took ${Date.now() - _perf_t187}ms`);
|
|
1956
2520
|
}
|
|
1957
2521
|
finally {
|
|
2522
|
+
const _perf_t188 = Date.now();
|
|
2523
|
+
logEvent("[containsPattern] before: _commandFinally");
|
|
1958
2524
|
await _commandFinally(state, this);
|
|
2525
|
+
logEvent(`[containsPattern] after: _commandFinally took ${Date.now() - _perf_t188}ms`);
|
|
1959
2526
|
}
|
|
1960
2527
|
}
|
|
1961
2528
|
async containsText(selectors, text, climb, _params = null, options = {}, world = null) {
|
|
@@ -1980,7 +2547,10 @@ class StableBrowser {
|
|
|
1980
2547
|
throw new Error("text is null");
|
|
1981
2548
|
}
|
|
1982
2549
|
text = unEscapeString(text);
|
|
2550
|
+
const _perf_t189 = Date.now();
|
|
2551
|
+
logEvent("[containsText] before: _replaceWithLocalData");
|
|
1983
2552
|
const newValue = await this._replaceWithLocalData(text, world);
|
|
2553
|
+
logEvent(`[containsText] after: _replaceWithLocalData took ${Date.now() - _perf_t189}ms`);
|
|
1984
2554
|
if (newValue !== text) {
|
|
1985
2555
|
this.logger.info(text + "=" + newValue);
|
|
1986
2556
|
text = newValue;
|
|
@@ -1989,12 +2559,24 @@ class StableBrowser {
|
|
|
1989
2559
|
try {
|
|
1990
2560
|
while (Date.now() - startTime < timeout) {
|
|
1991
2561
|
try {
|
|
2562
|
+
const _perf_t190 = Date.now();
|
|
2563
|
+
logEvent("[containsText] before: _preCommand");
|
|
1992
2564
|
await _preCommand(state, this);
|
|
2565
|
+
logEvent(`[containsText] after: _preCommand took ${Date.now() - _perf_t190}ms`);
|
|
2566
|
+
const _perf_t191 = Date.now();
|
|
2567
|
+
logEvent("[containsText] before: _getText");
|
|
1993
2568
|
foundObj = await this._getText(selectors, climb, _params, { timeout: 3000 }, state.info, world);
|
|
2569
|
+
logEvent(`[containsText] after: _getText took ${Date.now() - _perf_t191}ms`);
|
|
1994
2570
|
if (foundObj && foundObj.element) {
|
|
2571
|
+
const _perf_t192 = Date.now();
|
|
2572
|
+
logEvent("[containsText] before: scrollIfNeeded");
|
|
1995
2573
|
await this.scrollIfNeeded(foundObj.element, state.info);
|
|
2574
|
+
logEvent(`[containsText] after: scrollIfNeeded took ${Date.now() - _perf_t192}ms`);
|
|
1996
2575
|
}
|
|
2576
|
+
const _perf_t193 = Date.now();
|
|
2577
|
+
logEvent("[containsText] before: _screenshot");
|
|
1997
2578
|
await _screenshot(state, this);
|
|
2579
|
+
logEvent(`[containsText] after: _screenshot took ${Date.now() - _perf_t193}ms`);
|
|
1998
2580
|
const dateAlternatives = findDateAlternatives(text);
|
|
1999
2581
|
const numberAlternatives = findNumberAlternatives(text);
|
|
2000
2582
|
if (dateAlternatives.date) {
|
|
@@ -2021,18 +2603,27 @@ class StableBrowser {
|
|
|
2021
2603
|
// Log error but continue retrying until timeout is reached
|
|
2022
2604
|
this.logger.warn("Retrying containsText due to: " + e.message);
|
|
2023
2605
|
}
|
|
2606
|
+
const _perf_t194 = Date.now();
|
|
2607
|
+
logEvent("[containsText] before: new Promise");
|
|
2024
2608
|
await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait 1 second before retrying
|
|
2025
2609
|
}
|
|
2026
2610
|
state.info.foundText = foundObj?.text;
|
|
2611
|
+
logEvent(`[containsText] after: new Promise took ${Date.now() - _perf_t194}ms`);
|
|
2027
2612
|
state.info.value = foundObj?.value;
|
|
2028
2613
|
throw new Error("element doesn't contain text " + text);
|
|
2029
2614
|
}
|
|
2030
2615
|
catch (e) {
|
|
2616
|
+
const _perf_t195 = Date.now();
|
|
2617
|
+
logEvent("[containsText] before: _commandError");
|
|
2031
2618
|
await _commandError(state, e, this);
|
|
2619
|
+
logEvent(`[containsText] after: _commandError took ${Date.now() - _perf_t195}ms`);
|
|
2032
2620
|
throw e;
|
|
2033
2621
|
}
|
|
2034
2622
|
finally {
|
|
2623
|
+
const _perf_t196 = Date.now();
|
|
2624
|
+
logEvent("[containsText] before: _commandFinally");
|
|
2035
2625
|
await _commandFinally(state, this);
|
|
2626
|
+
logEvent(`[containsText] after: _commandFinally took ${Date.now() - _perf_t196}ms`);
|
|
2036
2627
|
}
|
|
2037
2628
|
}
|
|
2038
2629
|
async snapshotValidation(frameSelectors, referanceSnapshot, _params = null, options = {}, world = null) {
|
|
@@ -2070,8 +2661,14 @@ class StableBrowser {
|
|
|
2070
2661
|
throw new Error("referenceSnapshot file not found: " + referanceSnapshot);
|
|
2071
2662
|
}
|
|
2072
2663
|
state.text = text;
|
|
2664
|
+
const _perf_t197 = Date.now();
|
|
2665
|
+
logEvent("[snapshotValidation] before: _replaceWithLocalData");
|
|
2073
2666
|
const newValue = await this._replaceWithLocalData(text, world);
|
|
2667
|
+
logEvent(`[snapshotValidation] after: _replaceWithLocalData took ${Date.now() - _perf_t197}ms`);
|
|
2668
|
+
const _perf_t198 = Date.now();
|
|
2669
|
+
logEvent("[snapshotValidation] before: _preCommand");
|
|
2074
2670
|
await _preCommand(state, this);
|
|
2671
|
+
logEvent(`[snapshotValidation] after: _preCommand took ${Date.now() - _perf_t198}ms`);
|
|
2075
2672
|
let foundObj = null;
|
|
2076
2673
|
try {
|
|
2077
2674
|
let matchResult = null;
|
|
@@ -2082,9 +2679,15 @@ class StableBrowser {
|
|
|
2082
2679
|
scope = this.page;
|
|
2083
2680
|
}
|
|
2084
2681
|
else {
|
|
2682
|
+
const _perf_t199 = Date.now();
|
|
2683
|
+
logEvent("[snapshotValidation] before: _findFrameScope");
|
|
2085
2684
|
scope = await this._findFrameScope(frameSelectors, timeout, state.info);
|
|
2685
|
+
logEvent(`[snapshotValidation] after: _findFrameScope took ${Date.now() - _perf_t199}ms`);
|
|
2086
2686
|
}
|
|
2687
|
+
const _perf_t200 = Date.now();
|
|
2688
|
+
logEvent("[snapshotValidation] before: scope.locator");
|
|
2087
2689
|
const snapshot = await scope.locator("body").ariaSnapshot({ timeout });
|
|
2690
|
+
logEvent(`[snapshotValidation] after: scope.locator took ${Date.now() - _perf_t200}ms`);
|
|
2088
2691
|
if (snapshot && snapshot.length <= 10) {
|
|
2089
2692
|
console.log("Page snapshot length is suspiciously small:", snapshot);
|
|
2090
2693
|
}
|
|
@@ -2097,8 +2700,14 @@ class StableBrowser {
|
|
|
2097
2700
|
}
|
|
2098
2701
|
// highlight and screenshot
|
|
2099
2702
|
try {
|
|
2703
|
+
const _perf_t201 = Date.now();
|
|
2704
|
+
logEvent("[snapshotValidation] before: await");
|
|
2100
2705
|
await await highlightSnapshot(newValue, scope);
|
|
2706
|
+
logEvent(`[snapshotValidation] after: await took ${Date.now() - _perf_t201}ms`);
|
|
2707
|
+
const _perf_t202 = Date.now();
|
|
2708
|
+
logEvent("[snapshotValidation] before: _screenshot");
|
|
2101
2709
|
await _screenshot(state, this);
|
|
2710
|
+
logEvent(`[snapshotValidation] after: _screenshot took ${Date.now() - _perf_t202}ms`);
|
|
2102
2711
|
}
|
|
2103
2712
|
catch (e) { }
|
|
2104
2713
|
return state.info;
|
|
@@ -2107,16 +2716,25 @@ class StableBrowser {
|
|
|
2107
2716
|
// Log error but continue retrying until timeout is reached
|
|
2108
2717
|
//this.logger.warn("Retrying snapshot validation due to: " + e.message);
|
|
2109
2718
|
}
|
|
2719
|
+
const _perf_t203 = Date.now();
|
|
2720
|
+
logEvent("[snapshotValidation] before: new Promise");
|
|
2110
2721
|
await new Promise((resolve) => setTimeout(resolve, 2000)); // Wait 1 second before retrying
|
|
2111
2722
|
}
|
|
2112
2723
|
throw new Error("No snapshot match " + matchResult?.errorLineText);
|
|
2724
|
+
logEvent(`[snapshotValidation] after: new Promise took ${Date.now() - _perf_t203}ms`);
|
|
2113
2725
|
}
|
|
2114
2726
|
catch (e) {
|
|
2727
|
+
const _perf_t204 = Date.now();
|
|
2728
|
+
logEvent("[snapshotValidation] before: _commandError");
|
|
2115
2729
|
await _commandError(state, e, this);
|
|
2730
|
+
logEvent(`[snapshotValidation] after: _commandError took ${Date.now() - _perf_t204}ms`);
|
|
2116
2731
|
throw e;
|
|
2117
2732
|
}
|
|
2118
2733
|
finally {
|
|
2734
|
+
const _perf_t205 = Date.now();
|
|
2735
|
+
logEvent("[snapshotValidation] before: _commandFinally");
|
|
2119
2736
|
await _commandFinally(state, this);
|
|
2737
|
+
logEvent(`[snapshotValidation] after: _commandFinally took ${Date.now() - _perf_t205}ms`);
|
|
2120
2738
|
}
|
|
2121
2739
|
}
|
|
2122
2740
|
async waitForUserInput(message, world = null) {
|
|
@@ -2127,6 +2745,8 @@ class StableBrowser {
|
|
|
2127
2745
|
message = "# Wait for user input. " + message;
|
|
2128
2746
|
}
|
|
2129
2747
|
message += "\n";
|
|
2748
|
+
const _perf_t206 = Date.now();
|
|
2749
|
+
logEvent("[waitForUserInput] before: new Promise");
|
|
2130
2750
|
const value = await new Promise((resolve) => {
|
|
2131
2751
|
const rl = readline.createInterface({
|
|
2132
2752
|
input: process.stdin,
|
|
@@ -2137,6 +2757,7 @@ class StableBrowser {
|
|
|
2137
2757
|
resolve(answer);
|
|
2138
2758
|
});
|
|
2139
2759
|
});
|
|
2760
|
+
logEvent(`[waitForUserInput] after: new Promise took ${Date.now() - _perf_t206}ms`);
|
|
2140
2761
|
if (value) {
|
|
2141
2762
|
this.logger.info(`{{userInput}} was set to: ${value}`);
|
|
2142
2763
|
}
|
|
@@ -2240,7 +2861,10 @@ class StableBrowser {
|
|
|
2240
2861
|
rowNumber = parseInt(parts[1]);
|
|
2241
2862
|
}
|
|
2242
2863
|
let dataFile = this._getDataFilePath(parts[0]);
|
|
2864
|
+
const _perf_t207 = Date.now();
|
|
2865
|
+
logEvent("[loadTestDataAsync] before: _parseCSVSync");
|
|
2243
2866
|
const results = await this._parseCSVSync(dataFile);
|
|
2867
|
+
logEvent(`[loadTestDataAsync] after: _parseCSVSync took ${Date.now() - _perf_t207}ms`);
|
|
2244
2868
|
// result stracture:
|
|
2245
2869
|
// [
|
|
2246
2870
|
// { NAME: 'Daffy Duck', AGE: '24' },
|
|
@@ -2269,7 +2893,10 @@ class StableBrowser {
|
|
|
2269
2893
|
if (info) {
|
|
2270
2894
|
if (!info.title) {
|
|
2271
2895
|
try {
|
|
2896
|
+
const _perf_t208 = Date.now();
|
|
2897
|
+
logEvent("[_screenShot] before: page.title");
|
|
2272
2898
|
info.title = await this.page.title();
|
|
2899
|
+
logEvent(`[_screenShot] after: page.title took ${Date.now() - _perf_t208}ms`);
|
|
2273
2900
|
}
|
|
2274
2901
|
catch (e) {
|
|
2275
2902
|
// ignore
|
|
@@ -2293,7 +2920,10 @@ class StableBrowser {
|
|
|
2293
2920
|
const uuidStr = "id_" + randomUUID();
|
|
2294
2921
|
const screenshotPath = path.join(world.screenshotPath, uuidStr + ".png");
|
|
2295
2922
|
try {
|
|
2923
|
+
const _perf_t209 = Date.now();
|
|
2924
|
+
logEvent("[_screenShot] before: takeScreenshot");
|
|
2296
2925
|
await this.takeScreenshot(screenshotPath, options.fullPage === true);
|
|
2926
|
+
logEvent(`[_screenShot] after: takeScreenshot took ${Date.now() - _perf_t209}ms`);
|
|
2297
2927
|
// let buffer = await this.page.screenshot({ timeout: 4000 });
|
|
2298
2928
|
// // save the buffer to the screenshot path asynchrously
|
|
2299
2929
|
// fs.writeFile(screenshotPath, buffer, (err) => {
|
|
@@ -2304,7 +2934,10 @@ class StableBrowser {
|
|
|
2304
2934
|
result.screenshotId = uuidStr;
|
|
2305
2935
|
result.screenshotPath = screenshotPath;
|
|
2306
2936
|
if (info && info.box) {
|
|
2937
|
+
const _perf_t210 = Date.now();
|
|
2938
|
+
logEvent("[_screenShot] before: drawRectangle");
|
|
2307
2939
|
await drawRectangle(screenshotPath, info.box.x, info.box.y, info.box.width, info.box.height);
|
|
2940
|
+
logEvent(`[_screenShot] after: drawRectangle took ${Date.now() - _perf_t210}ms`);
|
|
2308
2941
|
}
|
|
2309
2942
|
}
|
|
2310
2943
|
catch (e) {
|
|
@@ -2314,7 +2947,10 @@ class StableBrowser {
|
|
|
2314
2947
|
else if (options && options.screenshot) {
|
|
2315
2948
|
result.screenshotPath = options.screenshotPath;
|
|
2316
2949
|
try {
|
|
2950
|
+
const _perf_t211 = Date.now();
|
|
2951
|
+
logEvent("[_screenShot] before: takeScreenshot");
|
|
2317
2952
|
await this.takeScreenshot(options.screenshotPath, options.fullPage === true);
|
|
2953
|
+
logEvent(`[_screenShot] after: takeScreenshot took ${Date.now() - _perf_t211}ms`);
|
|
2318
2954
|
// let buffer = await this.page.screenshot({ timeout: 4000 });
|
|
2319
2955
|
// // save the buffer to the screenshot path asynchrously
|
|
2320
2956
|
// fs.writeFile(options.screenshotPath, buffer, (err) => {
|
|
@@ -2327,7 +2963,10 @@ class StableBrowser {
|
|
|
2327
2963
|
this.logger.info("unable to take screenshot, ignored");
|
|
2328
2964
|
}
|
|
2329
2965
|
if (info && info.box) {
|
|
2966
|
+
const _perf_t212 = Date.now();
|
|
2967
|
+
logEvent("[_screenShot] before: drawRectangle");
|
|
2330
2968
|
await drawRectangle(options.screenshotPath, info.box.x, info.box.y, info.box.width, info.box.height);
|
|
2969
|
+
logEvent(`[_screenShot] after: drawRectangle took ${Date.now() - _perf_t212}ms`);
|
|
2331
2970
|
}
|
|
2332
2971
|
}
|
|
2333
2972
|
return result;
|
|
@@ -2354,32 +2993,50 @@ class StableBrowser {
|
|
|
2354
2993
|
// await this._highlightElements(focusedElement);
|
|
2355
2994
|
// }
|
|
2356
2995
|
if (this.context.browserName === "chromium") {
|
|
2996
|
+
const _perf_t213 = Date.now();
|
|
2997
|
+
logEvent("[takeScreenshot] before: playContext.newCDPSession");
|
|
2357
2998
|
const client = await playContext.newCDPSession(this.page);
|
|
2999
|
+
logEvent(`[takeScreenshot] after: playContext.newCDPSession took ${Date.now() - _perf_t213}ms`);
|
|
3000
|
+
const _perf_t214 = Date.now();
|
|
3001
|
+
logEvent("[takeScreenshot] before: client.send");
|
|
2358
3002
|
const { data } = await client.send("Page.captureScreenshot", {
|
|
2359
3003
|
format: "png",
|
|
2360
3004
|
captureBeyondViewport: fullPage,
|
|
2361
3005
|
});
|
|
3006
|
+
logEvent(`[takeScreenshot] after: client.send took ${Date.now() - _perf_t214}ms`);
|
|
3007
|
+
const _perf_t215 = Date.now();
|
|
3008
|
+
logEvent("[takeScreenshot] before: client.detach");
|
|
2362
3009
|
await client.detach();
|
|
3010
|
+
logEvent(`[takeScreenshot] after: client.detach took ${Date.now() - _perf_t215}ms`);
|
|
2363
3011
|
if (!screenshotPath) {
|
|
2364
3012
|
return data;
|
|
2365
3013
|
}
|
|
2366
3014
|
screenshotBuffer = Buffer.from(data, "base64");
|
|
2367
3015
|
}
|
|
2368
3016
|
else {
|
|
3017
|
+
const _perf_t216 = Date.now();
|
|
3018
|
+
logEvent("[takeScreenshot] before: page.screenshot");
|
|
2369
3019
|
screenshotBuffer = await this.page.screenshot({ fullPage: fullPage });
|
|
3020
|
+
logEvent(`[takeScreenshot] after: page.screenshot took ${Date.now() - _perf_t216}ms`);
|
|
2370
3021
|
}
|
|
2371
3022
|
// if (focusedElement) {
|
|
2372
3023
|
// // console.log(`Focused element ${JSON.stringify(focusedElement._selector)}`)
|
|
2373
3024
|
// await this._unhighlightElements(focusedElement);
|
|
2374
3025
|
// }
|
|
3026
|
+
const _perf_t217 = Date.now();
|
|
3027
|
+
logEvent("[takeScreenshot] before: Jimp.read");
|
|
2375
3028
|
let image = await Jimp.read(screenshotBuffer);
|
|
3029
|
+
logEvent(`[takeScreenshot] after: Jimp.read took ${Date.now() - _perf_t217}ms`);
|
|
2376
3030
|
// Get the image dimensions
|
|
2377
3031
|
const { width, height } = image.bitmap;
|
|
2378
3032
|
const resizeRatio = viewportWidth / width;
|
|
2379
3033
|
// Resize the image to fit within the viewport dimensions without enlarging
|
|
2380
3034
|
if (width > viewportWidth) {
|
|
2381
3035
|
image = image.resize({ w: viewportWidth, h: height * resizeRatio }); // Resize the image while maintaining aspect ratio
|
|
3036
|
+
const _perf_t218 = Date.now();
|
|
3037
|
+
logEvent("[takeScreenshot] before: image.write");
|
|
2382
3038
|
await image.write(screenshotPath);
|
|
3039
|
+
logEvent(`[takeScreenshot] after: image.write took ${Date.now() - _perf_t218}ms`);
|
|
2383
3040
|
}
|
|
2384
3041
|
else {
|
|
2385
3042
|
fs.writeFileSync(screenshotPath, screenshotBuffer);
|
|
@@ -2397,17 +3054,32 @@ class StableBrowser {
|
|
|
2397
3054
|
operation: "verifyElementExistInPage",
|
|
2398
3055
|
log: "***** verify element " + selectors.element_name + " exists in page *****\n",
|
|
2399
3056
|
};
|
|
3057
|
+
const _perf_t219 = Date.now();
|
|
3058
|
+
logEvent("[verifyElementExistInPage] before: new Promise");
|
|
2400
3059
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
3060
|
+
logEvent(`[verifyElementExistInPage] after: new Promise took ${Date.now() - _perf_t219}ms`);
|
|
2401
3061
|
try {
|
|
3062
|
+
const _perf_t220 = Date.now();
|
|
3063
|
+
logEvent("[verifyElementExistInPage] before: _preCommand");
|
|
2402
3064
|
await _preCommand(state, this);
|
|
3065
|
+
logEvent(`[verifyElementExistInPage] after: _preCommand took ${Date.now() - _perf_t220}ms`);
|
|
3066
|
+
const _perf_t221 = Date.now();
|
|
3067
|
+
logEvent("[verifyElementExistInPage] before: expect");
|
|
2403
3068
|
await expect(state.element).toHaveCount(1, { timeout: 10000 });
|
|
3069
|
+
logEvent(`[verifyElementExistInPage] after: expect took ${Date.now() - _perf_t221}ms`);
|
|
2404
3070
|
return state.info;
|
|
2405
3071
|
}
|
|
2406
3072
|
catch (e) {
|
|
3073
|
+
const _perf_t222 = Date.now();
|
|
3074
|
+
logEvent("[verifyElementExistInPage] before: _commandError");
|
|
2407
3075
|
await _commandError(state, e, this);
|
|
3076
|
+
logEvent(`[verifyElementExistInPage] after: _commandError took ${Date.now() - _perf_t222}ms`);
|
|
2408
3077
|
}
|
|
2409
3078
|
finally {
|
|
3079
|
+
const _perf_t223 = Date.now();
|
|
3080
|
+
logEvent("[verifyElementExistInPage] before: _commandFinally");
|
|
2410
3081
|
await _commandFinally(state, this);
|
|
3082
|
+
logEvent(`[verifyElementExistInPage] after: _commandFinally took ${Date.now() - _perf_t223}ms`);
|
|
2411
3083
|
}
|
|
2412
3084
|
}
|
|
2413
3085
|
async extractAttribute(selectors, attribute, variable, _params = null, options = {}, world = null) {
|
|
@@ -2425,24 +3097,45 @@ class StableBrowser {
|
|
|
2425
3097
|
log: "***** extract attribute " + attribute + " from " + selectors.element_name + " *****\n",
|
|
2426
3098
|
allowDisabled: true,
|
|
2427
3099
|
};
|
|
3100
|
+
const _perf_t224 = Date.now();
|
|
3101
|
+
logEvent("[extractAttribute] before: new Promise");
|
|
2428
3102
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
3103
|
+
logEvent(`[extractAttribute] after: new Promise took ${Date.now() - _perf_t224}ms`);
|
|
2429
3104
|
try {
|
|
3105
|
+
const _perf_t225 = Date.now();
|
|
3106
|
+
logEvent("[extractAttribute] before: _preCommand");
|
|
2430
3107
|
await _preCommand(state, this);
|
|
3108
|
+
logEvent(`[extractAttribute] after: _preCommand took ${Date.now() - _perf_t225}ms`);
|
|
2431
3109
|
switch (attribute) {
|
|
2432
3110
|
case "inner_text":
|
|
3111
|
+
const _perf_t226 = Date.now();
|
|
3112
|
+
logEvent("[extractAttribute] before: state.element.innerText");
|
|
2433
3113
|
state.value = await state.element.innerText();
|
|
3114
|
+
logEvent(`[extractAttribute] after: state.element.innerText took ${Date.now() - _perf_t226}ms`);
|
|
2434
3115
|
break;
|
|
2435
3116
|
case "href":
|
|
3117
|
+
const _perf_t227 = Date.now();
|
|
3118
|
+
logEvent("[extractAttribute] before: state.element.getAttribute");
|
|
2436
3119
|
state.value = await state.element.getAttribute("href");
|
|
3120
|
+
logEvent(`[extractAttribute] after: state.element.getAttribute took ${Date.now() - _perf_t227}ms`);
|
|
2437
3121
|
break;
|
|
2438
3122
|
case "value":
|
|
3123
|
+
const _perf_t228 = Date.now();
|
|
3124
|
+
logEvent("[extractAttribute] before: state.element.inputValue");
|
|
2439
3125
|
state.value = await state.element.inputValue();
|
|
3126
|
+
logEvent(`[extractAttribute] after: state.element.inputValue took ${Date.now() - _perf_t228}ms`);
|
|
2440
3127
|
break;
|
|
2441
3128
|
case "text":
|
|
3129
|
+
const _perf_t229 = Date.now();
|
|
3130
|
+
logEvent("[extractAttribute] before: state.element.textContent");
|
|
2442
3131
|
state.value = await state.element.textContent();
|
|
3132
|
+
logEvent(`[extractAttribute] after: state.element.textContent took ${Date.now() - _perf_t229}ms`);
|
|
2443
3133
|
break;
|
|
2444
3134
|
default:
|
|
3135
|
+
const _perf_t230 = Date.now();
|
|
3136
|
+
logEvent("[extractAttribute] before: state.element.getAttribute");
|
|
2445
3137
|
state.value = await state.element.getAttribute(attribute);
|
|
3138
|
+
logEvent(`[extractAttribute] after: state.element.getAttribute took ${Date.now() - _perf_t230}ms`);
|
|
2446
3139
|
break;
|
|
2447
3140
|
}
|
|
2448
3141
|
if (options !== null) {
|
|
@@ -2476,10 +3169,16 @@ class StableBrowser {
|
|
|
2476
3169
|
return state.info;
|
|
2477
3170
|
}
|
|
2478
3171
|
catch (e) {
|
|
3172
|
+
const _perf_t231 = Date.now();
|
|
3173
|
+
logEvent("[extractAttribute] before: _commandError");
|
|
2479
3174
|
await _commandError(state, e, this);
|
|
3175
|
+
logEvent(`[extractAttribute] after: _commandError took ${Date.now() - _perf_t231}ms`);
|
|
2480
3176
|
}
|
|
2481
3177
|
finally {
|
|
3178
|
+
const _perf_t232 = Date.now();
|
|
3179
|
+
logEvent("[extractAttribute] before: _commandFinally");
|
|
2482
3180
|
await _commandFinally(state, this);
|
|
3181
|
+
logEvent(`[extractAttribute] after: _commandFinally took ${Date.now() - _perf_t232}ms`);
|
|
2483
3182
|
}
|
|
2484
3183
|
}
|
|
2485
3184
|
async extractProperty(selectors, property, variable, _params = null, options = {}, world = null) {
|
|
@@ -2497,21 +3196,39 @@ class StableBrowser {
|
|
|
2497
3196
|
log: "***** extract property " + property + " from " + selectors.element_name + " *****\n",
|
|
2498
3197
|
allowDisabled: true,
|
|
2499
3198
|
};
|
|
3199
|
+
const _perf_t233 = Date.now();
|
|
3200
|
+
logEvent("[extractProperty] before: new Promise");
|
|
2500
3201
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
3202
|
+
logEvent(`[extractProperty] after: new Promise took ${Date.now() - _perf_t233}ms`);
|
|
2501
3203
|
try {
|
|
3204
|
+
const _perf_t234 = Date.now();
|
|
3205
|
+
logEvent("[extractProperty] before: _preCommand");
|
|
2502
3206
|
await _preCommand(state, this);
|
|
3207
|
+
logEvent(`[extractProperty] after: _preCommand took ${Date.now() - _perf_t234}ms`);
|
|
2503
3208
|
switch (property) {
|
|
2504
3209
|
case "inner_text":
|
|
3210
|
+
const _perf_t235 = Date.now();
|
|
3211
|
+
logEvent("[extractProperty] before: state.element.innerText");
|
|
2505
3212
|
state.value = await state.element.innerText();
|
|
3213
|
+
logEvent(`[extractProperty] after: state.element.innerText took ${Date.now() - _perf_t235}ms`);
|
|
2506
3214
|
break;
|
|
2507
3215
|
case "href":
|
|
3216
|
+
const _perf_t236 = Date.now();
|
|
3217
|
+
logEvent("[extractProperty] before: state.element.getAttribute");
|
|
2508
3218
|
state.value = await state.element.getAttribute("href");
|
|
3219
|
+
logEvent(`[extractProperty] after: state.element.getAttribute took ${Date.now() - _perf_t236}ms`);
|
|
2509
3220
|
break;
|
|
2510
3221
|
case "value":
|
|
3222
|
+
const _perf_t237 = Date.now();
|
|
3223
|
+
logEvent("[extractProperty] before: state.element.inputValue");
|
|
2511
3224
|
state.value = await state.element.inputValue();
|
|
3225
|
+
logEvent(`[extractProperty] after: state.element.inputValue took ${Date.now() - _perf_t237}ms`);
|
|
2512
3226
|
break;
|
|
2513
3227
|
case "text":
|
|
3228
|
+
const _perf_t238 = Date.now();
|
|
3229
|
+
logEvent("[extractProperty] before: state.element.textContent");
|
|
2514
3230
|
state.value = await state.element.textContent();
|
|
3231
|
+
logEvent(`[extractProperty] after: state.element.textContent took ${Date.now() - _perf_t238}ms`);
|
|
2515
3232
|
break;
|
|
2516
3233
|
default:
|
|
2517
3234
|
if (property.startsWith("dataset.")) {
|
|
@@ -2553,10 +3270,16 @@ class StableBrowser {
|
|
|
2553
3270
|
return state.info;
|
|
2554
3271
|
}
|
|
2555
3272
|
catch (e) {
|
|
3273
|
+
const _perf_t239 = Date.now();
|
|
3274
|
+
logEvent("[extractProperty] before: _commandError");
|
|
2556
3275
|
await _commandError(state, e, this);
|
|
3276
|
+
logEvent(`[extractProperty] after: _commandError took ${Date.now() - _perf_t239}ms`);
|
|
2557
3277
|
}
|
|
2558
3278
|
finally {
|
|
3279
|
+
const _perf_t240 = Date.now();
|
|
3280
|
+
logEvent("[extractProperty] before: _commandFinally");
|
|
2559
3281
|
await _commandFinally(state, this);
|
|
3282
|
+
logEvent(`[extractProperty] after: _commandFinally took ${Date.now() - _perf_t240}ms`);
|
|
2560
3283
|
}
|
|
2561
3284
|
}
|
|
2562
3285
|
async verifyAttribute(selectors, attribute, value, _params = null, options = {}, world = null) {
|
|
@@ -2576,12 +3299,21 @@ class StableBrowser {
|
|
|
2576
3299
|
log: "***** verify attribute " + attribute + " from " + selectors.element_name + " *****\n",
|
|
2577
3300
|
allowDisabled: true,
|
|
2578
3301
|
};
|
|
3302
|
+
const _perf_t241 = Date.now();
|
|
3303
|
+
logEvent("[verifyAttribute] before: new Promise");
|
|
2579
3304
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
3305
|
+
logEvent(`[verifyAttribute] after: new Promise took ${Date.now() - _perf_t241}ms`);
|
|
2580
3306
|
let val;
|
|
2581
3307
|
let expectedValue;
|
|
2582
3308
|
try {
|
|
3309
|
+
const _perf_t242 = Date.now();
|
|
3310
|
+
logEvent("[verifyAttribute] before: _preCommand");
|
|
2583
3311
|
await _preCommand(state, this);
|
|
3312
|
+
logEvent(`[verifyAttribute] after: _preCommand took ${Date.now() - _perf_t242}ms`);
|
|
3313
|
+
const _perf_t243 = Date.now();
|
|
3314
|
+
logEvent("[verifyAttribute] before: replaceWithLocalTestData");
|
|
2584
3315
|
expectedValue = await replaceWithLocalTestData(state.value, world);
|
|
3316
|
+
logEvent(`[verifyAttribute] after: replaceWithLocalTestData took ${Date.now() - _perf_t243}ms`);
|
|
2585
3317
|
state.info.expectedValue = expectedValue;
|
|
2586
3318
|
switch (attribute) {
|
|
2587
3319
|
case "innerText":
|
|
@@ -2600,7 +3332,10 @@ class StableBrowser {
|
|
|
2600
3332
|
val = String(await state.element.isDisabled());
|
|
2601
3333
|
break;
|
|
2602
3334
|
case "readOnly":
|
|
3335
|
+
const _perf_t244 = Date.now();
|
|
3336
|
+
logEvent("[verifyAttribute] before: state.element.isEditable");
|
|
2603
3337
|
const isEditable = await state.element.isEditable();
|
|
3338
|
+
logEvent(`[verifyAttribute] after: state.element.isEditable took ${Date.now() - _perf_t244}ms`);
|
|
2604
3339
|
val = String(!isEditable);
|
|
2605
3340
|
break;
|
|
2606
3341
|
default:
|
|
@@ -2651,10 +3386,16 @@ class StableBrowser {
|
|
|
2651
3386
|
return state.info;
|
|
2652
3387
|
}
|
|
2653
3388
|
catch (e) {
|
|
3389
|
+
const _perf_t245 = Date.now();
|
|
3390
|
+
logEvent("[verifyAttribute] before: _commandError");
|
|
2654
3391
|
await _commandError(state, e, this);
|
|
3392
|
+
logEvent(`[verifyAttribute] after: _commandError took ${Date.now() - _perf_t245}ms`);
|
|
2655
3393
|
}
|
|
2656
3394
|
finally {
|
|
3395
|
+
const _perf_t246 = Date.now();
|
|
3396
|
+
logEvent("[verifyAttribute] before: _commandFinally");
|
|
2657
3397
|
await _commandFinally(state, this);
|
|
3398
|
+
logEvent(`[verifyAttribute] after: _commandFinally took ${Date.now() - _perf_t246}ms`);
|
|
2658
3399
|
}
|
|
2659
3400
|
}
|
|
2660
3401
|
async verifyProperty(selectors, property, value, _params = null, options = {}, world = null) {
|
|
@@ -2674,12 +3415,21 @@ class StableBrowser {
|
|
|
2674
3415
|
log: "***** verify property " + property + " from " + selectors.element_name + " *****\n",
|
|
2675
3416
|
allowDisabled: true,
|
|
2676
3417
|
};
|
|
3418
|
+
const _perf_t247 = Date.now();
|
|
3419
|
+
logEvent("[verifyProperty] before: new Promise");
|
|
2677
3420
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
3421
|
+
logEvent(`[verifyProperty] after: new Promise took ${Date.now() - _perf_t247}ms`);
|
|
2678
3422
|
let val;
|
|
2679
3423
|
let expectedValue;
|
|
2680
3424
|
try {
|
|
3425
|
+
const _perf_t248 = Date.now();
|
|
3426
|
+
logEvent("[verifyProperty] before: _preCommand");
|
|
2681
3427
|
await _preCommand(state, this);
|
|
3428
|
+
logEvent(`[verifyProperty] after: _preCommand took ${Date.now() - _perf_t248}ms`);
|
|
3429
|
+
const _perf_t249 = Date.now();
|
|
3430
|
+
logEvent("[verifyProperty] before: _replaceWithLocalData");
|
|
2682
3431
|
expectedValue = await this._replaceWithLocalData(value, world);
|
|
3432
|
+
logEvent(`[verifyProperty] after: _replaceWithLocalData took ${Date.now() - _perf_t249}ms`);
|
|
2683
3433
|
state.info.expectedValue = expectedValue;
|
|
2684
3434
|
switch (property) {
|
|
2685
3435
|
case "innerText":
|
|
@@ -2698,7 +3448,10 @@ class StableBrowser {
|
|
|
2698
3448
|
val = String(await state.element.isDisabled());
|
|
2699
3449
|
break;
|
|
2700
3450
|
case "readOnly":
|
|
3451
|
+
const _perf_t250 = Date.now();
|
|
3452
|
+
logEvent("[verifyProperty] before: state.element.isEditable");
|
|
2701
3453
|
const isEditable = await state.element.isEditable();
|
|
3454
|
+
logEvent(`[verifyProperty] after: state.element.isEditable took ${Date.now() - _perf_t250}ms`);
|
|
2702
3455
|
val = String(!isEditable);
|
|
2703
3456
|
break;
|
|
2704
3457
|
case "innerHTML":
|
|
@@ -2779,10 +3532,16 @@ class StableBrowser {
|
|
|
2779
3532
|
return state.info;
|
|
2780
3533
|
}
|
|
2781
3534
|
catch (e) {
|
|
3535
|
+
const _perf_t251 = Date.now();
|
|
3536
|
+
logEvent("[verifyProperty] before: _commandError");
|
|
2782
3537
|
await _commandError(state, e, this);
|
|
3538
|
+
logEvent(`[verifyProperty] after: _commandError took ${Date.now() - _perf_t251}ms`);
|
|
2783
3539
|
}
|
|
2784
3540
|
finally {
|
|
3541
|
+
const _perf_t252 = Date.now();
|
|
3542
|
+
logEvent("[verifyProperty] before: _commandFinally");
|
|
2785
3543
|
await _commandFinally(state, this);
|
|
3544
|
+
logEvent(`[verifyProperty] after: _commandFinally took ${Date.now() - _perf_t252}ms`);
|
|
2786
3545
|
}
|
|
2787
3546
|
}
|
|
2788
3547
|
async conditionalWait(selectors, condition, timeout = 1000, _params = null, options = {}, world = null) {
|
|
@@ -2817,32 +3576,56 @@ class StableBrowser {
|
|
|
2817
3576
|
const remainingTime = timeoutMs - elapsedTime;
|
|
2818
3577
|
try {
|
|
2819
3578
|
// Try to execute _preCommand (element location)
|
|
3579
|
+
const _perf_t253 = Date.now();
|
|
3580
|
+
logEvent("[conditionalWait] before: _preCommand");
|
|
2820
3581
|
await _preCommand(state, this);
|
|
3582
|
+
logEvent(`[conditionalWait] after: _preCommand took ${Date.now() - _perf_t253}ms`);
|
|
2821
3583
|
// If _preCommand succeeds, start condition checking
|
|
2822
3584
|
const checkCondition = async () => {
|
|
2823
3585
|
try {
|
|
2824
3586
|
switch (condition.toLowerCase()) {
|
|
2825
3587
|
case "checked":
|
|
3588
|
+
const _perf_t254 = Date.now();
|
|
3589
|
+
logEvent("[conditionalWait] before: state.element.isChecked");
|
|
2826
3590
|
currentValue = await state.element.isChecked();
|
|
3591
|
+
logEvent(`[conditionalWait] after: state.element.isChecked took ${Date.now() - _perf_t254}ms`);
|
|
2827
3592
|
return currentValue === true;
|
|
2828
3593
|
case "unchecked":
|
|
3594
|
+
const _perf_t255 = Date.now();
|
|
3595
|
+
logEvent("[conditionalWait] before: state.element.isChecked");
|
|
2829
3596
|
currentValue = await state.element.isChecked();
|
|
3597
|
+
logEvent(`[conditionalWait] after: state.element.isChecked took ${Date.now() - _perf_t255}ms`);
|
|
2830
3598
|
return currentValue === false;
|
|
2831
3599
|
case "visible":
|
|
3600
|
+
const _perf_t256 = Date.now();
|
|
3601
|
+
logEvent("[conditionalWait] before: state.element.isVisible");
|
|
2832
3602
|
currentValue = await state.element.isVisible();
|
|
3603
|
+
logEvent(`[conditionalWait] after: state.element.isVisible took ${Date.now() - _perf_t256}ms`);
|
|
2833
3604
|
return currentValue === true;
|
|
2834
3605
|
case "hidden":
|
|
3606
|
+
const _perf_t257 = Date.now();
|
|
3607
|
+
logEvent("[conditionalWait] before: state.element.isVisible");
|
|
2835
3608
|
currentValue = await state.element.isVisible();
|
|
3609
|
+
logEvent(`[conditionalWait] after: state.element.isVisible took ${Date.now() - _perf_t257}ms`);
|
|
2836
3610
|
return currentValue === false;
|
|
2837
3611
|
case "enabled":
|
|
3612
|
+
const _perf_t258 = Date.now();
|
|
3613
|
+
logEvent("[conditionalWait] before: state.element.isDisabled");
|
|
2838
3614
|
currentValue = await state.element.isDisabled();
|
|
3615
|
+
logEvent(`[conditionalWait] after: state.element.isDisabled took ${Date.now() - _perf_t258}ms`);
|
|
2839
3616
|
return currentValue === false;
|
|
2840
3617
|
case "disabled":
|
|
3618
|
+
const _perf_t259 = Date.now();
|
|
3619
|
+
logEvent("[conditionalWait] before: state.element.isDisabled");
|
|
2841
3620
|
currentValue = await state.element.isDisabled();
|
|
3621
|
+
logEvent(`[conditionalWait] after: state.element.isDisabled took ${Date.now() - _perf_t259}ms`);
|
|
2842
3622
|
return currentValue === true;
|
|
2843
3623
|
case "editable":
|
|
2844
3624
|
// currentValue = await String(await state.element.evaluate((element, prop) => element[prop], "isContentEditable"));
|
|
3625
|
+
const _perf_t260 = Date.now();
|
|
3626
|
+
logEvent("[conditionalWait] before: state.element.isContentEditable");
|
|
2845
3627
|
currentValue = await state.element.isContentEditable();
|
|
3628
|
+
logEvent(`[conditionalWait] after: state.element.isContentEditable took ${Date.now() - _perf_t260}ms`);
|
|
2846
3629
|
return currentValue === true;
|
|
2847
3630
|
default:
|
|
2848
3631
|
state.info.message = `Unsupported condition: '${condition}'. Supported conditions are: checked, unchecked, visible, hidden, enabled, disabled, editable.`;
|
|
@@ -2858,13 +3641,19 @@ class StableBrowser {
|
|
|
2858
3641
|
// Inner loop for condition checking (once element is located)
|
|
2859
3642
|
while (Date.now() - startTime < timeoutMs) {
|
|
2860
3643
|
const currentElapsedTime = Date.now() - startTime;
|
|
3644
|
+
const _perf_t261 = Date.now();
|
|
3645
|
+
logEvent("[conditionalWait] before: checkCondition");
|
|
2861
3646
|
conditionMet = await checkCondition();
|
|
3647
|
+
logEvent(`[conditionalWait] after: checkCondition took ${Date.now() - _perf_t261}ms`);
|
|
2862
3648
|
if (conditionMet) {
|
|
2863
3649
|
break;
|
|
2864
3650
|
}
|
|
2865
3651
|
// Check if we still have time for another attempt
|
|
2866
3652
|
if (Date.now() - startTime + 50 < timeoutMs) {
|
|
3653
|
+
const _perf_t262 = Date.now();
|
|
3654
|
+
logEvent("[conditionalWait] before: new Promise");
|
|
2867
3655
|
await new Promise((res) => setTimeout(res, 50));
|
|
3656
|
+
logEvent(`[conditionalWait] after: new Promise took ${Date.now() - _perf_t262}ms`);
|
|
2868
3657
|
}
|
|
2869
3658
|
else {
|
|
2870
3659
|
break;
|
|
@@ -2883,7 +3672,10 @@ class StableBrowser {
|
|
|
2883
3672
|
const timeLeft = timeoutMs - currentElapsedTime;
|
|
2884
3673
|
// Check if we have enough time left to retry
|
|
2885
3674
|
if (timeLeft > 100) {
|
|
3675
|
+
const _perf_t263 = Date.now();
|
|
3676
|
+
logEvent("[conditionalWait] before: new Promise");
|
|
2886
3677
|
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
3678
|
+
logEvent(`[conditionalWait] after: new Promise took ${Date.now() - _perf_t263}ms`);
|
|
2887
3679
|
}
|
|
2888
3680
|
else {
|
|
2889
3681
|
break;
|
|
@@ -2905,7 +3697,10 @@ class StableBrowser {
|
|
|
2905
3697
|
state.log += `Last error: ${lastError.message}\n`;
|
|
2906
3698
|
}
|
|
2907
3699
|
try {
|
|
3700
|
+
const _perf_t264 = Date.now();
|
|
3701
|
+
logEvent("[conditionalWait] before: _commandFinally");
|
|
2908
3702
|
await _commandFinally(state, this);
|
|
3703
|
+
logEvent(`[conditionalWait] after: _commandFinally took ${Date.now() - _perf_t264}ms`);
|
|
2909
3704
|
}
|
|
2910
3705
|
catch (finallyError) {
|
|
2911
3706
|
state.log += `Error in _commandFinally: ${finallyError.message}\n`;
|
|
@@ -2945,7 +3740,10 @@ class StableBrowser {
|
|
|
2945
3740
|
let errorCount = 0;
|
|
2946
3741
|
while (true) {
|
|
2947
3742
|
try {
|
|
3743
|
+
const _perf_t265 = Date.now();
|
|
3744
|
+
logEvent("[extractEmailData] before: context.api.request");
|
|
2948
3745
|
let result = await this.context.api.request(request);
|
|
3746
|
+
logEvent(`[extractEmailData] after: context.api.request took ${Date.now() - _perf_t265}ms`);
|
|
2949
3747
|
// the response body expected to be the following:
|
|
2950
3748
|
// {
|
|
2951
3749
|
// "status": true,
|
|
@@ -2993,7 +3791,10 @@ class StableBrowser {
|
|
|
2993
3791
|
errorCount++;
|
|
2994
3792
|
if (errorCount > 3) {
|
|
2995
3793
|
// throw e;
|
|
3794
|
+
const _perf_t266 = Date.now();
|
|
3795
|
+
logEvent("[extractEmailData] before: _commandError");
|
|
2996
3796
|
await _commandError({ text: "extractEmailData", operation: "extractEmailData", emailAddress, info: {} }, e, this);
|
|
3797
|
+
logEvent(`[extractEmailData] after: _commandError took ${Date.now() - _perf_t266}ms`);
|
|
2997
3798
|
}
|
|
2998
3799
|
// ignore
|
|
2999
3800
|
}
|
|
@@ -3001,7 +3802,10 @@ class StableBrowser {
|
|
|
3001
3802
|
if (Date.now() - startTime > timeout) {
|
|
3002
3803
|
throw new Error("timeout reached");
|
|
3003
3804
|
}
|
|
3805
|
+
const _perf_t267 = Date.now();
|
|
3806
|
+
logEvent("[extractEmailData] before: new Promise");
|
|
3004
3807
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
3808
|
+
logEvent(`[extractEmailData] after: new Promise took ${Date.now() - _perf_t267}ms`);
|
|
3005
3809
|
}
|
|
3006
3810
|
}
|
|
3007
3811
|
async _highlightElements(scope, css) {
|
|
@@ -3121,11 +3925,17 @@ class StableBrowser {
|
|
|
3121
3925
|
let error = null;
|
|
3122
3926
|
let screenshotId = null;
|
|
3123
3927
|
let screenshotPath = null;
|
|
3928
|
+
const _perf_t268 = Date.now();
|
|
3929
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3124
3930
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
3931
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t268}ms`);
|
|
3125
3932
|
const info = {};
|
|
3126
3933
|
info.log = "***** verify page path " + pathPart + " *****\n";
|
|
3127
3934
|
info.operation = "verifyPagePath";
|
|
3935
|
+
const _perf_t269 = Date.now();
|
|
3936
|
+
logEvent("[verifyPagePath] before: _replaceWithLocalData");
|
|
3128
3937
|
const newValue = await this._replaceWithLocalData(pathPart, world);
|
|
3938
|
+
logEvent(`[verifyPagePath] after: _replaceWithLocalData took ${Date.now() - _perf_t269}ms`);
|
|
3129
3939
|
if (newValue !== pathPart) {
|
|
3130
3940
|
this.logger.info(pathPart + "=" + newValue);
|
|
3131
3941
|
pathPart = newValue;
|
|
@@ -3146,17 +3956,26 @@ class StableBrowser {
|
|
|
3146
3956
|
log: "***** verify page url is " + queryText + " *****\n",
|
|
3147
3957
|
};
|
|
3148
3958
|
try {
|
|
3959
|
+
const _perf_t270 = Date.now();
|
|
3960
|
+
logEvent("[verifyPagePath] before: _preCommand");
|
|
3149
3961
|
await _preCommand(state, this);
|
|
3962
|
+
logEvent(`[verifyPagePath] after: _preCommand took ${Date.now() - _perf_t270}ms`);
|
|
3150
3963
|
state.info.text = queryText;
|
|
3151
3964
|
for (let i = 0; i < 30; i++) {
|
|
3965
|
+
const _perf_t271 = Date.now();
|
|
3966
|
+
logEvent("[verifyPagePath] before: page.url");
|
|
3152
3967
|
const url = await this.page.url();
|
|
3968
|
+
logEvent(`[verifyPagePath] after: page.url took ${Date.now() - _perf_t271}ms`);
|
|
3153
3969
|
switch (matcher) {
|
|
3154
3970
|
case "exact":
|
|
3155
3971
|
if (url !== queryText) {
|
|
3156
3972
|
if (i === 29) {
|
|
3157
3973
|
throw new Error(`Page URL ${url} is not equal to ${queryText}`);
|
|
3158
3974
|
}
|
|
3975
|
+
const _perf_t272 = Date.now();
|
|
3976
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3159
3977
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
3978
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t272}ms`);
|
|
3160
3979
|
continue;
|
|
3161
3980
|
}
|
|
3162
3981
|
break;
|
|
@@ -3165,7 +3984,10 @@ class StableBrowser {
|
|
|
3165
3984
|
if (i === 29) {
|
|
3166
3985
|
throw new Error(`Page URL ${url} doesn't contain ${queryText}`);
|
|
3167
3986
|
}
|
|
3987
|
+
const _perf_t273 = Date.now();
|
|
3988
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3168
3989
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
3990
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t273}ms`);
|
|
3169
3991
|
continue;
|
|
3170
3992
|
}
|
|
3171
3993
|
break;
|
|
@@ -3176,7 +3998,10 @@ class StableBrowser {
|
|
|
3176
3998
|
if (i === 29) {
|
|
3177
3999
|
throw new Error(`Page URL ${url} doesn't start with ${queryText}`);
|
|
3178
4000
|
}
|
|
4001
|
+
const _perf_t274 = Date.now();
|
|
4002
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3179
4003
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4004
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t274}ms`);
|
|
3180
4005
|
continue;
|
|
3181
4006
|
}
|
|
3182
4007
|
}
|
|
@@ -3195,7 +4020,10 @@ class StableBrowser {
|
|
|
3195
4020
|
if (i === 29) {
|
|
3196
4021
|
throw new Error(`Page URL ${url} doesn't end with ${queryText}`);
|
|
3197
4022
|
}
|
|
4023
|
+
const _perf_t275 = Date.now();
|
|
4024
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3198
4025
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4026
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t275}ms`);
|
|
3199
4027
|
continue;
|
|
3200
4028
|
}
|
|
3201
4029
|
}
|
|
@@ -3206,7 +4034,10 @@ class StableBrowser {
|
|
|
3206
4034
|
if (i === 29) {
|
|
3207
4035
|
throw new Error(`Page URL ${url} doesn't match regex ${queryText}`);
|
|
3208
4036
|
}
|
|
4037
|
+
const _perf_t276 = Date.now();
|
|
4038
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3209
4039
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4040
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t276}ms`);
|
|
3210
4041
|
continue;
|
|
3211
4042
|
}
|
|
3212
4043
|
break;
|
|
@@ -3216,21 +4047,33 @@ class StableBrowser {
|
|
|
3216
4047
|
if (i === 29) {
|
|
3217
4048
|
throw new Error(`Page URL ${url} does not contain ${pathPart}`);
|
|
3218
4049
|
}
|
|
4050
|
+
const _perf_t277 = Date.now();
|
|
4051
|
+
logEvent("[verifyPagePath] before: new Promise");
|
|
3219
4052
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4053
|
+
logEvent(`[verifyPagePath] after: new Promise took ${Date.now() - _perf_t277}ms`);
|
|
3220
4054
|
continue;
|
|
3221
4055
|
}
|
|
3222
4056
|
}
|
|
4057
|
+
const _perf_t278 = Date.now();
|
|
4058
|
+
logEvent("[verifyPagePath] before: _screenshot");
|
|
3223
4059
|
await _screenshot(state, this);
|
|
4060
|
+
logEvent(`[verifyPagePath] after: _screenshot took ${Date.now() - _perf_t278}ms`);
|
|
3224
4061
|
return state.info;
|
|
3225
4062
|
}
|
|
3226
4063
|
}
|
|
3227
4064
|
catch (e) {
|
|
3228
4065
|
state.info.failCause.lastError = e.message;
|
|
3229
4066
|
state.info.failCause.assertionFailed = true;
|
|
4067
|
+
const _perf_t279 = Date.now();
|
|
4068
|
+
logEvent("[verifyPagePath] before: _commandError");
|
|
3230
4069
|
await _commandError(state, e, this);
|
|
4070
|
+
logEvent(`[verifyPagePath] after: _commandError took ${Date.now() - _perf_t279}ms`);
|
|
3231
4071
|
}
|
|
3232
4072
|
finally {
|
|
4073
|
+
const _perf_t280 = Date.now();
|
|
4074
|
+
logEvent("[verifyPagePath] before: _commandFinally");
|
|
3233
4075
|
await _commandFinally(state, this);
|
|
4076
|
+
logEvent(`[verifyPagePath] after: _commandFinally took ${Date.now() - _perf_t280}ms`);
|
|
3234
4077
|
}
|
|
3235
4078
|
}
|
|
3236
4079
|
/**
|
|
@@ -3244,8 +4087,14 @@ class StableBrowser {
|
|
|
3244
4087
|
let error = null;
|
|
3245
4088
|
let screenshotId = null;
|
|
3246
4089
|
let screenshotPath = null;
|
|
4090
|
+
const _perf_t281 = Date.now();
|
|
4091
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3247
4092
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
4093
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t281}ms`);
|
|
4094
|
+
const _perf_t282 = Date.now();
|
|
4095
|
+
logEvent("[verifyPageTitle] before: _replaceWithLocalData");
|
|
3248
4096
|
const newValue = await this._replaceWithLocalData(title, world);
|
|
4097
|
+
logEvent(`[verifyPageTitle] after: _replaceWithLocalData took ${Date.now() - _perf_t282}ms`);
|
|
3249
4098
|
if (newValue !== title) {
|
|
3250
4099
|
this.logger.info(title + "=" + newValue);
|
|
3251
4100
|
title = newValue;
|
|
@@ -3265,17 +4114,26 @@ class StableBrowser {
|
|
|
3265
4114
|
log: "***** verify page title is " + queryText + " *****\n",
|
|
3266
4115
|
};
|
|
3267
4116
|
try {
|
|
4117
|
+
const _perf_t283 = Date.now();
|
|
4118
|
+
logEvent("[verifyPageTitle] before: _preCommand");
|
|
3268
4119
|
await _preCommand(state, this);
|
|
4120
|
+
logEvent(`[verifyPageTitle] after: _preCommand took ${Date.now() - _perf_t283}ms`);
|
|
3269
4121
|
state.info.text = queryText;
|
|
3270
4122
|
for (let i = 0; i < 30; i++) {
|
|
4123
|
+
const _perf_t284 = Date.now();
|
|
4124
|
+
logEvent("[verifyPageTitle] before: page.title");
|
|
3271
4125
|
const foundTitle = await this.page.title();
|
|
4126
|
+
logEvent(`[verifyPageTitle] after: page.title took ${Date.now() - _perf_t284}ms`);
|
|
3272
4127
|
switch (matcher) {
|
|
3273
4128
|
case "exact":
|
|
3274
4129
|
if (foundTitle !== queryText) {
|
|
3275
4130
|
if (i === 29) {
|
|
3276
4131
|
throw new Error(`Page Title ${foundTitle} is not equal to ${queryText}`);
|
|
3277
4132
|
}
|
|
4133
|
+
const _perf_t285 = Date.now();
|
|
4134
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3278
4135
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4136
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t285}ms`);
|
|
3279
4137
|
continue;
|
|
3280
4138
|
}
|
|
3281
4139
|
break;
|
|
@@ -3284,7 +4142,10 @@ class StableBrowser {
|
|
|
3284
4142
|
if (i === 29) {
|
|
3285
4143
|
throw new Error(`Page Title ${foundTitle} doesn't contain ${queryText}`);
|
|
3286
4144
|
}
|
|
4145
|
+
const _perf_t286 = Date.now();
|
|
4146
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3287
4147
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4148
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t286}ms`);
|
|
3288
4149
|
continue;
|
|
3289
4150
|
}
|
|
3290
4151
|
break;
|
|
@@ -3293,7 +4154,10 @@ class StableBrowser {
|
|
|
3293
4154
|
if (i === 29) {
|
|
3294
4155
|
throw new Error(`Page title ${foundTitle} doesn't start with ${queryText}`);
|
|
3295
4156
|
}
|
|
4157
|
+
const _perf_t287 = Date.now();
|
|
4158
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3296
4159
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4160
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t287}ms`);
|
|
3297
4161
|
continue;
|
|
3298
4162
|
}
|
|
3299
4163
|
break;
|
|
@@ -3302,7 +4166,10 @@ class StableBrowser {
|
|
|
3302
4166
|
if (i === 29) {
|
|
3303
4167
|
throw new Error(`Page Title ${foundTitle} doesn't end with ${queryText}`);
|
|
3304
4168
|
}
|
|
4169
|
+
const _perf_t288 = Date.now();
|
|
4170
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3305
4171
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4172
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t288}ms`);
|
|
3306
4173
|
continue;
|
|
3307
4174
|
}
|
|
3308
4175
|
break;
|
|
@@ -3312,7 +4179,10 @@ class StableBrowser {
|
|
|
3312
4179
|
if (i === 29) {
|
|
3313
4180
|
throw new Error(`Page Title ${foundTitle} doesn't match regex ${queryText}`);
|
|
3314
4181
|
}
|
|
4182
|
+
const _perf_t289 = Date.now();
|
|
4183
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3315
4184
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4185
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t289}ms`);
|
|
3316
4186
|
continue;
|
|
3317
4187
|
}
|
|
3318
4188
|
break;
|
|
@@ -3322,21 +4192,33 @@ class StableBrowser {
|
|
|
3322
4192
|
if (i === 29) {
|
|
3323
4193
|
throw new Error(`Page Title ${foundTitle} does not contain ${title}`);
|
|
3324
4194
|
}
|
|
4195
|
+
const _perf_t290 = Date.now();
|
|
4196
|
+
logEvent("[verifyPageTitle] before: new Promise");
|
|
3325
4197
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4198
|
+
logEvent(`[verifyPageTitle] after: new Promise took ${Date.now() - _perf_t290}ms`);
|
|
3326
4199
|
continue;
|
|
3327
4200
|
}
|
|
3328
4201
|
}
|
|
4202
|
+
const _perf_t291 = Date.now();
|
|
4203
|
+
logEvent("[verifyPageTitle] before: _screenshot");
|
|
3329
4204
|
await _screenshot(state, this);
|
|
4205
|
+
logEvent(`[verifyPageTitle] after: _screenshot took ${Date.now() - _perf_t291}ms`);
|
|
3330
4206
|
return state.info;
|
|
3331
4207
|
}
|
|
3332
4208
|
}
|
|
3333
4209
|
catch (e) {
|
|
3334
4210
|
state.info.failCause.lastError = e.message;
|
|
3335
4211
|
state.info.failCause.assertionFailed = true;
|
|
4212
|
+
const _perf_t292 = Date.now();
|
|
4213
|
+
logEvent("[verifyPageTitle] before: _commandError");
|
|
3336
4214
|
await _commandError(state, e, this);
|
|
4215
|
+
logEvent(`[verifyPageTitle] after: _commandError took ${Date.now() - _perf_t292}ms`);
|
|
3337
4216
|
}
|
|
3338
4217
|
finally {
|
|
4218
|
+
const _perf_t293 = Date.now();
|
|
4219
|
+
logEvent("[verifyPageTitle] before: _commandFinally");
|
|
3339
4220
|
await _commandFinally(state, this);
|
|
4221
|
+
logEvent(`[verifyPageTitle] after: _commandFinally took ${Date.now() - _perf_t293}ms`);
|
|
3340
4222
|
}
|
|
3341
4223
|
}
|
|
3342
4224
|
async findTextInAllFrames(dateAlternatives, numberAlternatives, text, state, partial = true, ignoreCase = false) {
|
|
@@ -3346,20 +4228,29 @@ class StableBrowser {
|
|
|
3346
4228
|
for (let i = 0; i < frames.length; i++) {
|
|
3347
4229
|
if (dateAlternatives.date) {
|
|
3348
4230
|
for (let j = 0; j < dateAlternatives.dates.length; j++) {
|
|
4231
|
+
const _perf_t294 = Date.now();
|
|
4232
|
+
logEvent("[findTextInAllFrames] before: _locateElementByText");
|
|
3349
4233
|
const result = await this._locateElementByText(frames[i], dateAlternatives.dates[j], "*:not(script, style, head)", false, partial, ignoreCase, {});
|
|
4234
|
+
logEvent(`[findTextInAllFrames] after: _locateElementByText took ${Date.now() - _perf_t294}ms`);
|
|
3350
4235
|
result.frame = frames[i];
|
|
3351
4236
|
results.push(result);
|
|
3352
4237
|
}
|
|
3353
4238
|
}
|
|
3354
4239
|
else if (numberAlternatives.number) {
|
|
3355
4240
|
for (let j = 0; j < numberAlternatives.numbers.length; j++) {
|
|
4241
|
+
const _perf_t295 = Date.now();
|
|
4242
|
+
logEvent("[findTextInAllFrames] before: _locateElementByText");
|
|
3356
4243
|
const result = await this._locateElementByText(frames[i], numberAlternatives.numbers[j], "*:not(script, style, head)", false, partial, ignoreCase, {});
|
|
4244
|
+
logEvent(`[findTextInAllFrames] after: _locateElementByText took ${Date.now() - _perf_t295}ms`);
|
|
3357
4245
|
result.frame = frames[i];
|
|
3358
4246
|
results.push(result);
|
|
3359
4247
|
}
|
|
3360
4248
|
}
|
|
3361
4249
|
else {
|
|
4250
|
+
const _perf_t296 = Date.now();
|
|
4251
|
+
logEvent("[findTextInAllFrames] before: _locateElementByText");
|
|
3362
4252
|
const result = await this._locateElementByText(frames[i], text, "*:not(script, style, head)", false, partial, ignoreCase, {});
|
|
4253
|
+
logEvent(`[findTextInAllFrames] after: _locateElementByText took ${Date.now() - _perf_t296}ms`);
|
|
3363
4254
|
result.frame = frames[i];
|
|
3364
4255
|
results.push(result);
|
|
3365
4256
|
}
|
|
@@ -3391,13 +4282,22 @@ class StableBrowser {
|
|
|
3391
4282
|
let stepFastMode = this.stepTags.includes("fast-mode");
|
|
3392
4283
|
if (!stepFastMode) {
|
|
3393
4284
|
if (!this.fastMode) {
|
|
4285
|
+
const _perf_t297 = Date.now();
|
|
4286
|
+
logEvent("[verifyTextExistInPage] before: new Promise");
|
|
3394
4287
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
4288
|
+
logEvent(`[verifyTextExistInPage] after: new Promise took ${Date.now() - _perf_t297}ms`);
|
|
3395
4289
|
}
|
|
3396
4290
|
else {
|
|
4291
|
+
const _perf_t298 = Date.now();
|
|
4292
|
+
logEvent("[verifyTextExistInPage] before: new Promise");
|
|
3397
4293
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
4294
|
+
logEvent(`[verifyTextExistInPage] after: new Promise took ${Date.now() - _perf_t298}ms`);
|
|
3398
4295
|
}
|
|
3399
4296
|
}
|
|
4297
|
+
const _perf_t299 = Date.now();
|
|
4298
|
+
logEvent("[verifyTextExistInPage] before: _replaceWithLocalData");
|
|
3400
4299
|
const newValue = await this._replaceWithLocalData(text, world);
|
|
4300
|
+
logEvent(`[verifyTextExistInPage] after: _replaceWithLocalData took ${Date.now() - _perf_t299}ms`);
|
|
3401
4301
|
if (newValue !== text) {
|
|
3402
4302
|
this.logger.info(text + "=" + newValue);
|
|
3403
4303
|
text = newValue;
|
|
@@ -3410,14 +4310,20 @@ class StableBrowser {
|
|
|
3410
4310
|
state.highlight = false;
|
|
3411
4311
|
}
|
|
3412
4312
|
try {
|
|
4313
|
+
const _perf_t300 = Date.now();
|
|
4314
|
+
logEvent("[verifyTextExistInPage] before: _preCommand");
|
|
3413
4315
|
await _preCommand(state, this);
|
|
4316
|
+
logEvent(`[verifyTextExistInPage] after: _preCommand took ${Date.now() - _perf_t300}ms`);
|
|
3414
4317
|
state.info.text = text;
|
|
3415
4318
|
while (true) {
|
|
3416
4319
|
let resultWithElementsFound = {
|
|
3417
4320
|
length: 0,
|
|
3418
4321
|
};
|
|
3419
4322
|
try {
|
|
4323
|
+
const _perf_t301 = Date.now();
|
|
4324
|
+
logEvent("[verifyTextExistInPage] before: findTextInAllFrames");
|
|
3420
4325
|
resultWithElementsFound = await this.findTextInAllFrames(dateAlternatives, numberAlternatives, text, state);
|
|
4326
|
+
logEvent(`[verifyTextExistInPage] after: findTextInAllFrames took ${Date.now() - _perf_t301}ms`);
|
|
3421
4327
|
}
|
|
3422
4328
|
catch (error) {
|
|
3423
4329
|
// ignore
|
|
@@ -3426,21 +4332,39 @@ class StableBrowser {
|
|
|
3426
4332
|
if (Date.now() - state.startTime > timeout) {
|
|
3427
4333
|
throw new Error(`Text ${text} not found in page`);
|
|
3428
4334
|
}
|
|
4335
|
+
const _perf_t302 = Date.now();
|
|
4336
|
+
logEvent("[verifyTextExistInPage] before: new Promise");
|
|
3429
4337
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4338
|
+
logEvent(`[verifyTextExistInPage] after: new Promise took ${Date.now() - _perf_t302}ms`);
|
|
3430
4339
|
continue;
|
|
3431
4340
|
}
|
|
3432
4341
|
try {
|
|
3433
4342
|
if (resultWithElementsFound[0].randomToken) {
|
|
3434
4343
|
const frame = resultWithElementsFound[0].frame;
|
|
3435
4344
|
const dataAttribute = `[data-blinq-id-${resultWithElementsFound[0].randomToken}]`;
|
|
4345
|
+
const _perf_t303 = Date.now();
|
|
4346
|
+
logEvent("[verifyTextExistInPage] before: _highlightElements");
|
|
3436
4347
|
await this._highlightElements(frame, dataAttribute);
|
|
4348
|
+
logEvent(`[verifyTextExistInPage] after: _highlightElements took ${Date.now() - _perf_t303}ms`);
|
|
4349
|
+
const _perf_t304 = Date.now();
|
|
4350
|
+
logEvent("[verifyTextExistInPage] before: frame.locator");
|
|
3437
4351
|
const element = await frame.locator(dataAttribute).first();
|
|
4352
|
+
logEvent(`[verifyTextExistInPage] after: frame.locator took ${Date.now() - _perf_t304}ms`);
|
|
3438
4353
|
if (element) {
|
|
4354
|
+
const _perf_t305 = Date.now();
|
|
4355
|
+
logEvent("[verifyTextExistInPage] before: scrollIfNeeded");
|
|
3439
4356
|
await this.scrollIfNeeded(element, state.info);
|
|
4357
|
+
logEvent(`[verifyTextExistInPage] after: scrollIfNeeded took ${Date.now() - _perf_t305}ms`);
|
|
4358
|
+
const _perf_t306 = Date.now();
|
|
4359
|
+
logEvent("[verifyTextExistInPage] before: element.dispatchEvent");
|
|
3440
4360
|
await element.dispatchEvent("bvt_verify_page_contains_text");
|
|
4361
|
+
logEvent(`[verifyTextExistInPage] after: element.dispatchEvent took ${Date.now() - _perf_t306}ms`);
|
|
3441
4362
|
}
|
|
3442
4363
|
}
|
|
4364
|
+
const _perf_t307 = Date.now();
|
|
4365
|
+
logEvent("[verifyTextExistInPage] before: _screenshot");
|
|
3443
4366
|
await _screenshot(state, this);
|
|
4367
|
+
logEvent(`[verifyTextExistInPage] after: _screenshot took ${Date.now() - _perf_t307}ms`);
|
|
3444
4368
|
return state.info;
|
|
3445
4369
|
}
|
|
3446
4370
|
catch (error) {
|
|
@@ -3449,10 +4373,16 @@ class StableBrowser {
|
|
|
3449
4373
|
}
|
|
3450
4374
|
}
|
|
3451
4375
|
catch (e) {
|
|
4376
|
+
const _perf_t308 = Date.now();
|
|
4377
|
+
logEvent("[verifyTextExistInPage] before: _commandError");
|
|
3452
4378
|
await _commandError(state, e, this);
|
|
4379
|
+
logEvent(`[verifyTextExistInPage] after: _commandError took ${Date.now() - _perf_t308}ms`);
|
|
3453
4380
|
}
|
|
3454
4381
|
finally {
|
|
4382
|
+
const _perf_t309 = Date.now();
|
|
4383
|
+
logEvent("[verifyTextExistInPage] before: _commandFinally");
|
|
3455
4384
|
await _commandFinally(state, this);
|
|
4385
|
+
logEvent(`[verifyTextExistInPage] after: _commandFinally took ${Date.now() - _perf_t309}ms`);
|
|
3456
4386
|
}
|
|
3457
4387
|
}
|
|
3458
4388
|
async waitForTextToDisappear(text, options = {}, world = null) {
|
|
@@ -3474,8 +4404,14 @@ class StableBrowser {
|
|
|
3474
4404
|
text = text.replace(/\\"/g, '"');
|
|
3475
4405
|
}
|
|
3476
4406
|
const timeout = this._getFindElementTimeout(options);
|
|
4407
|
+
const _perf_t310 = Date.now();
|
|
4408
|
+
logEvent("[waitForTextToDisappear] before: new Promise");
|
|
3477
4409
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
4410
|
+
logEvent(`[waitForTextToDisappear] after: new Promise took ${Date.now() - _perf_t310}ms`);
|
|
4411
|
+
const _perf_t311 = Date.now();
|
|
4412
|
+
logEvent("[waitForTextToDisappear] before: _replaceWithLocalData");
|
|
3478
4413
|
const newValue = await this._replaceWithLocalData(text, world);
|
|
4414
|
+
logEvent(`[waitForTextToDisappear] after: _replaceWithLocalData took ${Date.now() - _perf_t311}ms`);
|
|
3479
4415
|
if (newValue !== text) {
|
|
3480
4416
|
this.logger.info(text + "=" + newValue);
|
|
3481
4417
|
text = newValue;
|
|
@@ -3483,33 +4419,51 @@ class StableBrowser {
|
|
|
3483
4419
|
let dateAlternatives = findDateAlternatives(text);
|
|
3484
4420
|
let numberAlternatives = findNumberAlternatives(text);
|
|
3485
4421
|
try {
|
|
4422
|
+
const _perf_t312 = Date.now();
|
|
4423
|
+
logEvent("[waitForTextToDisappear] before: _preCommand");
|
|
3486
4424
|
await _preCommand(state, this);
|
|
4425
|
+
logEvent(`[waitForTextToDisappear] after: _preCommand took ${Date.now() - _perf_t312}ms`);
|
|
3487
4426
|
state.info.text = text;
|
|
3488
4427
|
let resultWithElementsFound = {
|
|
3489
4428
|
length: null, // initial cannot be 0
|
|
3490
4429
|
};
|
|
3491
4430
|
while (true) {
|
|
3492
4431
|
try {
|
|
4432
|
+
const _perf_t313 = Date.now();
|
|
4433
|
+
logEvent("[waitForTextToDisappear] before: findTextInAllFrames");
|
|
3493
4434
|
resultWithElementsFound = await this.findTextInAllFrames(dateAlternatives, numberAlternatives, text, state);
|
|
4435
|
+
logEvent(`[waitForTextToDisappear] after: findTextInAllFrames took ${Date.now() - _perf_t313}ms`);
|
|
3494
4436
|
}
|
|
3495
4437
|
catch (error) {
|
|
3496
4438
|
// ignore
|
|
3497
4439
|
}
|
|
3498
4440
|
if (resultWithElementsFound.length === 0) {
|
|
4441
|
+
const _perf_t314 = Date.now();
|
|
4442
|
+
logEvent("[waitForTextToDisappear] before: _screenshot");
|
|
3499
4443
|
await _screenshot(state, this);
|
|
4444
|
+
logEvent(`[waitForTextToDisappear] after: _screenshot took ${Date.now() - _perf_t314}ms`);
|
|
3500
4445
|
return state.info;
|
|
3501
4446
|
}
|
|
3502
4447
|
if (Date.now() - state.startTime > timeout) {
|
|
3503
4448
|
throw new Error(`Text ${text} found in page`);
|
|
3504
4449
|
}
|
|
4450
|
+
const _perf_t315 = Date.now();
|
|
4451
|
+
logEvent("[waitForTextToDisappear] before: new Promise");
|
|
3505
4452
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4453
|
+
logEvent(`[waitForTextToDisappear] after: new Promise took ${Date.now() - _perf_t315}ms`);
|
|
3506
4454
|
}
|
|
3507
4455
|
}
|
|
3508
4456
|
catch (e) {
|
|
4457
|
+
const _perf_t316 = Date.now();
|
|
4458
|
+
logEvent("[waitForTextToDisappear] before: _commandError");
|
|
3509
4459
|
await _commandError(state, e, this);
|
|
4460
|
+
logEvent(`[waitForTextToDisappear] after: _commandError took ${Date.now() - _perf_t316}ms`);
|
|
3510
4461
|
}
|
|
3511
4462
|
finally {
|
|
4463
|
+
const _perf_t317 = Date.now();
|
|
4464
|
+
logEvent("[waitForTextToDisappear] before: _commandFinally");
|
|
3512
4465
|
await _commandFinally(state, this);
|
|
4466
|
+
logEvent(`[waitForTextToDisappear] after: _commandFinally took ${Date.now() - _perf_t317}ms`);
|
|
3513
4467
|
}
|
|
3514
4468
|
}
|
|
3515
4469
|
async verifyTextRelatedToText(textAnchor, climb, textToVerify, options = {}, world = null) {
|
|
@@ -3531,13 +4485,22 @@ class StableBrowser {
|
|
|
3531
4485
|
const cmdStartTime = Date.now();
|
|
3532
4486
|
let cmdEndTime = null;
|
|
3533
4487
|
const timeout = this._getFindElementTimeout(options);
|
|
4488
|
+
const _perf_t318 = Date.now();
|
|
4489
|
+
logEvent("[verifyTextRelatedToText] before: new Promise");
|
|
3534
4490
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
4491
|
+
logEvent(`[verifyTextRelatedToText] after: new Promise took ${Date.now() - _perf_t318}ms`);
|
|
4492
|
+
const _perf_t319 = Date.now();
|
|
4493
|
+
logEvent("[verifyTextRelatedToText] before: _replaceWithLocalData");
|
|
3535
4494
|
let newValue = await this._replaceWithLocalData(textAnchor, world);
|
|
4495
|
+
logEvent(`[verifyTextRelatedToText] after: _replaceWithLocalData took ${Date.now() - _perf_t319}ms`);
|
|
3536
4496
|
if (newValue !== textAnchor) {
|
|
3537
4497
|
this.logger.info(textAnchor + "=" + newValue);
|
|
3538
4498
|
textAnchor = newValue;
|
|
3539
4499
|
}
|
|
4500
|
+
const _perf_t320 = Date.now();
|
|
4501
|
+
logEvent("[verifyTextRelatedToText] before: _replaceWithLocalData");
|
|
3540
4502
|
newValue = await this._replaceWithLocalData(textToVerify, world);
|
|
4503
|
+
logEvent(`[verifyTextRelatedToText] after: _replaceWithLocalData took ${Date.now() - _perf_t320}ms`);
|
|
3541
4504
|
if (newValue !== textToVerify) {
|
|
3542
4505
|
this.logger.info(textToVerify + "=" + newValue);
|
|
3543
4506
|
textToVerify = newValue;
|
|
@@ -3546,14 +4509,20 @@ class StableBrowser {
|
|
|
3546
4509
|
let numberAlternatives = findNumberAlternatives(textToVerify);
|
|
3547
4510
|
let foundAncore = false;
|
|
3548
4511
|
try {
|
|
4512
|
+
const _perf_t321 = Date.now();
|
|
4513
|
+
logEvent("[verifyTextRelatedToText] before: _preCommand");
|
|
3549
4514
|
await _preCommand(state, this);
|
|
4515
|
+
logEvent(`[verifyTextRelatedToText] after: _preCommand took ${Date.now() - _perf_t321}ms`);
|
|
3550
4516
|
state.info.text = textToVerify;
|
|
3551
4517
|
let resultWithElementsFound = {
|
|
3552
4518
|
length: 0,
|
|
3553
4519
|
};
|
|
3554
4520
|
while (true) {
|
|
3555
4521
|
try {
|
|
4522
|
+
const _perf_t322 = Date.now();
|
|
4523
|
+
logEvent("[verifyTextRelatedToText] before: findTextInAllFrames");
|
|
3556
4524
|
resultWithElementsFound = await this.findTextInAllFrames(findDateAlternatives(textAnchor), findNumberAlternatives(textAnchor), textAnchor, state, false);
|
|
4525
|
+
logEvent(`[verifyTextRelatedToText] after: findTextInAllFrames took ${Date.now() - _perf_t322}ms`);
|
|
3557
4526
|
}
|
|
3558
4527
|
catch (error) {
|
|
3559
4528
|
// ignore
|
|
@@ -3562,7 +4531,10 @@ class StableBrowser {
|
|
|
3562
4531
|
if (Date.now() - state.startTime > timeout) {
|
|
3563
4532
|
throw new Error(`Text ${foundAncore ? textToVerify : textAnchor} not found in page`);
|
|
3564
4533
|
}
|
|
4534
|
+
const _perf_t323 = Date.now();
|
|
4535
|
+
logEvent("[verifyTextRelatedToText] before: new Promise");
|
|
3565
4536
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
4537
|
+
logEvent(`[verifyTextRelatedToText] after: new Promise took ${Date.now() - _perf_t323}ms`);
|
|
3566
4538
|
continue;
|
|
3567
4539
|
}
|
|
3568
4540
|
else {
|
|
@@ -3591,13 +4563,25 @@ class StableBrowser {
|
|
|
3591
4563
|
if (Number(climb) > 0) {
|
|
3592
4564
|
css = css + " >> " + climbXpath;
|
|
3593
4565
|
}
|
|
4566
|
+
const _perf_t324 = Date.now();
|
|
4567
|
+
logEvent("[verifyTextRelatedToText] before: frame.locator");
|
|
3594
4568
|
const count = await frame.locator(css).count();
|
|
4569
|
+
logEvent(`[verifyTextRelatedToText] after: frame.locator took ${Date.now() - _perf_t324}ms`);
|
|
3595
4570
|
for (let j = 0; j < count; j++) {
|
|
4571
|
+
const _perf_t325 = Date.now();
|
|
4572
|
+
logEvent("[verifyTextRelatedToText] before: frame.locator");
|
|
3596
4573
|
const continer = await frame.locator(css).nth(j);
|
|
4574
|
+
logEvent(`[verifyTextRelatedToText] after: frame.locator took ${Date.now() - _perf_t325}ms`);
|
|
4575
|
+
const _perf_t326 = Date.now();
|
|
4576
|
+
logEvent("[verifyTextRelatedToText] before: _locateElementByText");
|
|
3597
4577
|
const result = await this._locateElementByText(continer, textToVerify, "*:not(script, style, head)", false, true, true, {});
|
|
4578
|
+
logEvent(`[verifyTextRelatedToText] after: _locateElementByText took ${Date.now() - _perf_t326}ms`);
|
|
3598
4579
|
if (result.elementCount > 0) {
|
|
3599
4580
|
const dataAttribute = "[data-blinq-id-" + result.randomToken + "]";
|
|
4581
|
+
const _perf_t327 = Date.now();
|
|
4582
|
+
logEvent("[verifyTextRelatedToText] before: _highlightElements");
|
|
3600
4583
|
await this._highlightElements(frame, dataAttribute);
|
|
4584
|
+
logEvent(`[verifyTextRelatedToText] after: _highlightElements took ${Date.now() - _perf_t327}ms`);
|
|
3601
4585
|
//const cssAnchor = `[data-blinq-id="blinq-id-${token}-anchor"]`;
|
|
3602
4586
|
// if (world && world.screenshot && !world.screenshotPath) {
|
|
3603
4587
|
// console.log(`Highlighting for vtrt while running from recorder`);
|
|
@@ -3612,14 +4596,26 @@ class StableBrowser {
|
|
|
3612
4596
|
// .catch(e);
|
|
3613
4597
|
// }
|
|
3614
4598
|
//await this._highlightElements(frame, cssAnchor);
|
|
4599
|
+
const _perf_t328 = Date.now();
|
|
4600
|
+
logEvent("[verifyTextRelatedToText] before: frame.locator");
|
|
3615
4601
|
const element = await frame.locator(dataAttribute).first();
|
|
4602
|
+
logEvent(`[verifyTextRelatedToText] after: frame.locator took ${Date.now() - _perf_t328}ms`);
|
|
3616
4603
|
// await new Promise((resolve) => setTimeout(resolve, 100));
|
|
3617
4604
|
// await this._unhighlightElements(frame, dataAttribute);
|
|
3618
4605
|
if (element) {
|
|
4606
|
+
const _perf_t329 = Date.now();
|
|
4607
|
+
logEvent("[verifyTextRelatedToText] before: scrollIfNeeded");
|
|
3619
4608
|
await this.scrollIfNeeded(element, state.info);
|
|
4609
|
+
logEvent(`[verifyTextRelatedToText] after: scrollIfNeeded took ${Date.now() - _perf_t329}ms`);
|
|
4610
|
+
const _perf_t330 = Date.now();
|
|
4611
|
+
logEvent("[verifyTextRelatedToText] before: element.dispatchEvent");
|
|
3620
4612
|
await element.dispatchEvent("bvt_verify_page_contains_text");
|
|
4613
|
+
logEvent(`[verifyTextRelatedToText] after: element.dispatchEvent took ${Date.now() - _perf_t330}ms`);
|
|
3621
4614
|
}
|
|
4615
|
+
const _perf_t331 = Date.now();
|
|
4616
|
+
logEvent("[verifyTextRelatedToText] before: _screenshot");
|
|
3622
4617
|
await _screenshot(state, this);
|
|
4618
|
+
logEvent(`[verifyTextRelatedToText] after: _screenshot took ${Date.now() - _perf_t331}ms`);
|
|
3623
4619
|
return state.info;
|
|
3624
4620
|
}
|
|
3625
4621
|
}
|
|
@@ -3632,10 +4628,16 @@ class StableBrowser {
|
|
|
3632
4628
|
// await expect(element).toHaveCount(1, { timeout: 10000 });
|
|
3633
4629
|
}
|
|
3634
4630
|
catch (e) {
|
|
4631
|
+
const _perf_t332 = Date.now();
|
|
4632
|
+
logEvent("[verifyTextRelatedToText] before: _commandError");
|
|
3635
4633
|
await _commandError(state, e, this);
|
|
4634
|
+
logEvent(`[verifyTextRelatedToText] after: _commandError took ${Date.now() - _perf_t332}ms`);
|
|
3636
4635
|
}
|
|
3637
4636
|
finally {
|
|
4637
|
+
const _perf_t333 = Date.now();
|
|
4638
|
+
logEvent("[verifyTextRelatedToText] before: _commandFinally");
|
|
3638
4639
|
await _commandFinally(state, this);
|
|
4640
|
+
logEvent(`[verifyTextRelatedToText] after: _commandFinally took ${Date.now() - _perf_t333}ms`);
|
|
3639
4641
|
}
|
|
3640
4642
|
}
|
|
3641
4643
|
async findRelatedTextInAllFrames(textAnchor, climb, textToVerify, params = {}, options = {}, world = null) {
|
|
@@ -3643,7 +4645,10 @@ class StableBrowser {
|
|
|
3643
4645
|
let results = [];
|
|
3644
4646
|
let ignoreCase = false;
|
|
3645
4647
|
for (let i = 0; i < frames.length; i++) {
|
|
4648
|
+
const _perf_t334 = Date.now();
|
|
4649
|
+
logEvent("[findRelatedTextInAllFrames] before: _locateElementByText");
|
|
3646
4650
|
const result = await this._locateElementByText(frames[i], textAnchor, "*:not(script, style, head)", false, true, ignoreCase, {});
|
|
4651
|
+
logEvent(`[findRelatedTextInAllFrames] after: _locateElementByText took ${Date.now() - _perf_t334}ms`);
|
|
3647
4652
|
result.frame = frames[i];
|
|
3648
4653
|
const climbArray = [];
|
|
3649
4654
|
for (let i = 0; i < climb; i++) {
|
|
@@ -3651,7 +4656,10 @@ class StableBrowser {
|
|
|
3651
4656
|
}
|
|
3652
4657
|
let climbXpath = "xpath=" + climbArray.join("/");
|
|
3653
4658
|
const newLocator = `[data-blinq-id-${result.randomToken}] ${climb > 0 ? ">> " + climbXpath : ""} >> internal:text=${testForRegex(textToVerify) ? textToVerify : unEscapeString(textToVerify)}`;
|
|
4659
|
+
const _perf_t335 = Date.now();
|
|
4660
|
+
logEvent("[findRelatedTextInAllFrames] before: frames[i]");
|
|
3654
4661
|
const count = await frames[i].locator(newLocator).count();
|
|
4662
|
+
logEvent(`[findRelatedTextInAllFrames] after: frames[i] took ${Date.now() - _perf_t335}ms`);
|
|
3655
4663
|
if (count > 0) {
|
|
3656
4664
|
result.elementCount = count;
|
|
3657
4665
|
result.locator = newLocator;
|
|
@@ -3667,7 +4675,10 @@ class StableBrowser {
|
|
|
3667
4675
|
let error = null;
|
|
3668
4676
|
let screenshotId = null;
|
|
3669
4677
|
let screenshotPath = null;
|
|
4678
|
+
const _perf_t336 = Date.now();
|
|
4679
|
+
logEvent("[visualVerification] before: new Promise");
|
|
3670
4680
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
4681
|
+
logEvent(`[visualVerification] after: new Promise took ${Date.now() - _perf_t336}ms`);
|
|
3671
4682
|
const info = {};
|
|
3672
4683
|
info.log = "";
|
|
3673
4684
|
info.operation = "visualVerification";
|
|
@@ -3679,7 +4690,10 @@ class StableBrowser {
|
|
|
3679
4690
|
let serviceUrl = _getServerUrl();
|
|
3680
4691
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world, info));
|
|
3681
4692
|
info.screenshotPath = screenshotPath;
|
|
4693
|
+
const _perf_t337 = Date.now();
|
|
4694
|
+
logEvent("[visualVerification] before: takeScreenshot");
|
|
3682
4695
|
const screenshot = await this.takeScreenshot();
|
|
4696
|
+
logEvent(`[visualVerification] after: takeScreenshot took ${Date.now() - _perf_t337}ms`);
|
|
3683
4697
|
let request = {
|
|
3684
4698
|
method: "post",
|
|
3685
4699
|
maxBodyLength: Infinity,
|
|
@@ -3695,7 +4709,10 @@ class StableBrowser {
|
|
|
3695
4709
|
screenshot: screenshot,
|
|
3696
4710
|
}),
|
|
3697
4711
|
};
|
|
4712
|
+
const _perf_t338 = Date.now();
|
|
4713
|
+
logEvent("[visualVerification] before: axios.request");
|
|
3698
4714
|
const result = await axios.request(request);
|
|
4715
|
+
logEvent(`[visualVerification] after: axios.request took ${Date.now() - _perf_t338}ms`);
|
|
3699
4716
|
if (result.data.status !== true) {
|
|
3700
4717
|
throw new Error("Visual validation failed");
|
|
3701
4718
|
}
|
|
@@ -3716,7 +4733,10 @@ class StableBrowser {
|
|
|
3716
4733
|
Object.assign(e, { info: info });
|
|
3717
4734
|
error = e;
|
|
3718
4735
|
// throw e;
|
|
4736
|
+
const _perf_t339 = Date.now();
|
|
4737
|
+
logEvent("[visualVerification] before: _commandError");
|
|
3719
4738
|
await _commandError({ text: "visualVerification", operation: "visualVerification", info }, e, this);
|
|
4739
|
+
logEvent(`[visualVerification] after: _commandError took ${Date.now() - _perf_t339}ms`);
|
|
3720
4740
|
}
|
|
3721
4741
|
finally {
|
|
3722
4742
|
const endTime = Date.now();
|
|
@@ -3742,7 +4762,10 @@ class StableBrowser {
|
|
|
3742
4762
|
}
|
|
3743
4763
|
}
|
|
3744
4764
|
async verifyTableData(selectors, data, _params = null, options = {}, world = null) {
|
|
4765
|
+
const _perf_t340 = Date.now();
|
|
4766
|
+
logEvent("[verifyTableData] before: getTableData");
|
|
3745
4767
|
const tableData = await this.getTableData(selectors, _params, options, world);
|
|
4768
|
+
logEvent(`[verifyTableData] after: getTableData took ${Date.now() - _perf_t340}ms`);
|
|
3746
4769
|
for (let i = 0; i < data.length; i++) {
|
|
3747
4770
|
const row = data[i];
|
|
3748
4771
|
const rowText = JSON.stringify(row);
|
|
@@ -3773,9 +4796,15 @@ class StableBrowser {
|
|
|
3773
4796
|
info.operation = "getTableData";
|
|
3774
4797
|
info.selectors = selectors;
|
|
3775
4798
|
try {
|
|
4799
|
+
const _perf_t341 = Date.now();
|
|
4800
|
+
logEvent("[getTableData] before: _locate");
|
|
3776
4801
|
let table = await this._locate(selectors, info, _params);
|
|
4802
|
+
logEvent(`[getTableData] after: _locate took ${Date.now() - _perf_t341}ms`);
|
|
3777
4803
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world, info));
|
|
4804
|
+
const _perf_t342 = Date.now();
|
|
4805
|
+
logEvent("[getTableData] before: getTableData");
|
|
3778
4806
|
const tableData = await getTableData(this.page, table);
|
|
4807
|
+
logEvent(`[getTableData] after: getTableData took ${Date.now() - _perf_t342}ms`);
|
|
3779
4808
|
return tableData;
|
|
3780
4809
|
}
|
|
3781
4810
|
catch (e) {
|
|
@@ -3786,7 +4815,10 @@ class StableBrowser {
|
|
|
3786
4815
|
Object.assign(e, { info: info });
|
|
3787
4816
|
error = e;
|
|
3788
4817
|
// throw e;
|
|
4818
|
+
const _perf_t343 = Date.now();
|
|
4819
|
+
logEvent("[getTableData] before: _commandError");
|
|
3789
4820
|
await _commandError({ text: "getTableData", operation: "getTableData", selectors, info }, e, this);
|
|
4821
|
+
logEvent(`[getTableData] after: _commandError took ${Date.now() - _perf_t343}ms`);
|
|
3790
4822
|
}
|
|
3791
4823
|
finally {
|
|
3792
4824
|
const endTime = Date.now();
|
|
@@ -3822,7 +4854,10 @@ class StableBrowser {
|
|
|
3822
4854
|
if (!value) {
|
|
3823
4855
|
throw new Error("value is null");
|
|
3824
4856
|
}
|
|
4857
|
+
const _perf_t344 = Date.now();
|
|
4858
|
+
logEvent("[analyzeTable] before: _replaceWithLocalData");
|
|
3825
4859
|
const newValue = await this._replaceWithLocalData(value, world);
|
|
4860
|
+
logEvent(`[analyzeTable] after: _replaceWithLocalData took ${Date.now() - _perf_t344}ms`);
|
|
3826
4861
|
if (newValue !== value) {
|
|
3827
4862
|
this.logger.info(value + "=" + newValue);
|
|
3828
4863
|
value = newValue;
|
|
@@ -3850,9 +4885,15 @@ class StableBrowser {
|
|
|
3850
4885
|
info.operator = operator;
|
|
3851
4886
|
info.value = value;
|
|
3852
4887
|
try {
|
|
4888
|
+
const _perf_t345 = Date.now();
|
|
4889
|
+
logEvent("[analyzeTable] before: _locate");
|
|
3853
4890
|
let table = await this._locate(selectors, info, _params);
|
|
4891
|
+
logEvent(`[analyzeTable] after: _locate took ${Date.now() - _perf_t345}ms`);
|
|
3854
4892
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world, info));
|
|
4893
|
+
const _perf_t346 = Date.now();
|
|
4894
|
+
logEvent("[analyzeTable] before: getTableCells");
|
|
3855
4895
|
const cells = await getTableCells(this.page, table, query, info);
|
|
4896
|
+
logEvent(`[analyzeTable] after: getTableCells took ${Date.now() - _perf_t346}ms`);
|
|
3856
4897
|
if (cells && cells.error) {
|
|
3857
4898
|
throw new Error(cells.error);
|
|
3858
4899
|
}
|
|
@@ -3952,7 +4993,10 @@ class StableBrowser {
|
|
|
3952
4993
|
Object.assign(e, { info: info });
|
|
3953
4994
|
error = e;
|
|
3954
4995
|
// throw e;
|
|
4996
|
+
const _perf_t347 = Date.now();
|
|
4997
|
+
logEvent("[analyzeTable] before: _commandError");
|
|
3955
4998
|
await _commandError({ text: "analyzeTable", operation: "analyzeTable", selectors, query, operator, value }, e, this);
|
|
4999
|
+
logEvent(`[analyzeTable] after: _commandError took ${Date.now() - _perf_t347}ms`);
|
|
3956
5000
|
}
|
|
3957
5001
|
finally {
|
|
3958
5002
|
const endTime = Date.now();
|
|
@@ -4000,23 +5044,38 @@ class StableBrowser {
|
|
|
4000
5044
|
log: `***** Sleep for ${duration} ms *****\n`,
|
|
4001
5045
|
};
|
|
4002
5046
|
try {
|
|
5047
|
+
const _perf_t348 = Date.now();
|
|
5048
|
+
logEvent("[sleep] before: _preCommand");
|
|
4003
5049
|
await _preCommand(state, this);
|
|
5050
|
+
logEvent(`[sleep] after: _preCommand took ${Date.now() - _perf_t348}ms`);
|
|
4004
5051
|
if (duration < 0) {
|
|
4005
5052
|
throw new Error("Sleep duration cannot be negative");
|
|
4006
5053
|
}
|
|
5054
|
+
const _perf_t349 = Date.now();
|
|
5055
|
+
logEvent("[sleep] before: new Promise");
|
|
4007
5056
|
await new Promise((resolve) => setTimeout(resolve, duration));
|
|
5057
|
+
logEvent(`[sleep] after: new Promise took ${Date.now() - _perf_t349}ms`);
|
|
4008
5058
|
return state.info;
|
|
4009
5059
|
}
|
|
4010
5060
|
catch (e) {
|
|
5061
|
+
const _perf_t350 = Date.now();
|
|
5062
|
+
logEvent("[sleep] before: _commandError");
|
|
4011
5063
|
await _commandError(state, e, this);
|
|
5064
|
+
logEvent(`[sleep] after: _commandError took ${Date.now() - _perf_t350}ms`);
|
|
4012
5065
|
}
|
|
4013
5066
|
finally {
|
|
5067
|
+
const _perf_t351 = Date.now();
|
|
5068
|
+
logEvent("[sleep] before: _commandFinally");
|
|
4014
5069
|
await _commandFinally(state, this);
|
|
5070
|
+
logEvent(`[sleep] after: _commandFinally took ${Date.now() - _perf_t351}ms`);
|
|
4015
5071
|
}
|
|
4016
5072
|
}
|
|
4017
5073
|
async _replaceWithLocalData(value, world, _decrypt = true, totpWait = true) {
|
|
4018
5074
|
try {
|
|
5075
|
+
const _perf_t352 = Date.now();
|
|
5076
|
+
logEvent("[_replaceWithLocalData] before: replaceWithLocalTestData");
|
|
4019
5077
|
return await replaceWithLocalTestData(value, world, _decrypt, totpWait, this.context, this);
|
|
5078
|
+
logEvent(`[_replaceWithLocalData] after: replaceWithLocalTestData took ${Date.now() - _perf_t352}ms`);
|
|
4020
5079
|
}
|
|
4021
5080
|
catch (error) {
|
|
4022
5081
|
logEvent(error);
|
|
@@ -4043,25 +5102,43 @@ class StableBrowser {
|
|
|
4043
5102
|
return 30000;
|
|
4044
5103
|
}
|
|
4045
5104
|
async saveStoreState(path = null, world = null) {
|
|
5105
|
+
const _perf_t353 = Date.now();
|
|
5106
|
+
logEvent("[saveStoreState] before: page.context");
|
|
4046
5107
|
const storageState = await this.page.context().storageState();
|
|
5108
|
+
logEvent(`[saveStoreState] after: page.context took ${Date.now() - _perf_t353}ms`);
|
|
5109
|
+
const _perf_t354 = Date.now();
|
|
5110
|
+
logEvent("[saveStoreState] before: _replaceWithLocalData");
|
|
4047
5111
|
path = await this._replaceWithLocalData(path, this.world);
|
|
5112
|
+
logEvent(`[saveStoreState] after: _replaceWithLocalData took ${Date.now() - _perf_t354}ms`);
|
|
4048
5113
|
//const testDataFile = _getDataFile(world, this.context, this);
|
|
4049
5114
|
if (path) {
|
|
4050
5115
|
// save { storageState: storageState } into the path
|
|
4051
5116
|
fs.writeFileSync(path, JSON.stringify({ storageState: storageState }, null, 2));
|
|
4052
5117
|
}
|
|
4053
5118
|
else {
|
|
5119
|
+
const _perf_t355 = Date.now();
|
|
5120
|
+
logEvent("[saveStoreState] before: setTestData");
|
|
4054
5121
|
await this.setTestData({ storageState: storageState }, world);
|
|
5122
|
+
logEvent(`[saveStoreState] after: setTestData took ${Date.now() - _perf_t355}ms`);
|
|
4055
5123
|
}
|
|
4056
5124
|
}
|
|
4057
5125
|
async restoreSaveState(path = null, world = null) {
|
|
5126
|
+
const _perf_t356 = Date.now();
|
|
5127
|
+
logEvent("[restoreSaveState] before: _replaceWithLocalData");
|
|
4058
5128
|
path = await this._replaceWithLocalData(path, this.world);
|
|
5129
|
+
logEvent(`[restoreSaveState] after: _replaceWithLocalData took ${Date.now() - _perf_t356}ms`);
|
|
5130
|
+
const _perf_t357 = Date.now();
|
|
5131
|
+
logEvent("[restoreSaveState] before: refreshBrowser");
|
|
4059
5132
|
await refreshBrowser(this, path, world);
|
|
5133
|
+
logEvent(`[restoreSaveState] after: refreshBrowser took ${Date.now() - _perf_t357}ms`);
|
|
4060
5134
|
this.registerEventListeners(this.context);
|
|
4061
5135
|
registerNetworkEvents(this.world, this, this.context, this.page);
|
|
4062
5136
|
registerDownloadEvent(this.page, this.world, this.context);
|
|
4063
5137
|
if (this.onRestoreSaveState) {
|
|
5138
|
+
const _perf_t358 = Date.now();
|
|
5139
|
+
logEvent("[restoreSaveState] before: onRestoreSaveState");
|
|
4064
5140
|
await this.onRestoreSaveState(path);
|
|
5141
|
+
logEvent(`[restoreSaveState] after: onRestoreSaveState took ${Date.now() - _perf_t358}ms`);
|
|
4065
5142
|
}
|
|
4066
5143
|
}
|
|
4067
5144
|
async waitForPageLoad(options = {}, world = null) {
|
|
@@ -4101,7 +5178,10 @@ class StableBrowser {
|
|
|
4101
5178
|
let screenshotId = null;
|
|
4102
5179
|
let screenshotPath = null;
|
|
4103
5180
|
try {
|
|
5181
|
+
const _perf_t359 = Date.now();
|
|
5182
|
+
logEvent("[waitForPageLoad] before: Promise.all");
|
|
4104
5183
|
await Promise.all(promiseArray);
|
|
5184
|
+
logEvent(`[waitForPageLoad] after: Promise.all took ${Date.now() - _perf_t359}ms`);
|
|
4105
5185
|
}
|
|
4106
5186
|
catch (e) {
|
|
4107
5187
|
if (e.label === "networkidle") {
|
|
@@ -4115,9 +5195,15 @@ class StableBrowser {
|
|
|
4115
5195
|
}
|
|
4116
5196
|
}
|
|
4117
5197
|
finally {
|
|
5198
|
+
const _perf_t360 = Date.now();
|
|
5199
|
+
logEvent("[waitForPageLoad] before: new Promise");
|
|
4118
5200
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
5201
|
+
logEvent(`[waitForPageLoad] after: new Promise took ${Date.now() - _perf_t360}ms`);
|
|
4119
5202
|
if (options && !options.noSleep) {
|
|
5203
|
+
const _perf_t361 = Date.now();
|
|
5204
|
+
logEvent("[waitForPageLoad] before: new Promise");
|
|
4120
5205
|
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
5206
|
+
logEvent(`[waitForPageLoad] after: new Promise took ${Date.now() - _perf_t361}ms`);
|
|
4121
5207
|
}
|
|
4122
5208
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world));
|
|
4123
5209
|
const endTime = Date.now();
|
|
@@ -4155,14 +5241,26 @@ class StableBrowser {
|
|
|
4155
5241
|
// throwError: false,
|
|
4156
5242
|
};
|
|
4157
5243
|
try {
|
|
5244
|
+
const _perf_t362 = Date.now();
|
|
5245
|
+
logEvent("[closePage] before: _preCommand");
|
|
4158
5246
|
await _preCommand(state, this);
|
|
5247
|
+
logEvent(`[closePage] after: _preCommand took ${Date.now() - _perf_t362}ms`);
|
|
5248
|
+
const _perf_t363 = Date.now();
|
|
5249
|
+
logEvent("[closePage] before: page.close");
|
|
4159
5250
|
await this.page.close();
|
|
5251
|
+
logEvent(`[closePage] after: page.close took ${Date.now() - _perf_t363}ms`);
|
|
4160
5252
|
}
|
|
4161
5253
|
catch (e) {
|
|
5254
|
+
const _perf_t364 = Date.now();
|
|
5255
|
+
logEvent("[closePage] before: _commandError");
|
|
4162
5256
|
await _commandError(state, e, this);
|
|
5257
|
+
logEvent(`[closePage] after: _commandError took ${Date.now() - _perf_t364}ms`);
|
|
4163
5258
|
}
|
|
4164
5259
|
finally {
|
|
5260
|
+
const _perf_t365 = Date.now();
|
|
5261
|
+
logEvent("[closePage] before: _commandFinally");
|
|
4165
5262
|
await _commandFinally(state, this);
|
|
5263
|
+
logEvent(`[closePage] after: _commandFinally took ${Date.now() - _perf_t365}ms`);
|
|
4166
5264
|
}
|
|
4167
5265
|
}
|
|
4168
5266
|
async tableCellOperation(headerText, rowText, options, _params, world = null) {
|
|
@@ -4189,12 +5287,18 @@ class StableBrowser {
|
|
|
4189
5287
|
};
|
|
4190
5288
|
const timeout = this._getFindElementTimeout(options);
|
|
4191
5289
|
try {
|
|
5290
|
+
const _perf_t366 = Date.now();
|
|
5291
|
+
logEvent("[tableCellOperation] before: _preCommand");
|
|
4192
5292
|
await _preCommand(state, this);
|
|
5293
|
+
logEvent(`[tableCellOperation] after: _preCommand took ${Date.now() - _perf_t366}ms`);
|
|
4193
5294
|
const start = Date.now();
|
|
4194
5295
|
let cellArea = null;
|
|
4195
5296
|
while (true) {
|
|
4196
5297
|
try {
|
|
5298
|
+
const _perf_t367 = Date.now();
|
|
5299
|
+
logEvent("[tableCellOperation] before: _findCellArea");
|
|
4197
5300
|
cellArea = await _findCellArea(headerText, rowText, this, state);
|
|
5301
|
+
logEvent(`[tableCellOperation] after: _findCellArea took ${Date.now() - _perf_t367}ms`);
|
|
4198
5302
|
if (cellArea) {
|
|
4199
5303
|
break;
|
|
4200
5304
|
}
|
|
@@ -4205,7 +5309,10 @@ class StableBrowser {
|
|
|
4205
5309
|
if (Date.now() - start > timeout) {
|
|
4206
5310
|
throw new Error(`Cell not found in table`);
|
|
4207
5311
|
}
|
|
5312
|
+
const _perf_t368 = Date.now();
|
|
5313
|
+
logEvent("[tableCellOperation] before: new Promise");
|
|
4208
5314
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
5315
|
+
logEvent(`[tableCellOperation] after: new Promise took ${Date.now() - _perf_t368}ms`);
|
|
4209
5316
|
}
|
|
4210
5317
|
switch (operation) {
|
|
4211
5318
|
case "click":
|
|
@@ -4219,48 +5326,75 @@ class StableBrowser {
|
|
|
4219
5326
|
if (options.yOffset) {
|
|
4220
5327
|
yOffset = options.yOffset;
|
|
4221
5328
|
}
|
|
5329
|
+
const _perf_t369 = Date.now();
|
|
5330
|
+
logEvent("[tableCellOperation] before: page.mouse.click");
|
|
4222
5331
|
await this.page.mouse.click(cellArea.x + cellArea.width / 2 + xOffset, cellArea.y + cellArea.height / 2 + yOffset);
|
|
5332
|
+
logEvent(`[tableCellOperation] after: page.mouse.click took ${Date.now() - _perf_t369}ms`);
|
|
4223
5333
|
}
|
|
4224
5334
|
else {
|
|
5335
|
+
const _perf_t370 = Date.now();
|
|
5336
|
+
logEvent("[tableCellOperation] before: findElementsInArea");
|
|
4225
5337
|
const results = await findElementsInArea(options.css, cellArea, this, options);
|
|
5338
|
+
logEvent(`[tableCellOperation] after: findElementsInArea took ${Date.now() - _perf_t370}ms`);
|
|
4226
5339
|
if (results.length === 0) {
|
|
4227
5340
|
throw new Error(`Element not found in cell area`);
|
|
4228
5341
|
}
|
|
4229
5342
|
state.element = results[0];
|
|
5343
|
+
const _perf_t371 = Date.now();
|
|
5344
|
+
logEvent("[tableCellOperation] before: performAction");
|
|
4230
5345
|
await performAction("click", state.element, options, this, state, _params);
|
|
5346
|
+
logEvent(`[tableCellOperation] after: performAction took ${Date.now() - _perf_t371}ms`);
|
|
4231
5347
|
}
|
|
4232
5348
|
break;
|
|
4233
5349
|
case "hover+click":
|
|
4234
5350
|
if (!options.css) {
|
|
4235
5351
|
throw new Error("css is not defined");
|
|
4236
5352
|
}
|
|
5353
|
+
const _perf_t372 = Date.now();
|
|
5354
|
+
logEvent("[tableCellOperation] before: findElementsInArea");
|
|
4237
5355
|
const results = await findElementsInArea(options.css, cellArea, this, options);
|
|
5356
|
+
logEvent(`[tableCellOperation] after: findElementsInArea took ${Date.now() - _perf_t372}ms`);
|
|
4238
5357
|
if (results.length === 0) {
|
|
4239
5358
|
throw new Error(`Element not found in cell area`);
|
|
4240
5359
|
}
|
|
4241
5360
|
state.element = results[0];
|
|
5361
|
+
const _perf_t373 = Date.now();
|
|
5362
|
+
logEvent("[tableCellOperation] before: performAction");
|
|
4242
5363
|
await performAction("hover+click", state.element, options, this, state, _params);
|
|
5364
|
+
logEvent(`[tableCellOperation] after: performAction took ${Date.now() - _perf_t373}ms`);
|
|
4243
5365
|
break;
|
|
4244
5366
|
case "hover":
|
|
4245
5367
|
if (!options.css) {
|
|
4246
5368
|
throw new Error("css is not defined");
|
|
4247
5369
|
}
|
|
5370
|
+
const _perf_t374 = Date.now();
|
|
5371
|
+
logEvent("[tableCellOperation] before: findElementsInArea");
|
|
4248
5372
|
const result1 = await findElementsInArea(options.css, cellArea, this, options);
|
|
5373
|
+
logEvent(`[tableCellOperation] after: findElementsInArea took ${Date.now() - _perf_t374}ms`);
|
|
4249
5374
|
if (result1.length === 0) {
|
|
4250
5375
|
throw new Error(`Element not found in cell area`);
|
|
4251
5376
|
}
|
|
4252
5377
|
state.element = result1[0];
|
|
5378
|
+
const _perf_t375 = Date.now();
|
|
5379
|
+
logEvent("[tableCellOperation] before: performAction");
|
|
4253
5380
|
await performAction("hover", state.element, options, this, state, _params);
|
|
5381
|
+
logEvent(`[tableCellOperation] after: performAction took ${Date.now() - _perf_t375}ms`);
|
|
4254
5382
|
break;
|
|
4255
5383
|
default:
|
|
4256
5384
|
throw new Error("operation is not supported");
|
|
4257
5385
|
}
|
|
4258
5386
|
}
|
|
4259
5387
|
catch (e) {
|
|
5388
|
+
const _perf_t376 = Date.now();
|
|
5389
|
+
logEvent("[tableCellOperation] before: _commandError");
|
|
4260
5390
|
await _commandError(state, e, this);
|
|
5391
|
+
logEvent(`[tableCellOperation] after: _commandError took ${Date.now() - _perf_t376}ms`);
|
|
4261
5392
|
}
|
|
4262
5393
|
finally {
|
|
5394
|
+
const _perf_t377 = Date.now();
|
|
5395
|
+
logEvent("[tableCellOperation] before: _commandFinally");
|
|
4263
5396
|
await _commandFinally(state, this);
|
|
5397
|
+
logEvent(`[tableCellOperation] after: _commandFinally took ${Date.now() - _perf_t377}ms`);
|
|
4264
5398
|
}
|
|
4265
5399
|
}
|
|
4266
5400
|
saveTestDataAsGlobal(options, world) {
|
|
@@ -4291,13 +5425,22 @@ class StableBrowser {
|
|
|
4291
5425
|
if (hight <= 0) {
|
|
4292
5426
|
hight = 1080;
|
|
4293
5427
|
}
|
|
5428
|
+
const _perf_t378 = Date.now();
|
|
5429
|
+
logEvent("[setViewportSize] before: page.setViewportSize");
|
|
4294
5430
|
await this.page.setViewportSize({ width: width, height: hight });
|
|
5431
|
+
logEvent(`[setViewportSize] after: page.setViewportSize took ${Date.now() - _perf_t378}ms`);
|
|
4295
5432
|
}
|
|
4296
5433
|
catch (e) {
|
|
5434
|
+
const _perf_t379 = Date.now();
|
|
5435
|
+
logEvent("[setViewportSize] before: _commandError");
|
|
4297
5436
|
await _commandError({ text: "setViewportSize", operation: "setViewportSize", width, hight, info }, e, this);
|
|
5437
|
+
logEvent(`[setViewportSize] after: _commandError took ${Date.now() - _perf_t379}ms`);
|
|
4298
5438
|
}
|
|
4299
5439
|
finally {
|
|
5440
|
+
const _perf_t380 = Date.now();
|
|
5441
|
+
logEvent("[setViewportSize] before: new Promise");
|
|
4300
5442
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
5443
|
+
logEvent(`[setViewportSize] after: new Promise took ${Date.now() - _perf_t380}ms`);
|
|
4301
5444
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world));
|
|
4302
5445
|
const endTime = Date.now();
|
|
4303
5446
|
_reportToWorld(world, {
|
|
@@ -4328,13 +5471,22 @@ class StableBrowser {
|
|
|
4328
5471
|
let screenshotPath = null;
|
|
4329
5472
|
const info = {};
|
|
4330
5473
|
try {
|
|
5474
|
+
const _perf_t381 = Date.now();
|
|
5475
|
+
logEvent("[reloadPage] before: page.reload");
|
|
4331
5476
|
await this.page.reload();
|
|
5477
|
+
logEvent(`[reloadPage] after: page.reload took ${Date.now() - _perf_t381}ms`);
|
|
4332
5478
|
}
|
|
4333
5479
|
catch (e) {
|
|
5480
|
+
const _perf_t382 = Date.now();
|
|
5481
|
+
logEvent("[reloadPage] before: _commandError");
|
|
4334
5482
|
await _commandError({ text: "reloadPage", operation: "reloadPage", info }, e, this);
|
|
5483
|
+
logEvent(`[reloadPage] after: _commandError took ${Date.now() - _perf_t382}ms`);
|
|
4335
5484
|
}
|
|
4336
5485
|
finally {
|
|
5486
|
+
const _perf_t383 = Date.now();
|
|
5487
|
+
logEvent("[reloadPage] before: new Promise");
|
|
4337
5488
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
5489
|
+
logEvent(`[reloadPage] after: new Promise took ${Date.now() - _perf_t383}ms`);
|
|
4338
5490
|
({ screenshotId, screenshotPath } = await this._screenShot(options, world, info));
|
|
4339
5491
|
const endTime = Date.now();
|
|
4340
5492
|
_reportToWorld(world, {
|
|
@@ -4359,14 +5511,23 @@ class StableBrowser {
|
|
|
4359
5511
|
}
|
|
4360
5512
|
async scrollIfNeeded(element, info) {
|
|
4361
5513
|
try {
|
|
5514
|
+
const _perf_t384 = Date.now();
|
|
5515
|
+
logEvent("[scrollIfNeeded] before: element.scrollIntoViewIfNeeded");
|
|
4362
5516
|
await element.scrollIntoViewIfNeeded({
|
|
4363
5517
|
timeout: 2000,
|
|
4364
5518
|
});
|
|
5519
|
+
logEvent(`[scrollIfNeeded] after: element.scrollIntoViewIfNeeded took ${Date.now() - _perf_t384}ms`);
|
|
5520
|
+
const _perf_t385 = Date.now();
|
|
5521
|
+
logEvent("[scrollIfNeeded] before: new Promise");
|
|
4365
5522
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
5523
|
+
logEvent(`[scrollIfNeeded] after: new Promise took ${Date.now() - _perf_t385}ms`);
|
|
4366
5524
|
if (info) {
|
|
5525
|
+
const _perf_t386 = Date.now();
|
|
5526
|
+
logEvent("[scrollIfNeeded] before: element.boundingBox");
|
|
4367
5527
|
info.box = await element.boundingBox({
|
|
4368
5528
|
timeout: 1000,
|
|
4369
5529
|
});
|
|
5530
|
+
logEvent(`[scrollIfNeeded] after: element.boundingBox took ${Date.now() - _perf_t386}ms`);
|
|
4370
5531
|
}
|
|
4371
5532
|
}
|
|
4372
5533
|
catch (e) {
|
|
@@ -4404,9 +5565,15 @@ class StableBrowser {
|
|
|
4404
5565
|
envName = this.context.environment.name;
|
|
4405
5566
|
}
|
|
4406
5567
|
if (!process.env.TEMP_RUN) {
|
|
5568
|
+
const _perf_t387 = Date.now();
|
|
5569
|
+
logEvent("[beforeScenario] before: getTestData");
|
|
4407
5570
|
await getTestData(envName, world, undefined, this.featureName, this.scenarioName, this.context);
|
|
5571
|
+
logEvent(`[beforeScenario] after: getTestData took ${Date.now() - _perf_t387}ms`);
|
|
4408
5572
|
}
|
|
5573
|
+
const _perf_t388 = Date.now();
|
|
5574
|
+
logEvent("[beforeScenario] before: loadBrunoParams");
|
|
4409
5575
|
await loadBrunoParams(this.context, this.context.environment.name);
|
|
5576
|
+
logEvent(`[beforeScenario] after: loadBrunoParams took ${Date.now() - _perf_t388}ms`);
|
|
4410
5577
|
if ((process.env.TRACE === "true" || this.configuration.trace === true) && this.context) {
|
|
4411
5578
|
this.trace = true;
|
|
4412
5579
|
const traceFolder = path.join(this.context.reportFolder, "trace");
|
|
@@ -4414,15 +5581,21 @@ class StableBrowser {
|
|
|
4414
5581
|
fs.mkdirSync(traceFolder, { recursive: true });
|
|
4415
5582
|
}
|
|
4416
5583
|
this.traceFolder = traceFolder;
|
|
5584
|
+
const _perf_t389 = Date.now();
|
|
5585
|
+
logEvent("[beforeScenario] before: context.playContext.tracing.start");
|
|
4417
5586
|
await this.context.playContext.tracing.start({ screenshots: true, snapshots: true });
|
|
5587
|
+
logEvent(`[beforeScenario] after: context.playContext.tracing.start took ${Date.now() - _perf_t389}ms`);
|
|
4418
5588
|
}
|
|
4419
5589
|
}
|
|
4420
5590
|
async afterScenario(world, scenario) {
|
|
4421
5591
|
const id = scenario.testCaseStartedId;
|
|
4422
5592
|
if (this.trace) {
|
|
5593
|
+
const _perf_t390 = Date.now();
|
|
5594
|
+
logEvent("[afterScenario] before: context.playContext.tracing.stop");
|
|
4423
5595
|
await this.context.playContext.tracing.stop({
|
|
4424
5596
|
path: path.join(this.traceFolder, `trace-${id}.zip`),
|
|
4425
5597
|
});
|
|
5598
|
+
logEvent(`[afterScenario] after: context.playContext.tracing.stop took ${Date.now() - _perf_t390}ms`);
|
|
4426
5599
|
}
|
|
4427
5600
|
}
|
|
4428
5601
|
getGherkinKeyword(step) {
|
|
@@ -4446,7 +5619,10 @@ class StableBrowser {
|
|
|
4446
5619
|
if (step?.pickleStep && this.trace) {
|
|
4447
5620
|
const keyword = this.getGherkinKeyword(step.pickleStep);
|
|
4448
5621
|
this.traceGroupName = `${keyword} ${step.pickleStep.text}`;
|
|
5622
|
+
const _perf_t391 = Date.now();
|
|
5623
|
+
logEvent("[beforeStep] before: context.playContext.tracing.group");
|
|
4449
5624
|
await this.context.playContext.tracing.group(this.traceGroupName);
|
|
5625
|
+
logEvent(`[beforeStep] after: context.playContext.tracing.group took ${Date.now() - _perf_t391}ms`);
|
|
4450
5626
|
}
|
|
4451
5627
|
this.stepTags = [];
|
|
4452
5628
|
if (!this.beforeScenarioCalled) {
|
|
@@ -4476,7 +5652,10 @@ class StableBrowser {
|
|
|
4476
5652
|
}
|
|
4477
5653
|
if (this.context && this.context.browserObject && this.context.browserObject.trace === true) {
|
|
4478
5654
|
if (this.context.browserObject.context) {
|
|
5655
|
+
const _perf_t392 = Date.now();
|
|
5656
|
+
logEvent("[beforeStep] before: context.browserObject.context.tracing.startChunk");
|
|
4479
5657
|
await this.context.browserObject.context.tracing.startChunk({ title: this.stepName });
|
|
5658
|
+
logEvent(`[beforeStep] after: context.browserObject.context.tracing.startChunk took ${Date.now() - _perf_t392}ms`);
|
|
4480
5659
|
}
|
|
4481
5660
|
}
|
|
4482
5661
|
if (this.initSnapshotTaken === false) {
|
|
@@ -4485,15 +5664,24 @@ class StableBrowser {
|
|
|
4485
5664
|
world.attach &&
|
|
4486
5665
|
!process.env.DISABLE_SNAPSHOT &&
|
|
4487
5666
|
(!this.fastMode || this.stepTags.includes("fast-mode"))) {
|
|
5667
|
+
const _perf_t393 = Date.now();
|
|
5668
|
+
logEvent("[beforeStep] before: getAriaSnapshot");
|
|
4488
5669
|
const snapshot = await this.getAriaSnapshot();
|
|
5670
|
+
logEvent(`[beforeStep] after: getAriaSnapshot took ${Date.now() - _perf_t393}ms`);
|
|
4489
5671
|
if (snapshot) {
|
|
5672
|
+
const _perf_t394 = Date.now();
|
|
5673
|
+
logEvent("[beforeStep] before: world.attach");
|
|
4490
5674
|
await world.attach(JSON.stringify(snapshot), "application/json+snapshot-before");
|
|
5675
|
+
logEvent(`[beforeStep] after: world.attach took ${Date.now() - _perf_t394}ms`);
|
|
4491
5676
|
}
|
|
4492
5677
|
}
|
|
4493
5678
|
}
|
|
4494
5679
|
this.context.routeResults = null;
|
|
4495
5680
|
this.context.loadedRoutes = null;
|
|
5681
|
+
const _perf_t395 = Date.now();
|
|
5682
|
+
logEvent("[beforeStep] before: registerBeforeStepRoutes");
|
|
4496
5683
|
await registerBeforeStepRoutes(this.context, this.stepName, world);
|
|
5684
|
+
logEvent(`[beforeStep] after: registerBeforeStepRoutes took ${Date.now() - _perf_t395}ms`);
|
|
4497
5685
|
networkBeforeStep(this.stepName, this.context);
|
|
4498
5686
|
this.inStepReport = false;
|
|
4499
5687
|
}
|