@applitools/core 2.4.4 → 2.4.6

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
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 2.4.6 - 2023/4/4
6
+
7
+ ### Features
8
+ ### Bug fixes
9
+ - Fixed relative url resolution in css files
10
+ - Added timeout to css fetching during preparing dom capture
11
+
12
+ ## 2.4.5 - 2023/3/31
13
+
14
+ ### Features
15
+ - Added `removeDuplicateTests` property to the `GetManagerResultsSettings`
16
+ ### Bug fixes
17
+
5
18
  ## 2.4.4 - 2023/3/30
6
19
 
7
20
  ### Features
@@ -37,6 +37,7 @@ function makeExtractText({ core, spec, logger: defaultLogger }) {
37
37
  }
38
38
  settings = utils.types.isArray(settings) ? settings : [settings];
39
39
  const driver = await (0, driver_1.makeDriver)({ spec, driver: target, logger });
40
+ const environment = await driver.getEnvironment();
40
41
  const results = await settings.reduce(async (prev, settings) => {
41
42
  var _a;
42
43
  const steps = await prev;
@@ -54,7 +55,7 @@ function makeExtractText({ core, spec, logger: defaultLogger }) {
54
55
  size: utils.geometry.size(screenshot.region),
55
56
  locationInViewport: utils.geometry.location(screenshot.region),
56
57
  };
57
- if (driver.isWeb) {
58
+ if (environment.isWeb) {
58
59
  if (settings.fully)
59
60
  await screenshot.scrollingElement.setAttribute('data-applitools-scroll', 'true');
60
61
  else
@@ -35,12 +35,13 @@ function makeLocateText({ core, spec, logger: defaultLogger }) {
35
35
  return core.base.locateText({ target, settings: settings, logger });
36
36
  }
37
37
  const driver = await (0, driver_1.makeDriver)({ spec, driver: target, logger });
38
+ const environment = await driver.getEnvironment();
38
39
  const screenshot = await (0, take_screenshot_1.takeScreenshot)({ driver, settings, logger });
39
40
  const baseTarget = {
40
41
  image: await screenshot.image.toPng(),
41
42
  locationInViewport: utils.geometry.location(screenshot.region),
42
43
  };
43
- if (driver.isWeb) {
44
+ if (environment.isWeb) {
44
45
  // if (settings.fully) await screenshot.scrollingElement.setAttribute('data-applitools-scroll', 'true')
45
46
  // else await screenshot.element?.setAttribute('data-applitools-scroll', 'true')
46
47
  // baseTarget.dom = await takeDomCapture({driver, logger}).catch(() => null)
@@ -28,6 +28,7 @@ const utils = __importStar(require("@applitools/utils"));
28
28
  const { takeScreenshot: legacyTakeScreenshot } = require('@applitools/screenshoter');
29
29
  async function takeScreenshot({ driver, settings, logger, }) {
30
30
  var _a, _b;
31
+ const environment = await driver.getEnvironment();
31
32
  return legacyTakeScreenshot({
32
33
  driver,
33
34
  frames: (_a = settings.frames) === null || _a === void 0 ? void 0 : _a.map(frame => {
@@ -43,7 +44,7 @@ async function takeScreenshot({ driver, settings, logger, }) {
43
44
  scrollingMode: (_b = settings.stitchMode) === null || _b === void 0 ? void 0 : _b.toLowerCase(),
44
45
  overlap: settings.overlap,
45
46
  wait: settings.waitBeforeCapture,
46
- framed: driver.isNative,
47
+ framed: environment.isNative,
47
48
  lazyLoad: settings.lazyLoad,
48
49
  stabilization: settings.normalization && {
49
50
  crop: settings.normalization.cut,
@@ -7,10 +7,11 @@ function makeCheckAndClose({ type: defaultType = 'classic', eyes, target: defaul
7
7
  var _a;
8
8
  settings = { ...config === null || config === void 0 ? void 0 : config.screenshot, ...config === null || config === void 0 ? void 0 : config.check, ...config === null || config === void 0 ? void 0 : config.close, ...settings };
9
9
  const driver = (0, driver_1.isDriver)(target, spec) ? await (0, driver_1.makeDriver)({ spec, driver: target, logger }) : null;
10
+ const environment = await (driver === null || driver === void 0 ? void 0 : driver.getEnvironment());
10
11
  const typedEyes = await eyes.getTypedEyes({
11
12
  type,
12
13
  settings: (_a = settings.renderers) === null || _a === void 0 ? void 0 : _a.map(renderer => ({
13
- type: (driver === null || driver === void 0 ? void 0 : driver.isNative) ? 'native' : 'web',
14
+ type: (environment === null || environment === void 0 ? void 0 : environment.isNative) ? 'native' : 'web',
14
15
  renderer,
15
16
  })),
16
17
  logger,
package/dist/check.js CHANGED
@@ -60,10 +60,11 @@ function makeCheck({ type: defaultType = 'classic', eyes, target: defaultTarget,
60
60
  logger.console.log(chalk_1.default.yellow(`The "Content" match level value has been deprecated, use "IgnoreColors" instead.`));
61
61
  }
62
62
  const driver = (0, driver_1.isDriver)(target, spec) ? await (0, driver_1.makeDriver)({ spec, driver: target, logger }) : null;
63
+ const environment = await (driver === null || driver === void 0 ? void 0 : driver.getEnvironment());
63
64
  const typedEyes = await eyes.getTypedEyes({
64
65
  type,
65
66
  settings: (_r = settings.renderers) === null || _r === void 0 ? void 0 : _r.map(renderer => ({
66
- type: (driver === null || driver === void 0 ? void 0 : driver.isNative) ? 'native' : 'web',
67
+ type: (environment === null || environment === void 0 ? void 0 : environment.isNative) ? 'native' : 'web',
67
68
  renderer,
68
69
  })),
69
70
  logger,
@@ -42,7 +42,8 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, logger: defaultL
42
42
  return (await Promise.all(baseEyes.map(baseEyes => baseEyes.checkAndClose({ target, settings: baseSettings, logger })))).flat();
43
43
  }
44
44
  const driver = await (0, driver_1.makeDriver)({ spec, driver: target, logger });
45
- if (settings.lazyLoad && driver.isWeb) {
45
+ const environment = await driver.getEnvironment();
46
+ if (settings.lazyLoad && environment.isWeb) {
46
47
  await (0, wait_for_lazy_load_1.waitForLazyLoad)({
47
48
  context: driver.currentContext,
48
49
  settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
@@ -63,7 +64,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, logger: defaultL
63
64
  isTransformed: true,
64
65
  };
65
66
  const baseSettings = getBaseCheckSettings({ calculatedRegions: screenshot.calculatedRegions });
66
- if (driver.isWeb && settings.sendDom) {
67
+ if (environment.isWeb && settings.sendDom) {
67
68
  if (settings.fully)
68
69
  await screenshot.scrollingElement.setAttribute('data-applitools-scroll', 'true');
69
70
  else
@@ -72,7 +73,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, logger: defaultL
72
73
  }
73
74
  if (settings.pageId) {
74
75
  const scrollingElement = await driver.mainContext.getScrollingElement();
75
- const scrollingOffset = !scrollingElement || driver.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
76
+ const scrollingOffset = !scrollingElement || environment.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
76
77
  baseTarget.locationInView = utils.geometry.offset(scrollingOffset, screenshot.region);
77
78
  baseTarget.fullViewSize = scrollingElement
78
79
  ? await scrollingElement.getContentSize()
@@ -41,9 +41,9 @@ function makeCheck({ eyes, target: defaultTarget, spec, logger: defaultLogger, }
41
41
  return (await Promise.all(baseEyes.map(baseEyes => baseEyes.check({ target, settings: settings, logger })))).flat();
42
42
  }
43
43
  const driver = await (0, driver_1.makeDriver)({ spec, driver: target, logger });
44
- await driver.refreshContexts();
44
+ const environment = await driver.getEnvironment();
45
45
  await driver.currentContext.setScrollingElement((_a = settings.scrollRootElement) !== null && _a !== void 0 ? _a : null);
46
- if (settings.lazyLoad && driver.isWeb) {
46
+ if (settings.lazyLoad && environment.isWeb) {
47
47
  if (settings.lazyLoad) {
48
48
  await (0, wait_for_lazy_load_1.waitForLazyLoad)({
49
49
  context: driver.currentContext,
@@ -73,7 +73,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, logger: defaultLogger, }
73
73
  isTransformed: true,
74
74
  };
75
75
  baseSettings = getBaseCheckSettings({ calculatedRegions: screenshot.calculatedRegions });
76
- if (driver.isWeb && settings.sendDom) {
76
+ if (environment.isWeb && settings.sendDom) {
77
77
  if (settings.fully)
78
78
  await screenshot.scrollingElement.setAttribute('data-applitools-scroll', 'true');
79
79
  else
@@ -82,7 +82,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, logger: defaultLogger, }
82
82
  }
83
83
  if (settings.pageId) {
84
84
  const scrollingElement = await driver.mainContext.getScrollingElement();
85
- const scrollingOffset = !scrollingElement || driver.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
85
+ const scrollingOffset = !scrollingElement || environment.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
86
86
  baseTarget.locationInView = utils.geometry.offset(scrollingOffset, screenshot.region);
87
87
  baseTarget.fullViewSize = scrollingElement
88
88
  ? await scrollingElement.getContentSize()
@@ -33,46 +33,48 @@ const abort_1 = require("./abort");
33
33
  const utils = __importStar(require("@applitools/utils"));
34
34
  function makeOpenEyes({ core, spec, logger: defaultLogger }) {
35
35
  return async function openEyes({ target, settings, base, logger = defaultLogger, }) {
36
- var _a, _b, _c, _d, _e;
37
- var _f;
36
+ var _a, _b, _c, _d, _e, _f;
37
+ var _g;
38
38
  logger.log(`Command "openEyes" is called with ${target ? 'default driver and' : ''}`, ...(settings ? ['settings', settings] : []), base ? 'predefined eyes' : '');
39
39
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
40
40
  if (driver && !base) {
41
+ const environment = await driver.getEnvironment();
41
42
  const currentContext = driver.currentContext;
42
43
  (_a = settings.environment) !== null && _a !== void 0 ? _a : (settings.environment = {});
43
- if (driver.isEC) {
44
- settings.environment.ecSessionId = driver.sessionId;
44
+ if (environment.isEC) {
45
+ settings.environment.ecSessionId = (await driver.getSessionId());
45
46
  }
46
- if (driver.isWeb) {
47
- (_b = (_f = settings.environment).userAgent) !== null && _b !== void 0 ? _b : (_f.userAgent = driver.userAgent);
47
+ if (environment.isWeb) {
48
+ (_b = (_g = settings.environment).userAgent) !== null && _b !== void 0 ? _b : (_g.userAgent = (_c = (await driver.getUserAgentLegacy())) !== null && _c !== void 0 ? _c : undefined);
48
49
  }
49
- if (!settings.environment.deviceName && driver.deviceName) {
50
- settings.environment.deviceName = driver.deviceName;
50
+ if (!settings.environment.deviceName && environment.deviceName) {
51
+ settings.environment.deviceName = environment.deviceName;
51
52
  }
52
53
  if (!settings.environment.os) {
53
- if (driver.isNative && driver.platformName) {
54
- settings.environment.os = driver.platformName;
54
+ if (environment.isNative && environment.platformName) {
55
+ settings.environment.os = environment.platformName;
55
56
  if (!settings.keepPlatformNameAsIs) {
56
- if ((_c = settings.environment.os) === null || _c === void 0 ? void 0 : _c.startsWith('android')) {
57
+ if ((_d = settings.environment.os) === null || _d === void 0 ? void 0 : _d.startsWith('android')) {
57
58
  settings.environment.os = `Android${settings.environment.os.slice(7)}`;
58
59
  }
59
- if ((_d = settings.environment.os) === null || _d === void 0 ? void 0 : _d.startsWith('ios')) {
60
+ if ((_e = settings.environment.os) === null || _e === void 0 ? void 0 : _e.startsWith('ios')) {
60
61
  settings.environment.os = `iOS${settings.environment.os.slice(3)}`;
61
62
  }
62
63
  }
63
- if (driver.platformVersion) {
64
- settings.environment.os += ` ${driver.platformVersion}`;
64
+ if (environment.platformVersion) {
65
+ settings.environment.os += ` ${environment.platformVersion}`;
65
66
  }
66
67
  }
67
- else if (driver.isChromium &&
68
- ((driver.isWindows && Number.parseInt(driver.browserVersion) >= 107) ||
69
- (driver.isMac && Number.parseInt(driver.browserVersion) >= 90))) {
70
- settings.environment.os = `${driver.platformName} ${(_e = driver.platformVersion) !== null && _e !== void 0 ? _e : ''}`.trim();
68
+ else if (environment.isChromium &&
69
+ ((environment.isWindows && Number.parseInt(environment.browserVersion) >= 107) ||
70
+ (environment.isMac && Number.parseInt(environment.browserVersion) >= 90))) {
71
+ settings.environment.os = `${environment.platformName} ${(_f = environment.platformVersion) !== null && _f !== void 0 ? _f : ''}`.trim();
71
72
  }
72
73
  }
73
- if (!settings.environment.viewportSize || driver.isMobile) {
74
+ if (!settings.environment.viewportSize || environment.isMobile) {
75
+ const viewport = await driver.getViewport();
74
76
  const size = await driver.getViewportSize();
75
- settings.environment.viewportSize = utils.geometry.scale(size, driver.viewportScale);
77
+ settings.environment.viewportSize = utils.geometry.scale(size, viewport.viewportScale);
76
78
  }
77
79
  else {
78
80
  await driver.setViewportSize(settings.environment.viewportSize);
@@ -4,16 +4,19 @@ exports.takeDomCapture = void 0;
4
4
  const req_1 = require("@applitools/req");
5
5
  const { getCaptureDomPoll, getPollResult, getCaptureDomPollForIE, getPollResultForIE, } = require('@applitools/dom-capture');
6
6
  async function takeDomCapture({ driver, settings, logger, }) {
7
- var _a, _b, _c;
8
- const isLegacyBrowser = driver.isIE || driver.isEdgeLegacy;
7
+ var _a;
8
+ const environment = await driver.getEnvironment();
9
+ const features = await driver.getFeatures();
10
+ const isLegacyBrowser = environment.isIE || environment.isEdgeLegacy;
9
11
  const arg = {
10
- chunkByteLength: (_a = settings === null || settings === void 0 ? void 0 : settings.chunkByteLength) !== null && _a !== void 0 ? _a : (Number(process.env.APPLITOOLS_SCRIPT_RESULT_MAX_BYTE_LENGTH) || (driver.isIOS ? 100000 : 250 * 1024 * 1024)),
12
+ chunkByteLength: (_a = settings === null || settings === void 0 ? void 0 : settings.chunkByteLength) !== null && _a !== void 0 ? _a : (Number(process.env.APPLITOOLS_SCRIPT_RESULT_MAX_BYTE_LENGTH) ||
13
+ (environment.isIOS ? 100000 : 250 * 1024 * 1024)),
11
14
  };
12
15
  const scripts = {
13
- main: ((_b = driver.features) === null || _b === void 0 ? void 0 : _b.canExecuteOnlyFunctionScripts)
16
+ main: features.canExecuteOnlyFunctionScripts
14
17
  ? require('@applitools/dom-capture').captureDomPoll
15
18
  : `return (${isLegacyBrowser ? await getCaptureDomPollForIE() : await getCaptureDomPoll()}).apply(null, arguments);`,
16
- poll: ((_c = driver.features) === null || _c === void 0 ? void 0 : _c.canExecuteOnlyFunctionScripts)
19
+ poll: features.canExecuteOnlyFunctionScripts
17
20
  ? require('@applitools/dom-capture').pollResult
18
21
  : `return (${isLegacyBrowser ? await getPollResultForIE() : await getPollResult()}).apply(null, arguments);`,
19
22
  };
@@ -63,12 +66,14 @@ async function takeDomCapture({ driver, settings, logger, }) {
63
66
  return dom;
64
67
  }
65
68
  async function fetchCssResource(url) {
69
+ var _a;
66
70
  logger.log(`Request to download css will be sent to the address "[GET]${url}"`);
67
71
  try {
68
72
  const response = await (0, req_1.req)(url, {
73
+ timeout: (_a = settings === null || settings === void 0 ? void 0 : settings.fetchTimeout) !== null && _a !== void 0 ? _a : 60000,
69
74
  retry: {
70
75
  limit: 1,
71
- validate: ({ response, error }) => Boolean(error) || !response.ok,
76
+ validate: ({ response, error }) => !!error || !response.ok,
72
77
  },
73
78
  fetch: settings === null || settings === void 0 ? void 0 : settings.fetch,
74
79
  });
@@ -3,25 +3,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeGetManagerResults = void 0;
4
4
  const test_error_1 = require("./errors/test-error");
5
5
  const internal_error_1 = require("./errors/internal-error");
6
+ const separate_duplicate_results_1 = require("./utils/separate-duplicate-results");
6
7
  function makeGetManagerResults({ core, storage, logger: defaultLogger, }) {
7
8
  return async function getManagerResults({ settings, logger = defaultLogger, } = {}) {
8
9
  var _a, _b, _c;
9
- const containers = await Promise.all(storage.map(async (eyes) => {
10
+ let containers = await storage.reduce(async (promise, eyes) => {
10
11
  try {
11
12
  const results = await eyes.getResults({ settings: { ...settings, throwErr: false }, logger });
12
- return results.map(result => {
13
- return {
13
+ return promise.then(containers => {
14
+ return containers.concat(results.map(result => ({
14
15
  result,
15
16
  error: result.status !== 'Passed' ? new test_error_1.TestError(result) : undefined,
16
17
  userTestId: result.userTestId,
17
18
  renderer: result.renderer,
18
- };
19
+ })));
19
20
  });
20
21
  }
21
22
  catch (error) {
22
- return [{ error: new internal_error_1.InternalError(error), ...error.info }];
23
+ return promise.then(containers => containers.concat({ error: new internal_error_1.InternalError(error), ...error.info }));
23
24
  }
24
- }));
25
+ }, Promise.resolve([]));
26
+ if (settings === null || settings === void 0 ? void 0 : settings.removeDuplicateTests) {
27
+ logger.log('User opted into removing duplicate tests, checking for duplicates...');
28
+ const [dedupedContainers, duplicateContainers] = (0, separate_duplicate_results_1.separateDuplicateResults)(containers);
29
+ containers = dedupedContainers;
30
+ if (!duplicateContainers.length)
31
+ logger.log('No duplicate tests found.');
32
+ else {
33
+ await Promise.all(duplicateContainers.map(async (container) => {
34
+ if (container.result) {
35
+ await core.deleteTest({
36
+ settings: {
37
+ ...container.result.server,
38
+ testId: container.result.id,
39
+ batchId: container.result.batchId,
40
+ secretToken: container.result.secretToken,
41
+ },
42
+ });
43
+ }
44
+ }));
45
+ logger.log('Done cleaning up duplicate tests!');
46
+ }
47
+ }
25
48
  const batches = storage.reduce((batches, eyes) => {
26
49
  if (!eyes.test.keepBatchOpen) {
27
50
  const settings = { ...eyes.test.server, batchId: eyes.test.batchId };
@@ -31,7 +54,7 @@ function makeGetManagerResults({ core, storage, logger: defaultLogger, }) {
31
54
  }, {});
32
55
  await core.closeBatch({ settings: Object.values(batches), logger }).catch(() => null);
33
56
  const summary = {
34
- results: containers.flat(),
57
+ results: containers,
35
58
  passed: 0,
36
59
  unresolved: 0,
37
60
  failed: 0,
package/dist/open-eyes.js CHANGED
@@ -54,7 +54,8 @@ function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core,
54
54
  (_p = settings.ignoreBaseline) !== null && _p !== void 0 ? _p : (settings.ignoreBaseline = false);
55
55
  (_q = settings.compareWithParentBranch) !== null && _q !== void 0 ? _q : (settings.compareWithParentBranch = false);
56
56
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
57
- if (driver === null || driver === void 0 ? void 0 : driver.isEC) {
57
+ const environment = await (driver === null || driver === void 0 ? void 0 : driver.getEnvironment());
58
+ if (environment === null || environment === void 0 ? void 0 : environment.isEC) {
58
59
  (_r = settings.properties) !== null && _r !== void 0 ? _r : (settings.properties = []);
59
60
  settings.properties.push({ name: 'Running platform', value: 'Execution cloud' });
60
61
  }
@@ -70,7 +71,7 @@ function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core,
70
71
  testConcurrency: concurrency,
71
72
  concurrentRendersPerTest: (_u = (_t = (_s = config === null || config === void 0 ? void 0 : config.check) === null || _s === void 0 ? void 0 : _s.renderers) === null || _t === void 0 ? void 0 : _t.length) !== null && _u !== void 0 ? _u : 1,
72
73
  node: { version: process.version, platform: process.platform, arch: process.arch },
73
- driverUrl: driver === null || driver === void 0 ? void 0 : driver.remoteHostname,
74
+ driverUrl: await (driver === null || driver === void 0 ? void 0 : driver.getDriverUrl()),
74
75
  extractedCIProvider: (0, extract_ci_provider_1.extractCIProvider)(),
75
76
  },
76
77
  },
@@ -39,7 +39,7 @@ const utils = __importStar(require("@applitools/utils"));
39
39
  const chalk_1 = __importDefault(require("chalk"));
40
40
  function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger: defaultLogger, }) {
41
41
  return async function checkAndClose({ target = defaultTarget, settings = {}, logger = defaultLogger, }) {
42
- var _a, _b, _c, _d, _e, _f, _g, _h;
42
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
43
43
  logger.log('Command "checkAndClose" is called with settings', settings);
44
44
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
45
45
  logger.warn('Command "checkAndClose" was called after test was already aborted');
@@ -63,8 +63,9 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
63
63
  let selectorsToCalculate;
64
64
  const driver = spec && (0, driver_1.isDriver)(target, spec) ? await (0, driver_1.makeDriver)({ spec, driver: target, logger }) : null;
65
65
  if (driver) {
66
+ const environment = await driver.getEnvironment();
66
67
  if (uniqueRenderers.length === 0) {
67
- if (driver.isWeb) {
68
+ if (environment.isWeb) {
68
69
  const viewportSize = await driver.getViewportSize();
69
70
  uniqueRenderers.push({ name: 'chrome', ...viewportSize });
70
71
  }
@@ -73,8 +74,8 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
73
74
  }
74
75
  }
75
76
  let cleanupGeneratedSelectors;
76
- if (driver.isWeb) {
77
- userAgent = driver.userAgent;
77
+ if (environment.isWeb) {
78
+ userAgent = (_b = (await driver.getUserAgentLegacy())) !== null && _b !== void 0 ? _b : undefined;
78
79
  const generated = await (0, generate_safe_selectors_1.generateSafeSelectors)({
79
80
  context: driver.currentContext,
80
81
  elementReferences: [
@@ -86,22 +87,22 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
86
87
  cleanupGeneratedSelectors = generated.cleanupGeneratedSelectors;
87
88
  selectorsToCalculate = generated.selectors;
88
89
  if (elementReferenceToTarget) {
89
- if (!((_b = selectorsToCalculate[0]) === null || _b === void 0 ? void 0 : _b.safeSelector))
90
+ if (!((_c = selectorsToCalculate[0]) === null || _c === void 0 ? void 0 : _c.safeSelector))
90
91
  throw new Error('Target element not found');
91
92
  regionToTarget = selectorsToCalculate[0].safeSelector;
92
93
  selectorsToCalculate = selectorsToCalculate.slice(1);
93
94
  }
94
95
  if (settings.scrollRootElement) {
95
- scrollRootSelector = (_c = selectorsToCalculate[0].safeSelector) !== null && _c !== void 0 ? _c : undefined;
96
+ scrollRootSelector = (_d = selectorsToCalculate[0].safeSelector) !== null && _d !== void 0 ? _d : undefined;
96
97
  selectorsToCalculate = selectorsToCalculate.slice(1);
97
98
  }
98
99
  }
99
100
  else {
100
101
  regionToTarget = (0, driver_1.isSelector)(elementReferenceToTarget)
101
- ? (_e = (_d = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _d === void 0 ? void 0 : _d.call(spec, settings.scrollRootElement)) !== null && _e !== void 0 ? _e : undefined
102
+ ? (_f = (_e = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _e === void 0 ? void 0 : _e.call(spec, settings.scrollRootElement)) !== null && _f !== void 0 ? _f : undefined
102
103
  : undefined;
103
104
  scrollRootSelector = (0, driver_1.isSelector)(settings.scrollRootElement)
104
- ? (_g = (_f = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _f === void 0 ? void 0 : _f.call(spec, settings.scrollRootElement)) !== null && _g !== void 0 ? _g : undefined
105
+ ? (_h = (_g = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _g === void 0 ? void 0 : _g.call(spec, settings.scrollRootElement)) !== null && _h !== void 0 ? _h : undefined
105
106
  : undefined;
106
107
  }
107
108
  const currentContext = driver.currentContext;
@@ -116,7 +117,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
116
117
  },
117
118
  hooks: {
118
119
  async beforeSnapshots() {
119
- if (settings.lazyLoad && driver.isWeb) {
120
+ if (settings.lazyLoad && environment.isWeb) {
120
121
  await (0, wait_for_lazy_load_1.waitForLazyLoad)({
121
122
  context: driver.currentContext,
122
123
  settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
@@ -130,7 +131,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
130
131
  getIOSDevices: ufgClient.getIOSDevices,
131
132
  },
132
133
  };
133
- if (driver.isWeb) {
134
+ if (environment.isWeb) {
134
135
  snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({ driver, ...snapshotOptions, logger });
135
136
  }
136
137
  else {
@@ -151,7 +152,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
151
152
  snapshots = !utils.types.isArray(target) ? Array(uniqueRenderers.length).fill(target) : target;
152
153
  snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
153
154
  }
154
- regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_h = elementReferenceToTarget) !== null && _h !== void 0 ? _h : settings.region);
155
+ regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_j = elementReferenceToTarget) !== null && _j !== void 0 ? _j : settings.region);
155
156
  selectorsToCalculate !== null && selectorsToCalculate !== void 0 ? selectorsToCalculate : (selectorsToCalculate = elementReferencesToCalculate.map(selector => ({
156
157
  originalSelector: selector,
157
158
  safeSelector: selector,
package/dist/ufg/check.js CHANGED
@@ -39,7 +39,7 @@ const utils = __importStar(require("@applitools/utils"));
39
39
  const chalk_1 = __importDefault(require("chalk"));
40
40
  function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultLogger, }) {
41
41
  return async function check({ target = defaultTarget, settings = {}, logger = defaultLogger, }) {
42
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
42
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
43
43
  logger.log('Command "check" is called with settings', settings);
44
44
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
45
45
  logger.warn('Command "check" was called after test was already aborted');
@@ -63,9 +63,10 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultL
63
63
  let selectorsToCalculate;
64
64
  const driver = spec && (0, driver_1.isDriver)(target, spec) ? await (0, driver_1.makeDriver)({ spec, driver: target, logger }) : null;
65
65
  if (driver) {
66
+ const environment = await driver.getEnvironment();
66
67
  await driver.currentContext.setScrollingElement((_b = settings.scrollRootElement) !== null && _b !== void 0 ? _b : null);
67
68
  if (uniqueRenderers.length === 0) {
68
- if (driver.isWeb) {
69
+ if (environment.isWeb) {
69
70
  const viewportSize = await driver.getViewportSize();
70
71
  uniqueRenderers.push({ name: 'chrome', ...viewportSize });
71
72
  }
@@ -74,8 +75,8 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultL
74
75
  }
75
76
  }
76
77
  let cleanupGeneratedSelectors;
77
- if (driver.isWeb) {
78
- userAgent = driver.userAgent;
78
+ if (environment.isWeb) {
79
+ userAgent = (_c = (await driver.getUserAgentLegacy())) !== null && _c !== void 0 ? _c : undefined;
79
80
  const generated = await (0, generate_safe_selectors_1.generateSafeSelectors)({
80
81
  context: driver.currentContext,
81
82
  elementReferences: [
@@ -87,22 +88,22 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultL
87
88
  cleanupGeneratedSelectors = generated.cleanupGeneratedSelectors;
88
89
  selectorsToCalculate = generated.selectors;
89
90
  if (elementReferenceToTarget) {
90
- if (!((_c = selectorsToCalculate[0]) === null || _c === void 0 ? void 0 : _c.safeSelector))
91
+ if (!((_d = selectorsToCalculate[0]) === null || _d === void 0 ? void 0 : _d.safeSelector))
91
92
  throw new Error('Target element not found');
92
93
  regionToTarget = selectorsToCalculate[0].safeSelector;
93
94
  selectorsToCalculate = selectorsToCalculate.slice(1);
94
95
  }
95
96
  if (settings.scrollRootElement) {
96
- scrollRootSelector = (_d = selectorsToCalculate[0].safeSelector) !== null && _d !== void 0 ? _d : undefined;
97
+ scrollRootSelector = (_e = selectorsToCalculate[0].safeSelector) !== null && _e !== void 0 ? _e : undefined;
97
98
  selectorsToCalculate = selectorsToCalculate.slice(1);
98
99
  }
99
100
  }
100
101
  else {
101
102
  regionToTarget = (0, driver_1.isSelector)(elementReferenceToTarget)
102
- ? (_f = (_e = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _e === void 0 ? void 0 : _e.call(spec, settings.scrollRootElement)) !== null && _f !== void 0 ? _f : undefined
103
+ ? (_g = (_f = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _f === void 0 ? void 0 : _f.call(spec, settings.scrollRootElement)) !== null && _g !== void 0 ? _g : undefined
103
104
  : undefined;
104
105
  scrollRootSelector = (0, driver_1.isSelector)(settings.scrollRootElement)
105
- ? (_h = (_g = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _g === void 0 ? void 0 : _g.call(spec, settings.scrollRootElement)) !== null && _h !== void 0 ? _h : undefined
106
+ ? (_j = (_h = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _h === void 0 ? void 0 : _h.call(spec, settings.scrollRootElement)) !== null && _j !== void 0 ? _j : undefined
106
107
  : undefined;
107
108
  }
108
109
  const currentContext = driver.currentContext;
@@ -117,7 +118,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultL
117
118
  },
118
119
  hooks: {
119
120
  async beforeSnapshots() {
120
- if (settings.lazyLoad && driver.isWeb) {
121
+ if (settings.lazyLoad && environment.isWeb) {
121
122
  await (0, wait_for_lazy_load_1.waitForLazyLoad)({
122
123
  context: driver.currentContext,
123
124
  settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
@@ -131,7 +132,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultL
131
132
  getIOSDevices: ufgClient.getIOSDevices,
132
133
  },
133
134
  };
134
- if (driver.isWeb) {
135
+ if (environment.isWeb) {
135
136
  snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({ driver, ...snapshotOptions, logger });
136
137
  }
137
138
  else {
@@ -152,7 +153,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: defaultL
152
153
  snapshots = !utils.types.isArray(target) ? Array(uniqueRenderers.length).fill(target) : target;
153
154
  snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
154
155
  }
155
- regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_j = elementReferenceToTarget) !== null && _j !== void 0 ? _j : settings.region);
156
+ regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_k = elementReferenceToTarget) !== null && _k !== void 0 ? _k : settings.region);
156
157
  selectorsToCalculate !== null && selectorsToCalculate !== void 0 ? selectorsToCalculate : (selectorsToCalculate = elementReferencesToCalculate.map(selector => ({
157
158
  originalSelector: selector,
158
159
  safeSelector: selector,
@@ -27,7 +27,7 @@ exports.makeGetNMLClient = void 0;
27
27
  const nml_client_1 = require("@applitools/nml-client");
28
28
  const utils = __importStar(require("@applitools/utils"));
29
29
  function makeGetNMLClient({ client, logger: defaultLogger }) {
30
- const getNMLClientWithCache = utils.general.cachify(getNMLClient, ([options]) => client ? 'default' : [options.driver.sessionId, options.config]);
30
+ const getNMLClientWithCache = utils.general.cachify(getNMLClient, ([options]) => client ? 'default' : [options.driver.guid, options.config]);
31
31
  if (client)
32
32
  getNMLClientWithCache.setCachedValue('default', Promise.resolve(client));
33
33
  return getNMLClientWithCache;
@@ -35,14 +35,15 @@ const abort_controller_1 = require("abort-controller");
35
35
  const utils = __importStar(require("@applitools/utils"));
36
36
  function makeOpenEyes({ core, spec, logger: defaultLogger }) {
37
37
  return async function openEyes({ target, settings, base, logger = defaultLogger, }) {
38
- var _a;
38
+ var _a, _b;
39
39
  logger.log(`Command "openEyes" is called with ${target ? 'default driver and' : ''}`, ...(settings ? ['settings', settings] : []), base ? 'predefined eyes' : '');
40
40
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger }));
41
41
  if (driver && !base) {
42
+ const environment = await (driver === null || driver === void 0 ? void 0 : driver.getEnvironment());
42
43
  const currentContext = driver.currentContext;
43
44
  (_a = settings.environment) !== null && _a !== void 0 ? _a : (settings.environment = {});
44
- if (driver.isEC) {
45
- settings.environment.ecSessionId = driver.sessionId;
45
+ if (environment.isEC) {
46
+ settings.environment.ecSessionId = (_b = (await driver.getSessionId())) !== null && _b !== void 0 ? _b : undefined;
46
47
  }
47
48
  if (settings.environment.viewportSize) {
48
49
  await driver.setViewportSize(settings.environment.viewportSize);
@@ -27,41 +27,43 @@ exports.extractCrossFrames = exports.deserializeDomSnapshot = exports.takeDomSna
27
27
  const utils = __importStar(require("@applitools/utils"));
28
28
  const { getProcessPagePoll, getPollResult, getProcessPagePollForIE, getPollResultForIE, } = require('@applitools/dom-snapshot');
29
29
  async function takeDomSnapshot({ context, settings, logger, }) {
30
- var _a;
31
30
  const driver = context.driver;
32
- const cookies = ((_a = driver.features) === null || _a === void 0 ? void 0 : _a.allCookies) ? await driver.getCookies().catch(() => []) : [];
31
+ const environment = await driver.getEnvironment();
32
+ const features = await driver.getFeatures();
33
+ const cookies = features.allCookies ? await driver.getCookies().catch(() => []) : [];
33
34
  const snapshot = deserializeDomSnapshot({ snapshot: await takeContextDomSnapshot({ context }) });
34
35
  snapshot.cookies = cookies;
35
36
  return snapshot;
36
37
  async function takeContextDomSnapshot({ context }) {
37
38
  // logger.log(`taking dom snapshot. ${context._reference ? `context referece: ${JSON.stringify(context._reference)}` : ''}`)
38
- var _a, _b, _c, _d, _e, _f;
39
- if (!((_a = driver.features) === null || _a === void 0 ? void 0 : _a.allCookies)) {
39
+ var _a, _b, _c;
40
+ if (!features.allCookies) {
40
41
  cookies.push(...(await context.getCookies()));
41
42
  }
42
- const isLegacyBrowser = driver.isIE || driver.isEdgeLegacy;
43
+ const isLegacyBrowser = environment.isIE || environment.isEdgeLegacy;
43
44
  const arg = {
44
45
  dontFetchResources: settings === null || settings === void 0 ? void 0 : settings.disableBrowserFetching,
45
46
  skipResources: settings === null || settings === void 0 ? void 0 : settings.skipResources,
46
47
  removeReverseProxyURLPrefixes: Boolean(process.env.APPLITOOLS_SCRIPT_REMOVE_REVERSE_PROXY_URL_PREFIXES),
47
- chunkByteLength: (_b = settings === null || settings === void 0 ? void 0 : settings.chunkByteLength) !== null && _b !== void 0 ? _b : (Number(process.env.APPLITOOLS_SCRIPT_RESULT_MAX_BYTE_LENGTH) || (driver.isIOS ? 100000 : 250 * 1024 * 1024)),
48
+ chunkByteLength: (_a = settings === null || settings === void 0 ? void 0 : settings.chunkByteLength) !== null && _a !== void 0 ? _a : (Number(process.env.APPLITOOLS_SCRIPT_RESULT_MAX_BYTE_LENGTH) ||
49
+ (environment.isIOS ? 100000 : 250 * 1024 * 1024)),
48
50
  serializeResources: true,
49
51
  compressResources: false,
50
52
  showLogs: settings === null || settings === void 0 ? void 0 : settings.showLogs,
51
53
  };
52
54
  const scripts = {
53
- main: ((_c = driver.features) === null || _c === void 0 ? void 0 : _c.canExecuteOnlyFunctionScripts)
55
+ main: features.canExecuteOnlyFunctionScripts
54
56
  ? require('@applitools/dom-snapshot').processPagePoll
55
57
  : `return (${isLegacyBrowser ? await getProcessPagePollForIE() : await getProcessPagePoll()}).apply(null, arguments);`,
56
- poll: ((_d = driver.features) === null || _d === void 0 ? void 0 : _d.canExecuteOnlyFunctionScripts)
58
+ poll: features.canExecuteOnlyFunctionScripts
57
59
  ? require('@applitools/dom-snapshot').pollResult
58
60
  : `return (${isLegacyBrowser ? await getPollResultForIE() : await getPollResult()}).apply(null, arguments);`,
59
61
  };
60
62
  const snapshot = await context.executePoll(scripts, {
61
63
  main: arg,
62
64
  poll: arg,
63
- executionTimeout: (_e = settings === null || settings === void 0 ? void 0 : settings.executionTimeout) !== null && _e !== void 0 ? _e : 5 * 60 * 1000,
64
- pollTimeout: (_f = settings === null || settings === void 0 ? void 0 : settings.pollTimeout) !== null && _f !== void 0 ? _f : 200,
65
+ executionTimeout: (_b = settings === null || settings === void 0 ? void 0 : settings.executionTimeout) !== null && _b !== void 0 ? _b : 5 * 60 * 1000,
66
+ pollTimeout: (_c = settings === null || settings === void 0 ? void 0 : settings.pollTimeout) !== null && _c !== void 0 ? _c : 200,
65
67
  });
66
68
  const crossFrames = extractCrossFrames({ snapshot, logger });
67
69
  for (const { reference, parentSnapshot, cdtNode } of crossFrames) {
@@ -4,16 +4,17 @@ exports.takeVHSes = void 0;
4
4
  async function takeVHSes({ driver, settings, hooks, logger, }) {
5
5
  var _a;
6
6
  logger.log('taking VHS');
7
- if (!driver.isAndroid && !driver.isIOS) {
7
+ const environment = await driver.getEnvironment();
8
+ if (!environment.isAndroid && !environment.isIOS) {
8
9
  throw new Error('cannot take VHS on mobile device other than iOS or Android');
9
10
  }
10
11
  await ((_a = hooks === null || hooks === void 0 ? void 0 : hooks.beforeSnapshots) === null || _a === void 0 ? void 0 : _a.call(hooks));
11
- const trigger = await driver.waitFor(driver.isAndroid
12
+ const trigger = await driver.waitFor(environment.isAndroid
12
13
  ? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_TriggerArea"]` }
13
14
  : { type: 'accessibility id', selector: 'UFG_TriggerArea' }, { timeout: 30000 });
14
15
  if (!trigger)
15
16
  throw new Error('Trigger element could not be found');
16
- if (driver.isAndroid) {
17
+ if (environment.isAndroid) {
17
18
  const apiKeyInput = await driver.element({
18
19
  type: 'xpath',
19
20
  selector: `//android.widget.EditText[@content-desc="UFG_Apikey"]`,
@@ -41,14 +42,14 @@ async function takeVHSes({ driver, settings, hooks, logger, }) {
41
42
  }
42
43
  }
43
44
  await trigger.click(); // TODO handle stale element exception and then find the trigger again and click it
44
- let label = await driver.waitFor(driver.isAndroid
45
+ let label = await driver.waitFor(environment.isAndroid
45
46
  ? { type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_SecondaryLabel"]` }
46
47
  : { type: 'accessibility id', selector: 'UFG_SecondaryLabel' }, { timeout: 10000 });
47
48
  if (!label) {
48
49
  // This might happen if the tap on the trigger area didn't happen due to Appium bug. So we try to find the trigger again and if it's present, we'll tap it.
49
50
  // If the trigger area is not present, then we're probably at the middle of taking the VHS - give it 50 seconds more until we give up
50
51
  logger.log('UFG_SecondaryLabel was not found after 10 seconds, trying to click UFG_TriggerArea again');
51
- const triggerRetry = await driver.waitFor(driver.isAndroid
52
+ const triggerRetry = await driver.waitFor(environment.isAndroid
52
53
  ? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_TriggerArea"]` }
53
54
  : { type: 'accessibility id', selector: 'UFG_TriggerArea' }, { timeout: 30000 });
54
55
  if (triggerRetry) {
@@ -58,7 +59,7 @@ async function takeVHSes({ driver, settings, hooks, logger, }) {
58
59
  else {
59
60
  logger.log('UFG_TriggerArea was NOT found on retry. Probably VHS is being taken.');
60
61
  }
61
- label = await driver.waitFor(driver.isAndroid
62
+ label = await driver.waitFor(environment.isAndroid
62
63
  ? { type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_SecondaryLabel"]` }
63
64
  : { type: 'accessibility id', selector: 'UFG_SecondaryLabel' }, { timeout: 50000 });
64
65
  if (!label) {
@@ -71,7 +72,7 @@ async function takeVHSes({ driver, settings, hooks, logger, }) {
71
72
  if (info.error)
72
73
  throw new Error(`Error while taking VHS - ${info.error}`);
73
74
  let vhs = '';
74
- if (driver.isIOS) {
75
+ if (environment.isIOS) {
75
76
  const label = await driver.element({ type: 'accessibility id', selector: 'UFG_Label' });
76
77
  if (!label)
77
78
  throw new Error('VHS label element could not be found');
@@ -99,14 +100,14 @@ async function takeVHSes({ driver, settings, hooks, logger, }) {
99
100
  else {
100
101
  throw new Error(`unknown mode for android: ${info.mode}`);
101
102
  }
102
- const clear = await driver.waitFor(driver.isAndroid
103
+ const clear = await driver.waitFor(environment.isAndroid
103
104
  ? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_ClearArea"]` }
104
105
  : { type: 'accessibility id', selector: 'UFG_ClearArea' }, { timeout: 30000 });
105
106
  if (!clear)
106
107
  throw new Error('Clear element could not be found');
107
108
  await clear.click();
108
109
  let snapshot;
109
- if (driver.isAndroid) {
110
+ if (environment.isAndroid) {
110
111
  snapshot = {
111
112
  platformName: 'android',
112
113
  vhsType: info.flavorName,
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.separateDuplicateResults = void 0;
4
+ function separateDuplicateResults(containers) {
5
+ const containerByBaselineId = new Map();
6
+ const duplicates = [];
7
+ const possibleDuplicateContainers = containers.filter(container => { var _a; return !((_a = container.result) === null || _a === void 0 ? void 0 : _a.keepIfDuplicate); });
8
+ for (const container of possibleDuplicateContainers) {
9
+ if (container.result) {
10
+ const containerForThisBaseline = containerByBaselineId.get(container.result.baselineId);
11
+ if (containerForThisBaseline === null || containerForThisBaseline === void 0 ? void 0 : containerForThisBaseline.result) {
12
+ const initializedAt1 = Date.parse(containerForThisBaseline.result.initializedAt);
13
+ const initializedAt2 = Date.parse(container.result.initializedAt);
14
+ if (initializedAt2 > initializedAt1) {
15
+ duplicates.push(containerForThisBaseline);
16
+ containerByBaselineId.set(container.result.baselineId, container);
17
+ }
18
+ else {
19
+ duplicates.push(container);
20
+ }
21
+ }
22
+ else {
23
+ containerByBaselineId.set(container.result.baselineId, container);
24
+ }
25
+ }
26
+ }
27
+ return [
28
+ // tests to keep
29
+ !duplicates.length ? containers : containers.filter(container => !duplicates.includes(container)),
30
+ // tests to delete
31
+ duplicates,
32
+ ];
33
+ }
34
+ exports.separateDuplicateResults = separateDuplicateResults;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/core",
3
- "version": "2.4.4",
3
+ "version": "2.4.6",
4
4
  "homepage": "https://applitools.com",
5
5
  "bugs": {
6
6
  "url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -75,19 +75,19 @@
75
75
  ]
76
76
  },
77
77
  "dependencies": {
78
- "@applitools/core-base": "1.1.43",
78
+ "@applitools/core-base": "1.1.45",
79
79
  "@applitools/dom-capture": "11.2.1",
80
80
  "@applitools/dom-snapshot": "4.7.7",
81
- "@applitools/driver": "1.11.37",
82
- "@applitools/ec-client": "1.2.17",
81
+ "@applitools/driver": "1.11.38",
82
+ "@applitools/ec-client": "1.2.19",
83
83
  "@applitools/logger": "1.1.48",
84
- "@applitools/nml-client": "1.3.41",
84
+ "@applitools/nml-client": "1.3.43",
85
85
  "@applitools/req": "1.1.33",
86
- "@applitools/screenshoter": "3.7.31",
87
- "@applitools/snippets": "2.4.17",
86
+ "@applitools/screenshoter": "3.7.33",
87
+ "@applitools/snippets": "2.4.18",
88
88
  "@applitools/socket": "1.0.10",
89
- "@applitools/spec-driver-webdriver": "1.0.17",
90
- "@applitools/ufg-client": "1.2.4",
89
+ "@applitools/spec-driver-webdriver": "1.0.19",
90
+ "@applitools/ufg-client": "1.2.6",
91
91
  "@applitools/utils": "1.3.32",
92
92
  "@types/ws": "8.5.4",
93
93
  "abort-controller": "3.0.0",
@@ -100,11 +100,11 @@
100
100
  "devDependencies": {
101
101
  "@applitools/bongo": "^3.0.3",
102
102
  "@applitools/sdk-coverage-tests": "^3.0.0",
103
- "@applitools/spec-driver-puppeteer": "^1.1.49",
104
- "@applitools/spec-driver-selenium": "^1.5.34",
105
- "@applitools/spec-driver-webdriverio": "^1.4.32",
103
+ "@applitools/spec-driver-puppeteer": "^1.1.51",
104
+ "@applitools/spec-driver-selenium": "^1.5.36",
105
+ "@applitools/spec-driver-webdriverio": "^1.4.34",
106
106
  "@applitools/test-server": "^1.1.28",
107
- "@applitools/test-utils": "^1.5.14",
107
+ "@applitools/test-utils": "^1.5.15",
108
108
  "@types/node": "^12.20.55",
109
109
  "@types/selenium-webdriver": "^4.1.2",
110
110
  "@types/yargs": "^17.0.22",
@@ -3,6 +3,7 @@ import { type Logger } from '@applitools/logger';
3
3
  import { type Fetch } from '@applitools/req';
4
4
  export type DomCaptureSettings = {
5
5
  fetch?: Fetch;
6
+ fetchTimeout?: number;
6
7
  executionTimeout?: number;
7
8
  pollTimeout?: number;
8
9
  chunkByteLength?: number;
@@ -1,4 +1,4 @@
1
- import type { Eyes, GetResultsSettings, TestResult } from './types';
1
+ import type { Eyes, GetEyesResultsSettings, TestResult } from './types';
2
2
  import { type SpecType } from '@applitools/driver';
3
3
  import { type Logger } from '@applitools/logger';
4
4
  type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
@@ -6,7 +6,7 @@ type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
6
6
  logger: Logger;
7
7
  };
8
8
  export declare function makeGetEyesResults<TSpec extends SpecType, TType extends 'classic' | 'ufg'>({ eyes, logger: defaultLogger, }: Options<TSpec, TType>): ({ settings, logger, }?: {
9
- settings?: GetResultsSettings<TType> | undefined;
9
+ settings?: GetEyesResultsSettings<TType> | undefined;
10
10
  logger?: Logger | undefined;
11
11
  }) => Promise<TestResult<TType>[]>;
12
12
  export {};
@@ -1,4 +1,4 @@
1
- import type { Core, Eyes, GetResultsSettings, TestResultSummary } from './types';
1
+ import type { Core, Eyes, GetManagerResultsSettings, TestResultSummary } from './types';
2
2
  import { type SpecType } from '@applitools/driver';
3
3
  import { type Logger } from '@applitools/logger';
4
4
  type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
@@ -7,7 +7,7 @@ type Options<TSpec extends SpecType, TType extends 'classic' | 'ufg'> = {
7
7
  logger: Logger;
8
8
  };
9
9
  export declare function makeGetManagerResults<TSpec extends SpecType, TType extends 'classic' | 'ufg'>({ core, storage, logger: defaultLogger, }: Options<TSpec, TType>): ({ settings, logger, }?: {
10
- settings?: GetResultsSettings<TType> | undefined;
10
+ settings?: GetManagerResultsSettings<TType> | undefined;
11
11
  logger?: Logger | undefined;
12
12
  }) => Promise<TestResultSummary<TType>>;
13
13
  export {};
@@ -1,4 +1,4 @@
1
- import type { Core, EyesManager, EyesManagerSettings } from './types';
1
+ import type { Core, EyesManager, ManagerSettings } from './types';
2
2
  import type { Core as BaseCore } from '@applitools/core-base';
3
3
  import { type Logger } from '@applitools/logger';
4
4
  import { type SpecType, type SpecDriver } from '@applitools/driver';
@@ -13,7 +13,7 @@ type Options<TSpec extends SpecType> = {
13
13
  };
14
14
  export declare function makeMakeManager<TSpec extends SpecType>({ spec, concurrency: defaultConcurrency, core, base, agentId: defaultAgentId, cwd, logger: defaultLogger, }: Options<TSpec>): <TType extends "classic" | "ufg" = "classic">({ type, settings, logger, }?: {
15
15
  type?: TType | undefined;
16
- settings?: EyesManagerSettings | undefined;
16
+ settings?: ManagerSettings | undefined;
17
17
  logger?: Logger | undefined;
18
18
  }) => Promise<EyesManager<TSpec, TType>>;
19
19
  export {};
package/types/types.d.ts CHANGED
@@ -18,7 +18,7 @@ export interface Core<TSpec extends SpecType, TDefaultType extends 'classic' | '
18
18
  }): Promise<ECClient>;
19
19
  makeManager<TType extends 'classic' | 'ufg' = TDefaultType>(options?: {
20
20
  type: TType;
21
- settings?: EyesManagerSettings;
21
+ settings?: ManagerSettings;
22
22
  logger?: Logger;
23
23
  }): Promise<EyesManager<TSpec, TType>>;
24
24
  openEyes<TType extends 'classic' | 'ufg' = TDefaultType>(options: {
@@ -56,7 +56,7 @@ export interface EyesManager<TSpec extends SpecType, TDefaultType extends 'class
56
56
  logger?: Logger;
57
57
  }): Promise<Eyes<TSpec, TType>>;
58
58
  getResults: (options?: {
59
- settings?: GetResultsSettings<TDefaultType>;
59
+ settings?: GetManagerResultsSettings<TDefaultType>;
60
60
  logger?: Logger;
61
61
  }) => Promise<TestResultSummary<'classic' | 'ufg'>>;
62
62
  }
@@ -92,12 +92,12 @@ export interface Eyes<TSpec extends SpecType, TDefaultType extends 'classic' | '
92
92
  logger?: Logger;
93
93
  }): Promise<void>;
94
94
  getResults(options?: {
95
- settings?: Partial<GetResultsSettings<TDefaultType>>;
95
+ settings?: Partial<GetEyesResultsSettings<TDefaultType>>;
96
96
  config?: Config<TSpec, TDefaultType>;
97
97
  logger?: Logger;
98
98
  }): Promise<TestResult<TDefaultType>[]>;
99
99
  }
100
- export interface EyesManagerSettings {
100
+ export interface ManagerSettings {
101
101
  concurrency?: number;
102
102
  /** @deprecated */
103
103
  legacyConcurrency?: number;
@@ -117,6 +117,10 @@ export type AbortSettings<TType extends 'classic' | 'ufg'> = TType extends 'ufg'
117
117
  export type GetResultsSettings<TType extends 'classic' | 'ufg'> = (TType extends 'ufg' ? UFGCore.GetResultsSettings : ClassicCore.GetResultsSettings) & {
118
118
  throwErr?: boolean;
119
119
  };
120
+ export type GetEyesResultsSettings<TType extends 'classic' | 'ufg'> = GetResultsSettings<TType>;
121
+ export type GetManagerResultsSettings<TType extends 'classic' | 'ufg'> = GetEyesResultsSettings<TType> & {
122
+ removeDuplicateTests?: boolean;
123
+ };
120
124
  export type CheckResult<TType extends 'classic' | 'ufg'> = TType extends 'ufg' ? UFGCore.CheckResult : ClassicCore.CheckResult;
121
125
  export type TestResult<TType extends 'classic' | 'ufg'> = TType extends 'ufg' ? UFGCore.TestResult : ClassicCore.TestResult;
122
126
  export interface TestResultContainer<TType extends 'classic' | 'ufg'> {
@@ -0,0 +1,2 @@
1
+ import { TestResultContainer } from '../types';
2
+ export declare function separateDuplicateResults(containers: TestResultContainer<'classic' | 'ufg'>[]): TestResultContainer<"classic" | "ufg">[][];