@applitools/core 4.3.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,84 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.5.0](https://github.com/applitools/eyes.sdk.javascript1/compare/js/core@4.4.0...js/core@4.5.0) (2023-12-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * add set of env variables to skip/ignore some optional automations ([#2097](https://github.com/applitools/eyes.sdk.javascript1/issues/2097)) ([bd3b08c](https://github.com/applitools/eyes.sdk.javascript1/commit/bd3b08c3d2997eb98d545b308a1f15501192178e))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * fixed issue when page wasn't reloaded for one of the breakpoints if the initial viewport size matches it ([9038723](https://github.com/applitools/eyes.sdk.javascript1/commit/9038723ee68515f7d4fe20ed31ec501df9a381dc))
14
+
15
+
16
+ ### Dependencies
17
+
18
+ * @applitools/spec-driver-webdriver bumped to 1.0.53
19
+
20
+ * @applitools/spec-driver-selenium bumped to 1.5.67
21
+
22
+ * @applitools/spec-driver-puppeteer bumped to 1.3.3
23
+
24
+ * @applitools/driver bumped to 1.16.0
25
+ #### Features
26
+
27
+ * add set of env variables to skip/ignore some optional automations ([#2097](https://github.com/applitools/eyes.sdk.javascript1/issues/2097)) ([bd3b08c](https://github.com/applitools/eyes.sdk.javascript1/commit/bd3b08c3d2997eb98d545b308a1f15501192178e))
28
+ * @applitools/screenshoter bumped to 3.8.19
29
+
30
+ * @applitools/nml-client bumped to 1.6.1
31
+
32
+ * @applitools/ec-client bumped to 1.7.19
33
+
34
+
35
+ ## [4.4.0](https://github.com/applitools/eyes.sdk.javascript1/compare/js/core@4.3.0...js/core@4.4.0) (2023-12-12)
36
+
37
+
38
+ ### Features
39
+
40
+ * sign windows binaries ([87fd29c](https://github.com/applitools/eyes.sdk.javascript1/commit/87fd29c8953fc512489c3bb00841ca91c5b2f030))
41
+ * support updated applitools lib protocol ([#2086](https://github.com/applitools/eyes.sdk.javascript1/issues/2086)) ([31b49fc](https://github.com/applitools/eyes.sdk.javascript1/commit/31b49fc411c452d0b3da341fd701309714484485))
42
+
43
+
44
+ ### Bug Fixes
45
+
46
+ * layout breakpoints reload and lazy load ([#2073](https://github.com/applitools/eyes.sdk.javascript1/issues/2073)) ([ab2c49e](https://github.com/applitools/eyes.sdk.javascript1/commit/ab2c49ea1ecff3fef337637a83aa5bef755a7b01))
47
+
48
+
49
+ ### Code Refactoring
50
+
51
+ * fix safe selector generation ([#2072](https://github.com/applitools/eyes.sdk.javascript1/issues/2072)) ([373f11b](https://github.com/applitools/eyes.sdk.javascript1/commit/373f11b0dfea6eab417eb7077e0cfec79877dc1b))
52
+
53
+
54
+ ### Dependencies
55
+
56
+ * @applitools/spec-driver-webdriver bumped to 1.0.52
57
+
58
+ * @applitools/spec-driver-selenium bumped to 1.5.66
59
+
60
+ * @applitools/spec-driver-puppeteer bumped to 1.3.2
61
+
62
+ * @applitools/driver bumped to 1.15.3
63
+ #### Bug Fixes
64
+
65
+ * layout breakpoints reload and lazy load ([#2073](https://github.com/applitools/eyes.sdk.javascript1/issues/2073)) ([ab2c49e](https://github.com/applitools/eyes.sdk.javascript1/commit/ab2c49ea1ecff3fef337637a83aa5bef755a7b01))
66
+ * @applitools/screenshoter bumped to 3.8.18
67
+
68
+ * @applitools/nml-client bumped to 1.6.0
69
+ #### Features
70
+
71
+ * support updated applitools lib protocol ([#2086](https://github.com/applitools/eyes.sdk.javascript1/issues/2086)) ([31b49fc](https://github.com/applitools/eyes.sdk.javascript1/commit/31b49fc411c452d0b3da341fd701309714484485))
72
+
73
+
74
+
75
+ * @applitools/tunnel-client bumped to 1.4.0
76
+ #### Features
77
+
78
+ * sign windows binaries ([87fd29c](https://github.com/applitools/eyes.sdk.javascript1/commit/87fd29c8953fc512489c3bb00841ca91c5b2f030))
79
+ * @applitools/ec-client bumped to 1.7.18
80
+
81
+
3
82
  ## [4.3.0](https://github.com/applitools/eyes.sdk.javascript1/compare/js/core@4.2.0...js/core@4.3.0) (2023-12-05)
4
83
 
5
84
 
@@ -27,22 +27,23 @@ exports.toBaseCheckSettings = void 0;
27
27
  const utils = __importStar(require("@applitools/utils"));
28
28
  function toBaseCheckSettings({ settings }) {
29
29
  const regionTypes = ['ignore', 'layout', 'strict', 'content', 'floating', 'accessibility'];
30
- const elementReferencesToCalculate = regionTypes.flatMap(regionType => {
30
+ const calculate = regionTypes.flatMap(regionType => {
31
31
  var _a;
32
32
  return ((_a = settings[`${regionType}Regions`]) !== null && _a !== void 0 ? _a : []).reduce((regions, reference) => {
33
33
  const { region } = utils.types.has(reference, 'region') ? reference : { region: reference };
34
34
  return !isRegion(region) ? regions.concat(region) : regions;
35
35
  }, []);
36
36
  });
37
- const elementReferenceToTarget = !isRegion(settings.region) ? settings.region : undefined;
38
- return { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings };
37
+ const target = !isRegion(settings.region) ? settings.region : undefined;
38
+ const scrolling = settings.scrollRootElement;
39
+ return { elementReferences: { target, scrolling, calculate }, getBaseCheckSettings };
39
40
  function getBaseCheckSettings({ calculatedRegions, preserveTransformation, }) {
40
41
  const transformedSettings = { ...settings };
41
42
  if (!preserveTransformation) {
42
43
  delete transformedSettings.region;
43
44
  delete transformedSettings.normalization;
44
45
  }
45
- else if (elementReferenceToTarget) {
46
+ else if (target) {
46
47
  delete transformedSettings.region;
47
48
  }
48
49
  regionTypes.forEach(regionType => {
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.waitForLazyLoad = void 0;
4
4
  const { lazyLoad } = require('@applitools/snippets');
5
- async function waitForLazyLoad({ context, settings, logger, }) {
6
- var _a, _b;
7
- logger.log('lazy loading the page before capturing a screenshot');
8
- const { scrollLength = 300, waitingTime = 2000, maxAmountToScroll = 15000, } = typeof settings === 'boolean' ? {} : settings;
5
+ async function waitForLazyLoad({ context, settings = {}, logger, }) {
6
+ var _a;
7
+ logger.log('Running scrolling sequence to lazy load a view content');
8
+ const { scrollLength = 300, waitingTime = 2000, maxAmountToScroll = 15000 } = settings;
9
9
  await context.executePoll(lazyLoad, {
10
10
  main: [
11
11
  await context.getScrollingElement(),
@@ -16,8 +16,8 @@ async function waitForLazyLoad({ context, settings, logger, }) {
16
16
  },
17
17
  ],
18
18
  poll: [],
19
- executionTimeout: 5 * 60 * 1000,
20
- pollTimeout: (_b = (_a = settings.pollTimeout) !== null && _a !== void 0 ? _a : settings.waitingTime) !== null && _b !== void 0 ? _b : 2000,
19
+ executionTimeout: 300000 /* 5min */,
20
+ pollTimeout: (_a = settings.pollTimeout) !== null && _a !== void 0 ? _a : waitingTime,
21
21
  });
22
22
  }
23
23
  exports.waitForLazyLoad = waitForLazyLoad;
@@ -74,7 +74,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
74
74
  logger,
75
75
  });
76
76
  }
77
- const { elementReferencesToCalculate, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
77
+ const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
78
78
  if (driverEnvironment.isWeb ||
79
79
  !((_c = driverEnvironment.applitoolsLib) === null || _c === void 0 ? void 0 : _c.instrumented) ||
80
80
  settings.screenshotMode === 'default') {
@@ -83,7 +83,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
83
83
  settings: {
84
84
  ...settings,
85
85
  environments: uniqueEnvironments,
86
- regionsToCalculate: elementReferencesToCalculate,
86
+ regionsToCalculate: elementReferences.calculate,
87
87
  calculateView: !!settings.pageId,
88
88
  domSettings: settings.sendDom ? { proxy: eyes.test.eyesServer.proxy } : undefined,
89
89
  },
@@ -74,7 +74,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
74
74
  logger,
75
75
  });
76
76
  }
77
- const { elementReferencesToCalculate, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
77
+ const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
78
78
  if (driverEnvironment.isWeb ||
79
79
  !((_c = driverEnvironment.applitoolsLib) === null || _c === void 0 ? void 0 : _c.instrumented) ||
80
80
  settings.screenshotMode === 'default') {
@@ -83,7 +83,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
83
83
  settings: {
84
84
  ...settings,
85
85
  environments: uniqueEnvironments,
86
- regionsToCalculate: elementReferencesToCalculate,
86
+ regionsToCalculate: elementReferences.calculate,
87
87
  calculateView: !!settings.pageId,
88
88
  domSettings: settings.sendDom ? { proxy: eyes.test.eyesServer.proxy } : undefined,
89
89
  },
package/dist/cli/cli.js CHANGED
@@ -123,12 +123,19 @@ yargs_1.default
123
123
  description: 'group logs by tag names',
124
124
  type: 'boolean',
125
125
  },
126
+ analyze: {
127
+ description: 'group logs by tag names',
128
+ type: 'boolean',
129
+ },
126
130
  }),
127
131
  handler: async (args) => {
128
132
  var _a;
129
133
  const input = (_a = args.input) !== null && _a !== void 0 ? _a : (await utils.streams.toBuffer(process.stdin)).toString('utf8');
130
134
  const logs = (0, logs_1.parseLogs)(input);
131
- if (args.structure) {
135
+ if (args.analyze) {
136
+ console.log(JSON.stringify((0, logs_1.analyzeLogs)((0, logs_1.structureLogs)(logs)), null, 2));
137
+ }
138
+ else if (args.structure) {
132
139
  console.log(JSON.stringify((0, logs_1.structureLogs)(logs), null, 2));
133
140
  }
134
141
  else {
package/dist/core.js CHANGED
@@ -40,9 +40,11 @@ const close_batch_1 = require("./close-batch");
40
40
  const delete_test_1 = require("./delete-test");
41
41
  const extract_test_environment_1 = require("./utils/extract-test-environment");
42
42
  const validate_sdk_version_1 = require("./utils/validate-sdk-version");
43
+ const memory_usage_logging_1 = require("./utils/memory-usage-logging");
43
44
  const utils = __importStar(require("@applitools/utils"));
44
45
  function makeCore({ spec, clients, concurrency, base: defaultBase, environment: defaultEnvironment, agentId = 'core', cwd = process.cwd(), logger: defaultLogger, asyncCache, } = {}) {
45
46
  const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'core' } });
47
+ (0, memory_usage_logging_1.startMemoryUsageLogging)({ logger });
46
48
  const environment = (0, extract_test_environment_1.extractTestEnvironment)(defaultEnvironment);
47
49
  logger.log(`Core is initialized ${defaultBase ? 'with' : 'without'} custom base core and environment`, environment);
48
50
  if (environment.sdk)
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.structureLogs = exports.parseLogs = void 0;
3
+ exports.analyzeLogs = exports.structureLogs = exports.stringifyLog = exports.parseLogs = void 0;
4
4
  function parseLogs(logs) {
5
5
  const regexp = /^(?<label>[^\s]+) (?:\((?<tags>[^\)]+)\) )?\| (?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)? (?:\[(?<level>[A-Z]+)\s*\])? (?<message>.+)$/;
6
6
  const lines = logs.split('\n');
@@ -20,8 +20,15 @@ function parseLogs(logs) {
20
20
  }, []);
21
21
  }
22
22
  exports.parseLogs = parseLogs;
23
+ function stringifyLog(log) {
24
+ var _a;
25
+ // eslint-disable-next-line
26
+ return `${log.label} (${(_a = log.tags) === null || _a === void 0 ? void 0 : _a.map(tags => tags.join('/')).join(' & ')}) ${log.timestamp} [${log.level}] ${log.message}`;
27
+ }
28
+ exports.stringifyLog = stringifyLog;
23
29
  function structureLogs(logs) {
24
30
  const groups = {};
31
+ groups.logs;
25
32
  logs.forEach(log => {
26
33
  var _a;
27
34
  const tags = (_a = log.tags) !== null && _a !== void 0 ? _a : [[]];
@@ -39,3 +46,31 @@ function structureLogs(logs) {
39
46
  return groups;
40
47
  }
41
48
  exports.structureLogs = structureLogs;
49
+ function analyzeLogs({ logs, ...groups }) {
50
+ var _a, _b;
51
+ const analysis = {};
52
+ analysis.logs = logs === null || logs === void 0 ? void 0 : logs.map(stringifyLog);
53
+ const groupAnalyses = Object.fromEntries(Object.entries(groups).map(([name, group]) => [name, analyzeLogs(group)]));
54
+ analysis.startedAt = Math.min(Date.parse((_a = logs === null || logs === void 0 ? void 0 : logs[0]) === null || _a === void 0 ? void 0 : _a.timestamp) || Infinity, ...Object.values(groupAnalyses).map(group => group.startedAt));
55
+ analysis.finishedAt = Math.max(Date.parse((_b = logs === null || logs === void 0 ? void 0 : logs[logs.length - 1]) === null || _b === void 0 ? void 0 : _b.timestamp) || 0, ...Object.values(groupAnalyses).map(group => group.finishedAt));
56
+ analysis.time = analysis.finishedAt - analysis.startedAt;
57
+ analysis.conclusion = '';
58
+ analysis.conclusion += `Time taken: ${formatTime(analysis.time)};`;
59
+ if (Object.keys(groupAnalyses).length > 0) {
60
+ analysis.conclusion += `Longest group: ${Object.keys(groupAnalyses).reduce((prev, cur) => groupAnalyses[cur].time > groupAnalyses[prev].time ? cur : prev)}`;
61
+ }
62
+ return { ...analysis, ...groupAnalyses };
63
+ }
64
+ exports.analyzeLogs = analyzeLogs;
65
+ function formatTime(ms) {
66
+ const h = Math.floor(ms / 3600000);
67
+ if (h)
68
+ ms -= h * 3600000;
69
+ const m = Math.floor(ms / 60000);
70
+ if (m)
71
+ ms -= m * 60000;
72
+ const s = Math.floor(ms / 1000);
73
+ if (s)
74
+ ms -= s * 1000;
75
+ return [h && `${h}h`, m && `${m}m`, s && `${s}s`, ms && `${ms}ms`].filter(Boolean).join(' ');
76
+ }
@@ -30,6 +30,7 @@ exports.makeCheckAndClose = void 0;
30
30
  const driver_1 = require("@applitools/driver");
31
31
  const take_dom_snapshots_1 = require("./utils/take-dom-snapshots");
32
32
  const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
33
+ const to_generated_selectors_1 = require("./utils/to-generated-selectors");
33
34
  const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
34
35
  const to_environment_key_1 = require("../automation/utils/to-environment-key");
35
36
  const abort_error_1 = require("../errors/abort-error");
@@ -38,15 +39,17 @@ const lang = __importStar(require("../lang"));
38
39
  const chalk_1 = __importDefault(require("chalk"));
39
40
  function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
40
41
  return async function checkAndClose({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
41
- var _a, _b, _c;
42
+ var _a, _b;
42
43
  logger = logger.extend(mainLogger);
43
44
  logger.log('Command "checkAndClose" is called with settings', settings);
44
45
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
45
46
  logger.warn('Command "checkAndClose" was called after test was already aborted');
46
47
  throw new abort_error_1.AbortError('Command "checkAndClose" was called after test was already aborted');
47
48
  }
48
- const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
49
- settings,
49
+ const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
50
+ const { elementReferencesToMark, getGeneratedSelectors } = (0, to_generated_selectors_1.toGeneratedSelectors)({
51
+ elementReferences,
52
+ transformElementReference: elementReference => { var _a; return ((0, driver_1.isSelector)(elementReference) && ((_a = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _a === void 0 ? void 0 : _a.call(spec, elementReference))) || undefined; },
50
53
  });
51
54
  const uniqueEnvironments = (0, uniquify_environments_1.uniquifyEnvironments)((_a = settings.environments) !== null && _a !== void 0 ? _a : defaultEnvironments);
52
55
  const ufgClient = await eyes.core.getUFGClient({
@@ -57,7 +60,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
57
60
  },
58
61
  logger,
59
62
  });
60
- let snapshotResults;
63
+ let snapshots;
61
64
  let snapshotUrl;
62
65
  let snapshotTitle;
63
66
  let userAgent;
@@ -70,7 +73,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
70
73
  await currentContext.setScrollingElement((_b = settings.scrollRootElement) !== null && _b !== void 0 ? _b : null);
71
74
  if (environment.isWeb) {
72
75
  userAgent = await driver.getUserAgentLegacy();
73
- snapshotResults = await (0, take_dom_snapshots_1.takeDomSnapshots)({
76
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
74
77
  driver,
75
78
  settings: {
76
79
  ...eyes.test.eyesServer,
@@ -80,11 +83,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
80
83
  environments: uniqueEnvironments,
81
84
  skipResources: ufgClient.getCachedResourceUrls(),
82
85
  lazyLoad: settings.lazyLoad,
83
- calculateRegionsOptions: {
84
- elementReferencesToCalculate,
85
- elementReferenceToTarget,
86
- scrollRootElement: settings.scrollRootElement,
87
- },
86
+ elementReferences: elementReferencesToMark,
88
87
  },
89
88
  provides: {
90
89
  getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
@@ -99,7 +98,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
99
98
  settings: { ...eyes.test.eyesServer, supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl },
100
99
  logger,
101
100
  });
102
- const snapshots = (await nmlClient.takeSnapshots({
101
+ snapshots = (await nmlClient.takeSnapshots({
103
102
  settings: {
104
103
  ...eyes.test.eyesServer,
105
104
  waitBeforeCapture: settings.waitBeforeCapture,
@@ -107,27 +106,16 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
107
106
  },
108
107
  logger,
109
108
  }));
110
- snapshotResults = snapshots.map(snapshot => {
111
- var _a, _b, _c, _d;
112
- return ({
113
- snapshot,
114
- regionToTarget: (0, driver_1.isSelector)(elementReferenceToTarget)
115
- ? (_b = (_a = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _a === void 0 ? void 0 : _a.call(spec, settings.scrollRootElement)) !== null && _b !== void 0 ? _b : undefined
116
- : undefined,
117
- scrollRootSelector: (0, driver_1.isSelector)(settings.scrollRootElement)
118
- ? (_d = (_c = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _c === void 0 ? void 0 : _c.call(spec, settings.scrollRootElement)) !== null && _d !== void 0 ? _d : undefined
119
- : undefined,
120
- });
121
- });
122
109
  }
123
110
  await currentContext.focus();
124
111
  snapshotUrl = await driver.getUrl();
125
112
  snapshotTitle = await driver.getTitle();
126
113
  }
127
114
  else {
128
- snapshotResults = !utils.types.isArray(target) ? Array(uniqueEnvironments.length).fill(target) : target;
129
- snapshotUrl = utils.types.has((_c = snapshotResults[0]) === null || _c === void 0 ? void 0 : _c.snapshot, 'url') ? snapshotResults[0].snapshot.url : undefined;
115
+ snapshots = !utils.types.isArray(target) ? Array(uniqueEnvironments.length).fill(target) : target;
116
+ snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
130
117
  }
118
+ const generatedSelectors = snapshots.map(snapshot => getGeneratedSelectors(utils.types.has(snapshot, 'generatedSelectors') ? snapshot.generatedSelectors : undefined));
131
119
  const promises = uniqueEnvironments.map(async (environment, index) => {
132
120
  var _a, _b, _c, _d, _e, _f, _g, _h;
133
121
  const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
@@ -140,13 +128,8 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
140
128
  environmentLogger.warn('Command "check" was aborted before rendering');
141
129
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
142
130
  }
143
- const { snapshot: snapshotFromResult, selectorsToCalculate: selectorsToCalculateFromSnapshot, regionToTarget, scrollRootSelector, } = snapshotResults[index];
144
- const { cookies, ...snapshot } = snapshotFromResult;
145
- const region = (_a = regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : elementReferenceToTarget) !== null && _a !== void 0 ? _a : settings.region;
146
- const selectorsToCalculate = selectorsToCalculateFromSnapshot !== null && selectorsToCalculateFromSnapshot !== void 0 ? selectorsToCalculateFromSnapshot : elementReferencesToCalculate.map(selector => ({
147
- originalSelector: selector,
148
- safeSelector: selector,
149
- }));
131
+ const { cookies, ...snapshot } = snapshots[index];
132
+ const selectors = generatedSelectors[index];
150
133
  if (utils.types.has(ufgEnvironment, 'iosDeviceInfo') || utils.types.has(ufgEnvironment, 'androidDeviceInfo')) {
151
134
  ufgEnvironment.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
152
135
  }
@@ -172,8 +155,8 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
172
155
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
173
156
  }
174
157
  else if (!baseEyes.running) {
175
- environmentLogger.warn(`Render on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" was aborted during one of the previous steps`);
176
- throw new abort_error_1.AbortError(`Render on environment with id "${(_c = baseEyes.test.environment) === null || _c === void 0 ? void 0 : _c.environmentId}" was aborted during one of the previous steps`);
158
+ environmentLogger.warn(`Render on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" was aborted during one of the previous steps`);
159
+ throw new abort_error_1.AbortError(`Render on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" was aborted during one of the previous steps`);
177
160
  }
178
161
  const renderTarget = await renderTargetPromise;
179
162
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
@@ -181,16 +164,16 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
181
164
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
182
165
  }
183
166
  else if (!baseEyes.running) {
184
- environmentLogger.warn(`Render on environment with id "${(_d = baseEyes.test.environment) === null || _d === void 0 ? void 0 : _d.environmentId}" was aborted during one of the previous steps`);
185
- throw new abort_error_1.AbortError(`Render on environment with id "${(_e = baseEyes.test.environment) === null || _e === void 0 ? void 0 : _e.environmentId}" was aborted during one of the previous steps`);
167
+ environmentLogger.warn(`Render on environment with id "${(_c = baseEyes.test.environment) === null || _c === void 0 ? void 0 : _c.environmentId}" was aborted during one of the previous steps`);
168
+ throw new abort_error_1.AbortError(`Render on environment with id "${(_d = baseEyes.test.environment) === null || _d === void 0 ? void 0 : _d.environmentId}" was aborted during one of the previous steps`);
186
169
  }
187
170
  const { renderId, selectorRegions, ...baseTarget } = await ufgClient.render({
188
171
  target: renderTarget,
189
172
  settings: {
190
173
  ...settings,
191
- region,
192
- scrollRootElement: scrollRootSelector,
193
- selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
174
+ region: (_e = selectors.target) !== null && _e !== void 0 ? _e : settings.region,
175
+ scrollRootElement: selectors.scrolling,
176
+ selectorsToCalculate: selectors.calculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
194
177
  includeFullPageSize: !!settings.pageId,
195
178
  environment: ufgEnvironment,
196
179
  environmentId: baseEyes.test.environment.environmentId,
@@ -202,7 +185,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, environments: defaultE
202
185
  });
203
186
  let offset = 0;
204
187
  const baseSettings = getBaseCheckSettings({
205
- calculatedRegions: selectorsToCalculate.map(({ originalSelector, safeSelector }) => ({
188
+ calculatedRegions: selectors.calculate.map(({ originalSelector, safeSelector }) => ({
206
189
  selector: originalSelector !== null && originalSelector !== void 0 ? originalSelector : undefined,
207
190
  regions: safeSelector ? selectorRegions[offset++] : [],
208
191
  })),
package/dist/ufg/check.js CHANGED
@@ -30,6 +30,7 @@ exports.makeCheck = void 0;
30
30
  const driver_1 = require("@applitools/driver");
31
31
  const take_dom_snapshots_1 = require("./utils/take-dom-snapshots");
32
32
  const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
33
+ const to_generated_selectors_1 = require("./utils/to-generated-selectors");
33
34
  const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
34
35
  const to_environment_key_1 = require("../automation/utils/to-environment-key");
35
36
  const abort_error_1 = require("../errors/abort-error");
@@ -38,15 +39,17 @@ const lang = __importStar(require("../lang"));
38
39
  const chalk_1 = __importDefault(require("chalk"));
39
40
  function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
40
41
  return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
41
- var _a, _b, _c;
42
+ var _a, _b;
42
43
  logger = logger.extend(mainLogger);
43
44
  logger.log('Command "check" is called with settings', settings);
44
45
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
45
46
  logger.warn('Command "check" was called after test was already aborted');
46
47
  throw new abort_error_1.AbortError('Command "check" was called after test was already aborted');
47
48
  }
48
- const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
49
- settings,
49
+ const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
50
+ const { elementReferencesToMark, getGeneratedSelectors } = (0, to_generated_selectors_1.toGeneratedSelectors)({
51
+ elementReferences,
52
+ transformElementReference: elementReference => { var _a; return ((0, driver_1.isSelector)(elementReference) && ((_a = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _a === void 0 ? void 0 : _a.call(spec, elementReference))) || undefined; },
50
53
  });
51
54
  const uniqueEnvironments = (0, uniquify_environments_1.uniquifyEnvironments)((_a = settings.environments) !== null && _a !== void 0 ? _a : defaultEnvironments);
52
55
  const ufgClient = await eyes.core.getUFGClient({
@@ -57,7 +60,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
57
60
  },
58
61
  logger,
59
62
  });
60
- let snapshotResults;
63
+ let snapshots;
61
64
  let snapshotUrl;
62
65
  let snapshotTitle;
63
66
  let userAgent;
@@ -70,7 +73,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
70
73
  await currentContext.setScrollingElement((_b = settings.scrollRootElement) !== null && _b !== void 0 ? _b : null);
71
74
  if (environment.isWeb) {
72
75
  userAgent = await driver.getUserAgentLegacy();
73
- snapshotResults = await (0, take_dom_snapshots_1.takeDomSnapshots)({
76
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
74
77
  driver,
75
78
  settings: {
76
79
  ...eyes.test.eyesServer,
@@ -80,11 +83,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
80
83
  environments: uniqueEnvironments,
81
84
  skipResources: ufgClient.getCachedResourceUrls(),
82
85
  lazyLoad: settings.lazyLoad,
83
- calculateRegionsOptions: {
84
- elementReferencesToCalculate,
85
- elementReferenceToTarget,
86
- scrollRootElement: settings.scrollRootElement,
87
- },
86
+ elementReferences: elementReferencesToMark,
88
87
  },
89
88
  provides: {
90
89
  getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
@@ -99,7 +98,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
99
98
  settings: { ...eyes.test.eyesServer, supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl },
100
99
  logger,
101
100
  });
102
- const snapshots = (await nmlClient.takeSnapshots({
101
+ snapshots = (await nmlClient.takeSnapshots({
103
102
  settings: {
104
103
  ...eyes.test.eyesServer,
105
104
  waitBeforeCapture: settings.waitBeforeCapture,
@@ -107,27 +106,16 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
107
106
  },
108
107
  logger,
109
108
  }));
110
- snapshotResults = snapshots.map(snapshot => {
111
- var _a, _b, _c, _d;
112
- return ({
113
- snapshot,
114
- regionToTarget: (0, driver_1.isSelector)(elementReferenceToTarget)
115
- ? (_b = (_a = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _a === void 0 ? void 0 : _a.call(spec, settings.scrollRootElement)) !== null && _b !== void 0 ? _b : undefined
116
- : undefined,
117
- scrollRootSelector: (0, driver_1.isSelector)(settings.scrollRootElement)
118
- ? (_d = (_c = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _c === void 0 ? void 0 : _c.call(spec, settings.scrollRootElement)) !== null && _d !== void 0 ? _d : undefined
119
- : undefined,
120
- });
121
- });
122
109
  }
123
110
  await currentContext.focus();
124
111
  snapshotUrl = await driver.getUrl();
125
112
  snapshotTitle = await driver.getTitle();
126
113
  }
127
114
  else {
128
- snapshotResults = !utils.types.isArray(target) ? Array(uniqueEnvironments.length).fill(target) : target;
129
- snapshotUrl = utils.types.has((_c = snapshotResults[0]) === null || _c === void 0 ? void 0 : _c.snapshot, 'url') ? snapshotResults[0].snapshot.url : undefined;
115
+ snapshots = !utils.types.isArray(target) ? Array(uniqueEnvironments.length).fill(target) : target;
116
+ snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
130
117
  }
118
+ const generatedSelectors = snapshots.map(snapshot => getGeneratedSelectors(utils.types.has(snapshot, 'generatedSelectors') ? snapshot.generatedSelectors : undefined));
131
119
  const promises = uniqueEnvironments.map(async (environment, index) => {
132
120
  var _a, _b, _c, _d, _e, _f, _g, _h;
133
121
  const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
@@ -140,13 +128,8 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
140
128
  environmentLogger.warn('Command "check" was aborted before rendering');
141
129
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
142
130
  }
143
- const { snapshot: snapshotFromResult, selectorsToCalculate: selectorsToCalculateFromSnapshot, regionToTarget, scrollRootSelector, } = snapshotResults[index];
144
- const { cookies, ...snapshot } = snapshotFromResult;
145
- const region = (_a = regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : elementReferenceToTarget) !== null && _a !== void 0 ? _a : settings.region;
146
- const selectorsToCalculate = selectorsToCalculateFromSnapshot !== null && selectorsToCalculateFromSnapshot !== void 0 ? selectorsToCalculateFromSnapshot : elementReferencesToCalculate.map(selector => ({
147
- originalSelector: selector,
148
- safeSelector: selector,
149
- }));
131
+ const { cookies, ...snapshot } = snapshots[index];
132
+ const selectors = generatedSelectors[index];
150
133
  if (utils.types.has(ufgEnvironment, 'iosDeviceInfo') || utils.types.has(ufgEnvironment, 'androidDeviceInfo')) {
151
134
  ufgEnvironment.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
152
135
  }
@@ -172,8 +155,8 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
172
155
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
173
156
  }
174
157
  else if (!baseEyes.running) {
175
- environmentLogger.warn(`Render on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" was aborted during one of the previous steps`);
176
- throw new abort_error_1.AbortError(`Render on environment with id "${(_c = baseEyes.test.environment) === null || _c === void 0 ? void 0 : _c.environmentId}" was aborted during one of the previous steps`);
158
+ environmentLogger.warn(`Render on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" was aborted during one of the previous steps`);
159
+ throw new abort_error_1.AbortError(`Render on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" was aborted during one of the previous steps`);
177
160
  }
178
161
  const renderTarget = await renderTargetPromise;
179
162
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
@@ -181,16 +164,16 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
181
164
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
182
165
  }
183
166
  else if (!baseEyes.running) {
184
- environmentLogger.warn(`Render on environment with id "${(_d = baseEyes.test.environment) === null || _d === void 0 ? void 0 : _d.environmentId}" was aborted during one of the previous steps`);
185
- throw new abort_error_1.AbortError(`Render on environment with id "${(_e = baseEyes.test.environment) === null || _e === void 0 ? void 0 : _e.environmentId}" was aborted during one of the previous steps`);
167
+ environmentLogger.warn(`Render on environment with id "${(_c = baseEyes.test.environment) === null || _c === void 0 ? void 0 : _c.environmentId}" was aborted during one of the previous steps`);
168
+ throw new abort_error_1.AbortError(`Render on environment with id "${(_d = baseEyes.test.environment) === null || _d === void 0 ? void 0 : _d.environmentId}" was aborted during one of the previous steps`);
186
169
  }
187
170
  const { renderId, selectorRegions, ...baseTarget } = await ufgClient.render({
188
171
  target: renderTarget,
189
172
  settings: {
190
173
  ...settings,
191
- region,
192
- scrollRootElement: scrollRootSelector,
193
- selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
174
+ region: (_e = selectors.target) !== null && _e !== void 0 ? _e : settings.region,
175
+ scrollRootElement: selectors.scrolling,
176
+ selectorsToCalculate: selectors.calculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
194
177
  includeFullPageSize: Boolean(settings.pageId),
195
178
  environment: ufgEnvironment,
196
179
  environmentId: baseEyes.test.environment.environmentId,
@@ -202,7 +185,7 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
202
185
  });
203
186
  let offset = 0;
204
187
  const baseSettings = getBaseCheckSettings({
205
- calculatedRegions: selectorsToCalculate.map(({ originalSelector, safeSelector }) => ({
188
+ calculatedRegions: selectors.calculate.map(({ originalSelector, safeSelector }) => ({
206
189
  selector: originalSelector !== null && originalSelector !== void 0 ? originalSelector : undefined,
207
190
  regions: safeSelector ? selectorRegions[offset++] : [],
208
191
  })),
@@ -31,50 +31,38 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
32
  exports.takeDomSnapshots = void 0;
33
33
  const take_dom_snapshot_1 = require("./take-dom-snapshot");
34
- const calculate_regions_1 = require("./calculate-regions");
34
+ const generate_safe_selectors_1 = require("./generate-safe-selectors");
35
35
  const wait_for_lazy_load_1 = require("../../automation/utils/wait-for-lazy-load");
36
36
  const chalk_1 = __importDefault(require("chalk"));
37
37
  const utils = __importStar(require("@applitools/utils"));
38
38
  const lang = __importStar(require("../../lang"));
39
39
  __exportStar(require("./take-dom-snapshot"), exports);
40
40
  async function takeDomSnapshots({ driver, settings, hooks, provides, logger, }) {
41
- var _a, _b, _c, _d, _e, _f, _g;
41
+ var _a, _b, _c;
42
42
  // calculating cookies here once so that we (a) don't do it for each dom snapshot, and (b) do it before generating safe selectors
43
43
  const features = await driver.getFeatures();
44
44
  settings.cookies = features.allCookies ? await driver.getCookies().catch(() => []) : [];
45
+ settings.lazyLoad = settings.lazyLoad !== true ? settings.lazyLoad : {};
45
46
  const currentContext = driver.currentContext;
46
- let calculateRegionsResults = {};
47
- const waitBeforeCapture = async () => {
48
- if (utils.types.isFunction(settings.waitBeforeCapture)) {
49
- await settings.waitBeforeCapture();
50
- }
51
- else if (settings.waitBeforeCapture) {
52
- await utils.general.sleep(settings.waitBeforeCapture);
53
- }
54
- };
55
- if (settings.lazyLoad) {
56
- await (0, wait_for_lazy_load_1.waitForLazyLoad)({
57
- context: driver.currentContext,
58
- settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
59
- logger,
60
- });
61
- }
62
47
  if (!((_a = settings.layoutBreakpoints) === null || _a === void 0 ? void 0 : _a.breakpoints)) {
48
+ if (settings.lazyLoad) {
49
+ await (0, wait_for_lazy_load_1.waitForLazyLoad)({ context: currentContext, settings: settings.lazyLoad, logger });
50
+ }
63
51
  logger.log(`taking single dom snapshot`);
64
- await ((_b = hooks === null || hooks === void 0 ? void 0 : hooks.beforeEachSnapshot) === null || _b === void 0 ? void 0 : _b.call(hooks));
65
- await waitBeforeCapture();
52
+ await beforeEachSnapshot();
66
53
  // it's important that we calculate safe selectors as close as possible to taking the dom snapshot
67
- if (settings.calculateRegionsOptions) {
68
- calculateRegionsResults = await (0, calculate_regions_1.calculateRegions)({
69
- ...settings.calculateRegionsOptions,
70
- driver,
54
+ let safeSelectorResult;
55
+ if (settings.elementReferences) {
56
+ safeSelectorResult = await (0, generate_safe_selectors_1.generateSafeSelectors)({
57
+ context: currentContext,
58
+ elementReferences: settings.elementReferences,
71
59
  });
72
60
  }
73
61
  const snapshot = await (0, take_dom_snapshot_1.takeDomSnapshot)({ context: currentContext, settings, logger });
74
- await ((_c = calculateRegionsResults === null || calculateRegionsResults === void 0 ? void 0 : calculateRegionsResults.cleanupGeneratedSelectors) === null || _c === void 0 ? void 0 : _c.call(calculateRegionsResults));
75
- return Array(settings.environments.length).fill({ snapshot, ...calculateRegionsResults });
62
+ await ((_b = safeSelectorResult === null || safeSelectorResult === void 0 ? void 0 : safeSelectorResult.cleanupGeneratedSelectors) === null || _b === void 0 ? void 0 : _b.call(safeSelectorResult));
63
+ return Array(settings.environments.length).fill({ ...snapshot, generatedSelectors: safeSelectorResult === null || safeSelectorResult === void 0 ? void 0 : safeSelectorResult.selectors });
76
64
  }
77
- const isStrictBreakpoints = utils.types.isArray((_d = settings.layoutBreakpoints) === null || _d === void 0 ? void 0 : _d.breakpoints);
65
+ const isStrictBreakpoints = utils.types.isArray((_c = settings.layoutBreakpoints) === null || _c === void 0 ? void 0 : _c.breakpoints);
78
66
  const requiredWidths = await settings.environments.reduce(async (prev, environment, index) => {
79
67
  const { name, width } = (await extractEnvironmentInfo(environment));
80
68
  const requiredWidths = await prev;
@@ -95,81 +83,83 @@ async function takeDomSnapshots({ driver, settings, hooks, provides, logger, })
95
83
  });
96
84
  logger.console.log(chalk_1.default.yellow(message));
97
85
  }
98
- logger.log(`taking multiple dom snapshots for breakpoints:`, settings.layoutBreakpoints.breakpoints);
99
- logger.log(`required widths: ${[...requiredWidths.keys()].join(', ')}`);
100
- const viewportSize = await driver.getViewportSize();
101
- const snapshotsResults = Array(settings.environments.length);
102
- if (requiredWidths.has(viewportSize.width)) {
103
- logger.log(`taking dom snapshot for existing width ${viewportSize.width}`);
104
- await ((_e = hooks === null || hooks === void 0 ? void 0 : hooks.beforeEachSnapshot) === null || _e === void 0 ? void 0 : _e.call(hooks));
105
- await waitBeforeCapture();
106
- // it's important that we calculate safe selectors as close as possible to taking the dom snapshot
107
- if (settings.calculateRegionsOptions) {
108
- calculateRegionsResults = await (0, calculate_regions_1.calculateRegions)({
109
- ...settings.calculateRegionsOptions,
110
- driver,
111
- });
112
- }
113
- const snapshot = await (0, take_dom_snapshot_1.takeDomSnapshot)({ context: currentContext, settings, logger });
114
- requiredWidths.get(viewportSize.width).forEach(({ index }) => {
115
- snapshotsResults[index] = { snapshot, ...calculateRegionsResults };
116
- });
86
+ logger.log(`Taking multiple dom snapshots for the breakpoints`, settings.layoutBreakpoints);
87
+ const initialViewportSize = await driver.getViewportSize();
88
+ const entries = [];
89
+ const initialsBrowsers = requiredWidths.get(initialViewportSize.width);
90
+ if (initialsBrowsers) {
91
+ logger.log(`The first dom snapshot is going to be taking for initial viewport size`, initialViewportSize);
92
+ requiredWidths.delete(initialViewportSize.width);
93
+ entries.push({ browsers: initialsBrowsers });
117
94
  }
118
- for (const [requiredWidth, browsersInfo] of requiredWidths.entries()) {
119
- logger.log(`taking dom snapshot for width ${requiredWidth}`);
120
- try {
121
- await driver.setViewportSize({ width: requiredWidth, height: viewportSize.height });
122
- }
123
- catch (error) {
124
- logger.error(`Failed to set viewport size to ${requiredWidth} du to error: `, error);
125
- const actualViewportSize = await driver.getViewportSize();
126
- if (isStrictBreakpoints) {
127
- const message = lang.breakpointOutOfDriverBoundsWarning({
128
- requiredWidth,
129
- actualWidth: actualViewportSize.width,
130
- browsers: browsersInfo,
131
- });
132
- logger.console.log(chalk_1.default.yellow(message));
133
- logger.log(message);
95
+ requiredWidths.forEach((browsers, requiredWidth) => entries.push({ viewportSize: { width: requiredWidth, height: initialViewportSize.height }, browsers }));
96
+ logger.log(`All entries to take dom snapshots for`, entries);
97
+ let safeSelectorResult;
98
+ const snapshots = Array(settings.environments.length);
99
+ for (const [index, { viewportSize, browsers }] of entries.entries()) {
100
+ logger.log(`Taking dom snapshot for viewport size ${viewportSize}`);
101
+ if (viewportSize) {
102
+ try {
103
+ await driver.setViewportSize(viewportSize);
134
104
  }
135
- else {
136
- const message = lang.requestedEnvironmentOutOfDriverBoundsWarning({
137
- requiredWidth,
138
- actualWidth: actualViewportSize.width,
139
- browsers: browsersInfo,
140
- });
141
- logger.console.log(chalk_1.default.yellow(message));
142
- logger.log(message);
105
+ catch (error) {
106
+ logger.error(`Failed to set viewport size to ${viewportSize} due to the error`, error);
107
+ const actualViewportSize = await driver.getViewportSize();
108
+ if (isStrictBreakpoints) {
109
+ const message = lang.breakpointOutOfDriverBoundsWarning({
110
+ requiredWidth: viewportSize.width,
111
+ actualWidth: actualViewportSize.width,
112
+ browsers,
113
+ });
114
+ logger.console.log(chalk_1.default.yellow(message));
115
+ logger.log(message);
116
+ }
117
+ else {
118
+ const message = lang.requestedEnvironmentOutOfDriverBoundsWarning({
119
+ requiredWidth: viewportSize.width,
120
+ actualWidth: actualViewportSize.width,
121
+ browsers,
122
+ });
123
+ logger.console.log(chalk_1.default.yellow(message));
124
+ logger.log(message);
125
+ }
143
126
  }
144
127
  }
145
- if (settings.layoutBreakpoints.reload) {
128
+ if (settings.layoutBreakpoints.reload)
146
129
  await driver.reloadPage();
130
+ if (settings.lazyLoad && (index === 0 || settings.layoutBreakpoints.reload)) {
131
+ await (0, wait_for_lazy_load_1.waitForLazyLoad)({ context: currentContext, settings: settings.lazyLoad, logger });
147
132
  }
148
- await ((_f = hooks === null || hooks === void 0 ? void 0 : hooks.beforeEachSnapshot) === null || _f === void 0 ? void 0 : _f.call(hooks));
149
- await waitBeforeCapture();
150
- if (settings.layoutBreakpoints.reload) {
151
- // it's important that we calculate safe selectors as close as possible to taking the dom snapshot
152
- if (settings.calculateRegionsOptions) {
153
- calculateRegionsResults = await (0, calculate_regions_1.calculateRegions)({
154
- ...settings.calculateRegionsOptions,
155
- driver,
156
- });
157
- }
133
+ await beforeEachSnapshot();
134
+ // it's important that we calculate safe selectors as close as possible to taking the dom snapshot
135
+ if (settings.elementReferences && (index === 0 || settings.layoutBreakpoints.reload)) {
136
+ safeSelectorResult = await (0, generate_safe_selectors_1.generateSafeSelectors)({
137
+ context: currentContext,
138
+ elementReferences: settings.elementReferences,
139
+ });
158
140
  }
159
141
  const snapshot = await (0, take_dom_snapshot_1.takeDomSnapshot)({ context: currentContext, settings, logger });
160
- browsersInfo.forEach(({ index }) => {
161
- snapshotsResults[index] = { snapshot, ...calculateRegionsResults };
162
- });
142
+ browsers.forEach(({ index }) => (snapshots[index] = { ...snapshot, generatedSelectors: safeSelectorResult === null || safeSelectorResult === void 0 ? void 0 : safeSelectorResult.selectors }));
163
143
  }
164
- await driver.setViewportSize(viewportSize);
144
+ await driver.setViewportSize(initialViewportSize);
165
145
  if (settings.layoutBreakpoints.reload) {
166
146
  await driver.reloadPage();
167
- await waitBeforeCapture();
147
+ await beforeEachSnapshot();
168
148
  }
169
149
  else {
170
- (_g = calculateRegionsResults === null || calculateRegionsResults === void 0 ? void 0 : calculateRegionsResults.cleanupGeneratedSelectors) === null || _g === void 0 ? void 0 : _g.call(calculateRegionsResults);
150
+ await (safeSelectorResult === null || safeSelectorResult === void 0 ? void 0 : safeSelectorResult.cleanupGeneratedSelectors());
151
+ }
152
+ return snapshots;
153
+ async function beforeEachSnapshot() {
154
+ var _a, _b;
155
+ await ((_a = hooks === null || hooks === void 0 ? void 0 : hooks.beforeEachSnapshot) === null || _a === void 0 ? void 0 : _a.call(hooks));
156
+ if (utils.types.isNumber(settings.waitBeforeCapture)) {
157
+ await utils.general.sleep(settings.waitBeforeCapture);
158
+ }
159
+ else {
160
+ await ((_b = settings.waitBeforeCapture) === null || _b === void 0 ? void 0 : _b.call(settings));
161
+ }
171
162
  }
172
- return snapshotsResults;
173
163
  function calculateBreakpoint({ breakpoints, value }) {
174
164
  const nextBreakpointIndex = breakpoints
175
165
  .sort((item1, item2) => (item1 > item2 ? 1 : -1))
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toGeneratedSelectors = void 0;
4
+ function toGeneratedSelectors({ elementReferences, transformElementReference, }) {
5
+ var _a, _b, _c;
6
+ const elementReferencesToMark = [
7
+ (_a = elementReferences.target) !== null && _a !== void 0 ? _a : [],
8
+ (_b = elementReferences.scrolling) !== null && _b !== void 0 ? _b : [],
9
+ (_c = elementReferences.calculate) !== null && _c !== void 0 ? _c : [],
10
+ ].flat();
11
+ return { elementReferencesToMark, getGeneratedSelectors };
12
+ function getGeneratedSelectors(generatedSelectors) {
13
+ var _a, _b, _c;
14
+ let target = undefined;
15
+ let scrolling = undefined;
16
+ let calculate = [];
17
+ if (generatedSelectors) {
18
+ let offset = 0;
19
+ if (elementReferences.target) {
20
+ target = (_a = generatedSelectors[offset++].safeSelector) !== null && _a !== void 0 ? _a : undefined;
21
+ if (!target)
22
+ throw new Error('Target element not found');
23
+ }
24
+ if (elementReferences.scrolling) {
25
+ scrolling = (_b = generatedSelectors[offset++].safeSelector) !== null && _b !== void 0 ? _b : undefined;
26
+ }
27
+ calculate = generatedSelectors.slice(offset);
28
+ }
29
+ else {
30
+ target = elementReferences.target && transformElementReference(elementReferences.target);
31
+ scrolling = elementReferences.scrolling && transformElementReference(elementReferences.scrolling);
32
+ calculate = ((_c = elementReferences.calculate) !== null && _c !== void 0 ? _c : []).map(elementReference => {
33
+ var _a;
34
+ const selector = (_a = transformElementReference(elementReference)) !== null && _a !== void 0 ? _a : null;
35
+ return { originalSelector: selector, safeSelector: selector };
36
+ });
37
+ }
38
+ return { target, scrolling, calculate };
39
+ }
40
+ }
41
+ exports.toGeneratedSelectors = toGeneratedSelectors;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.startMemoryUsageLogging = void 0;
27
+ const utils = __importStar(require("@applitools/utils"));
28
+ function startMemoryUsageLogging({ timeout = 30000, logger }) {
29
+ var _a;
30
+ logger = logger.extend({ tags: [`mem-usage-${utils.general.shortid()}`] });
31
+ const interval = setInterval(() => logger.log(formatMemoryUsage(process.memoryUsage())), (_a = utils.general.getEnvValue('MEMORY_LOG_TIMEOUT', 'number')) !== null && _a !== void 0 ? _a : timeout);
32
+ interval.unref();
33
+ return { stop };
34
+ function stop() {
35
+ clearInterval(interval);
36
+ }
37
+ }
38
+ exports.startMemoryUsageLogging = startMemoryUsageLogging;
39
+ function formatMemoryUsage(usage) {
40
+ return `Memory usage: ${Object.entries(usage)
41
+ .map(([key, value]) => `${key}: ${toMB(value)}MB`)
42
+ .join(', ')}`;
43
+ }
44
+ function toMB(size) {
45
+ return Math.round((size / 1024 / 1024) * 100) / 100;
46
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/core",
3
- "version": "4.3.0",
3
+ "version": "4.5.0",
4
4
  "homepage": "https://applitools.com",
5
5
  "bugs": {
6
6
  "url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -59,6 +59,12 @@
59
59
  },
60
60
  "sea": {
61
61
  "bin": "eyes",
62
+ "certs": {
63
+ "win": {
64
+ "cert": "env.CODE_SIGNING_CERT_WIN",
65
+ "pass": "env.CODE_SIGNING_PASS_WIN"
66
+ }
67
+ },
62
68
  "targets": {
63
69
  "node20-linux-x64-glibc-217": "./bin/core-linux",
64
70
  "node20-linux-x64-musl": "./bin/core-alpine",
@@ -71,15 +77,15 @@
71
77
  "@applitools/core-base": "1.7.4",
72
78
  "@applitools/dom-capture": "11.2.4",
73
79
  "@applitools/dom-snapshot": "4.7.14",
74
- "@applitools/driver": "1.15.2",
75
- "@applitools/ec-client": "1.7.17",
80
+ "@applitools/driver": "1.16.0",
81
+ "@applitools/ec-client": "1.7.19",
76
82
  "@applitools/logger": "2.0.14",
77
- "@applitools/nml-client": "1.5.17",
83
+ "@applitools/nml-client": "1.6.1",
78
84
  "@applitools/req": "1.6.4",
79
- "@applitools/screenshoter": "3.8.17",
85
+ "@applitools/screenshoter": "3.8.19",
80
86
  "@applitools/snippets": "2.4.24",
81
87
  "@applitools/socket": "1.1.14",
82
- "@applitools/spec-driver-webdriver": "1.0.51",
88
+ "@applitools/spec-driver-webdriver": "1.0.53",
83
89
  "@applitools/ufg-client": "1.9.9",
84
90
  "@applitools/utils": "1.7.0",
85
91
  "@types/ws": "8.5.5",
@@ -94,11 +100,11 @@
94
100
  "devDependencies": {
95
101
  "@applitools/bongo": "^5.7.6",
96
102
  "@applitools/sea": "^1.0.0",
97
- "@applitools/spec-driver-puppeteer": "^1.3.1",
98
- "@applitools/spec-driver-selenium": "^1.5.65",
103
+ "@applitools/spec-driver-puppeteer": "^1.3.3",
104
+ "@applitools/spec-driver-selenium": "^1.5.67",
99
105
  "@applitools/test-server": "^1.2.2",
100
106
  "@applitools/test-utils": "^1.5.17",
101
- "@applitools/tunnel-client": "^1.3.2",
107
+ "@applitools/tunnel-client": "^1.4.0",
102
108
  "@types/node": "^12.20.55",
103
109
  "@types/selenium-webdriver": "^4.1.2",
104
110
  "@types/semver": "^7.5.4",
@@ -5,8 +5,11 @@ import { type SpecType, type ElementReference, type Selector } from '@applitools
5
5
  export declare function toBaseCheckSettings<TSpec extends SpecType>({ settings }: {
6
6
  settings: CheckSettings<TSpec>;
7
7
  }): {
8
- elementReferencesToCalculate: ElementReference<TSpec>[];
9
- elementReferenceToTarget: ElementReference<TSpec> | undefined;
8
+ elementReferences: {
9
+ target: ElementReference<TSpec> | undefined;
10
+ scrolling: ElementReference<TSpec> | undefined;
11
+ calculate: ElementReference<TSpec>[];
12
+ };
10
13
  getBaseCheckSettings: ({ calculatedRegions, preserveTransformation, }: {
11
14
  calculatedRegions: {
12
15
  selector?: Selector;
@@ -3,9 +3,8 @@ import { type SpecType, type Context } from '@applitools/driver';
3
3
  import { type LazyLoadOptions } from '../types';
4
4
  export declare function waitForLazyLoad<TSpec extends SpecType>({ context, settings, logger, }: {
5
5
  context: Context<TSpec>;
6
- settings: LazyLoadOptions & {
6
+ settings?: LazyLoadOptions & {
7
7
  pollTimeout?: number;
8
- waitingTime?: number;
9
8
  };
10
9
  logger: Logger;
11
10
  }): Promise<void>;
@@ -5,6 +5,21 @@ interface Log {
5
5
  level?: string;
6
6
  message: string;
7
7
  }
8
+ interface GroupedLog<TGroupedLog extends GroupedLog<TGroupedLog>> {
9
+ [key: string]: TGroupedLog;
10
+ }
11
+ type StructuredLog = GroupedLog<StructuredLog> & {
12
+ logs?: Log[];
13
+ };
14
+ type AnalyzedLog = GroupedLog<AnalyzedLog> & {
15
+ logs?: string[];
16
+ startedAt: number;
17
+ finishedAt: number;
18
+ time: number;
19
+ conclusion: string;
20
+ };
8
21
  export declare function parseLogs(logs: string): Log[];
9
- export declare function structureLogs(logs: Log[]): any;
22
+ export declare function stringifyLog(log: Log): string;
23
+ export declare function structureLogs(logs: Log[]): StructuredLog;
24
+ export declare function analyzeLogs({ logs, ...groups }: StructuredLog): AnalyzedLog;
10
25
  export {};
@@ -11,8 +11,8 @@ type Options<TSpec extends SpecType> = {
11
11
  logger: Logger;
12
12
  };
13
13
  export declare function makeCheck<TSpec extends SpecType>({ eyes, target: defaultTarget, environments: defaultEnvironments, spec, signal, logger: mainLogger, }: Options<TSpec>): ({ target, settings, logger, }?: {
14
- settings?: CheckSettings<TSpec> | undefined;
15
14
  target?: Target<TSpec> | undefined;
15
+ settings?: CheckSettings<TSpec> | undefined;
16
16
  logger?: Logger | undefined;
17
17
  }) => Promise<void>;
18
18
  export {};
@@ -1,21 +1,20 @@
1
- import type { MaybeArray, Region } from '@applitools/utils';
1
+ import type { MaybeArray } from '@applitools/utils';
2
2
  import type * as AutomationCore from '../automation/types';
3
- import { type Selector, type SpecType } from '@applitools/driver';
3
+ import { type SpecType, type CommonSelector } from '@applitools/driver';
4
4
  import { type Logger } from '@applitools/logger';
5
5
  import { type Proxy } from '@applitools/req';
6
- import { type UFGClient, type UFGClientSettings, type DomSnapshot, type AndroidSnapshot, type IOSSnapshot } from '@applitools/ufg-client';
6
+ import { type UFGClient, type UFGClientSettings, type DomSnapshot as UFGDomSnapshot, type AndroidSnapshot as UFGAndroidSnapshot, type IOSSnapshot as UFGIOSSnapshot } from '@applitools/ufg-client';
7
7
  export * from '../automation/types';
8
- export type SnapshotTarget = MaybeArray<SnapshotResult<DomSnapshot>> | MaybeArray<AndroidSnapshot> | MaybeArray<IOSSnapshot>;
9
- export type Target<TSpec extends SpecType> = SnapshotTarget | AutomationCore.Target<TSpec>;
10
- export type SnapshotResult<TSnapshotType extends DomSnapshot | AndroidSnapshot | IOSSnapshot> = {
11
- snapshot: TSnapshotType;
12
- selectorsToCalculate?: {
13
- originalSelector: Selector | null;
14
- safeSelector: Selector | null;
8
+ export type DomSnapshot = UFGDomSnapshot & {
9
+ generatedSelectors?: {
10
+ originalSelector: CommonSelector | null;
11
+ safeSelector: CommonSelector | null;
15
12
  }[];
16
- regionToTarget?: Selector | Region;
17
- scrollRootSelector?: Selector;
18
13
  };
14
+ export type AndroidSnapshot = UFGAndroidSnapshot;
15
+ export type IOSSnapshot = UFGIOSSnapshot;
16
+ export type SnapshotTarget = MaybeArray<DomSnapshot> | MaybeArray<AndroidSnapshot> | MaybeArray<IOSSnapshot>;
17
+ export type Target<TSpec extends SpecType> = SnapshotTarget | AutomationCore.Target<TSpec>;
19
18
  export interface Core<TSpec extends SpecType> extends AutomationCore.Core<TSpec> {
20
19
  readonly type: 'ufg';
21
20
  getUFGClient(options?: {
@@ -1,6 +1,6 @@
1
+ import { type DomSnapshot } from '../types';
1
2
  import { type Logger } from '@applitools/logger';
2
3
  import { type SpecType, type Context, type Cookie } from '@applitools/driver';
3
- import { type DomSnapshot } from '@applitools/ufg-client';
4
4
  export type RawDomSnapshot = {
5
5
  url: string;
6
6
  selector: string;
@@ -1,24 +1,23 @@
1
- import type { LazyLoadOptions, SnapshotResult } from '../types';
1
+ import type { DomSnapshot, LazyLoadOptions } from '../types';
2
2
  import { type Size } from '@applitools/utils';
3
3
  import { type Logger } from '@applitools/logger';
4
- import { type SpecType, type Driver } from '@applitools/driver';
5
- import { type DomSnapshot, type Environment } from '@applitools/ufg-client';
4
+ import { type SpecType, type Driver, type ElementReference } from '@applitools/driver';
5
+ import { type Environment } from '@applitools/ufg-client';
6
6
  import { type DomSnapshotSettings } from './take-dom-snapshot';
7
- import { type CalculateRegionsOptions } from './calculate-regions';
8
7
  export * from './take-dom-snapshot';
9
- export type DomSnapshotsSettings = DomSnapshotSettings & {
8
+ export type DomSnapshotsSettings<TSpec extends SpecType> = DomSnapshotSettings & {
10
9
  environments: Environment[];
11
- waitBeforeCapture?: number | (() => void);
10
+ waitBeforeCapture?: number | (() => Promise<void>);
12
11
  layoutBreakpoints?: {
13
12
  breakpoints: number[] | boolean;
14
13
  reload?: boolean;
15
14
  };
16
- calculateRegionsOptions?: CalculateRegionsOptions;
17
15
  lazyLoad?: boolean | LazyLoadOptions;
16
+ elementReferences?: ElementReference<TSpec>[];
18
17
  };
19
18
  export declare function takeDomSnapshots<TSpec extends SpecType>({ driver, settings, hooks, provides, logger, }: {
20
19
  driver: Driver<TSpec>;
21
- settings: DomSnapshotsSettings;
20
+ settings: DomSnapshotsSettings<TSpec>;
22
21
  hooks?: {
23
22
  beforeEachSnapshot?(): void | Promise<void>;
24
23
  };
@@ -27,4 +26,4 @@ export declare function takeDomSnapshots<TSpec extends SpecType>({ driver, setti
27
26
  getIOSDevices(): Promise<Record<string, Record<string, Size>>>;
28
27
  };
29
28
  logger: Logger;
30
- }): Promise<SnapshotResult<DomSnapshot>[]>;
29
+ }): Promise<DomSnapshot[]>;
@@ -0,0 +1,29 @@
1
+ import { type SpecType, type ElementReference, type CommonSelector } from '@applitools/driver';
2
+ export declare function toGeneratedSelectors<TSpec extends SpecType>({ elementReferences, transformElementReference, }: {
3
+ elementReferences: {
4
+ target?: ElementReference<TSpec>;
5
+ scrolling?: ElementReference<TSpec>;
6
+ calculate?: ElementReference<TSpec>[];
7
+ };
8
+ transformElementReference: (elementReference: ElementReference<TSpec>) => CommonSelector | undefined;
9
+ }): {
10
+ elementReferencesToMark: (string | TSpec["element"] | TSpec["secondary"]["element"] | TSpec["selector"] | TSpec["secondary"]["selector"] | {
11
+ selector: string | TSpec["selector"] | TSpec["secondary"]["selector"];
12
+ type?: string | undefined;
13
+ child?: TSpec["selector"] | TSpec["secondary"]["selector"] | CommonSelector<TSpec["selector"] | TSpec["secondary"]["selector"]> | undefined;
14
+ shadow?: TSpec["selector"] | TSpec["secondary"]["selector"] | CommonSelector<TSpec["selector"] | TSpec["secondary"]["selector"]> | undefined;
15
+ frame?: TSpec["selector"] | TSpec["secondary"]["selector"] | CommonSelector<TSpec["selector"] | TSpec["secondary"]["selector"]> | undefined;
16
+ fallback?: TSpec["selector"] | TSpec["secondary"]["selector"] | CommonSelector<TSpec["selector"] | TSpec["secondary"]["selector"]> | undefined;
17
+ } | (NonNullable<TSpec["element"]> extends infer T ? T extends NonNullable<TSpec["element"]> ? T extends readonly (infer InnerArr)[] ? InnerArr : T : never : never) | (NonNullable<TSpec["secondary"]["element"]> extends infer T_1 ? T_1 extends NonNullable<TSpec["secondary"]["element"]> ? T_1 extends readonly (infer InnerArr)[] ? InnerArr : T_1 : never : never) | (NonNullable<TSpec["selector"]> extends infer T_2 ? T_2 extends NonNullable<TSpec["selector"]> ? T_2 extends readonly (infer InnerArr)[] ? InnerArr : T_2 : never : never) | (NonNullable<TSpec["secondary"]["selector"]> extends infer T_3 ? T_3 extends NonNullable<TSpec["secondary"]["selector"]> ? T_3 extends readonly (infer InnerArr)[] ? InnerArr : T_3 : never : never))[];
18
+ getGeneratedSelectors: (generatedSelectors?: {
19
+ originalSelector: CommonSelector | null;
20
+ safeSelector: CommonSelector | null;
21
+ }[]) => {
22
+ target: CommonSelector | undefined;
23
+ scrolling: CommonSelector | undefined;
24
+ calculate: {
25
+ originalSelector: CommonSelector | null;
26
+ safeSelector: CommonSelector | null;
27
+ }[];
28
+ };
29
+ };
@@ -0,0 +1,7 @@
1
+ import { type Logger } from '@applitools/logger';
2
+ export declare function startMemoryUsageLogging({ timeout, logger }: {
3
+ timeout?: number;
4
+ logger: Logger;
5
+ }): {
6
+ stop(): void;
7
+ };
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.calculateRegions = void 0;
4
- const generate_safe_selectors_1 = require("../utils/generate-safe-selectors");
5
- async function calculateRegions({ driver, elementReferencesToCalculate, elementReferenceToTarget, scrollRootElement, }) {
6
- var _a, _b;
7
- const elementReferences = [
8
- ...(elementReferenceToTarget ? [elementReferenceToTarget] : []),
9
- ...(scrollRootElement ? [scrollRootElement] : []),
10
- ...elementReferencesToCalculate,
11
- ];
12
- const { cleanupGeneratedSelectors, selectors } = await (0, generate_safe_selectors_1.generateSafeSelectors)({
13
- context: driver.currentContext,
14
- elementReferences,
15
- });
16
- let selectorsToCalculate = selectors;
17
- let regionToTarget;
18
- let scrollRootSelector;
19
- if (elementReferenceToTarget) {
20
- if (!((_a = selectorsToCalculate[0]) === null || _a === void 0 ? void 0 : _a.safeSelector))
21
- throw new Error('Target element not found');
22
- regionToTarget = selectorsToCalculate[0].safeSelector;
23
- selectorsToCalculate = selectorsToCalculate.slice(1);
24
- }
25
- if (scrollRootElement) {
26
- scrollRootSelector = (_b = selectorsToCalculate[0].safeSelector) !== null && _b !== void 0 ? _b : undefined;
27
- selectorsToCalculate = selectorsToCalculate.slice(1);
28
- }
29
- return { cleanupGeneratedSelectors, selectorsToCalculate, regionToTarget, scrollRootSelector };
30
- }
31
- exports.calculateRegions = calculateRegions;
@@ -1,22 +0,0 @@
1
- import type { SpecType, Driver, ElementReference } from '@applitools/driver';
2
- export type CalculateRegionsOptions = {
3
- elementReferencesToCalculate: ElementReference<SpecType>[];
4
- elementReferenceToTarget?: ElementReference<SpecType>;
5
- scrollRootElement?: ElementReference<SpecType>;
6
- };
7
- export declare function calculateRegions<TSpec extends SpecType>({ driver, elementReferencesToCalculate, elementReferenceToTarget, scrollRootElement, }: {
8
- driver: Driver<TSpec>;
9
- } & CalculateRegionsOptions): Promise<{
10
- cleanupGeneratedSelectors: () => Promise<void>;
11
- selectorsToCalculate: ({
12
- safeSelector: null;
13
- originalSelector: null;
14
- elementReference: ElementReference<TSpec>;
15
- } | {
16
- safeSelector: import("@applitools/driver").CommonSelector;
17
- originalSelector: import("@applitools/driver").CommonSelector | null;
18
- elementReference: ElementReference<TSpec>;
19
- })[];
20
- regionToTarget: import("@applitools/driver").CommonSelector | undefined;
21
- scrollRootSelector: import("@applitools/driver").CommonSelector | undefined;
22
- }>;