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.
@@ -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
  }