@applitools/core 3.9.1 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/dist/abort.js +40 -0
  3. package/dist/{ufg → automation}/abort.js +19 -3
  4. package/dist/{ufg → automation}/close.js +19 -3
  5. package/dist/automation/get-nml-client.js +3 -3
  6. package/dist/{ufg → automation}/get-results.js +4 -4
  7. package/dist/automation/utils/extract-renderer-key.js +35 -0
  8. package/dist/check-and-close.js +1 -10
  9. package/dist/check.js +8 -17
  10. package/dist/classic/check-and-close.js +125 -68
  11. package/dist/classic/check.js +108 -63
  12. package/dist/classic/core.js +4 -4
  13. package/dist/classic/get-base-eyes.js +30 -7
  14. package/dist/classic/open-eyes.js +42 -56
  15. package/dist/classic/utils/extract-default-renderers.js +72 -0
  16. package/dist/classic/utils/take-screenshots.js +60 -0
  17. package/dist/close.js +6 -3
  18. package/dist/core.js +4 -4
  19. package/dist/get-typed-eyes.js +3 -5
  20. package/dist/make-manager.js +2 -2
  21. package/dist/open-eyes.js +13 -10
  22. package/dist/ufg/check-and-close.js +61 -53
  23. package/dist/ufg/check.js +62 -59
  24. package/dist/ufg/core.js +2 -2
  25. package/dist/ufg/get-base-eyes.js +22 -13
  26. package/dist/ufg/open-eyes.js +24 -37
  27. package/dist/ufg/utils/extract-default-renderers.js +22 -0
  28. package/dist/universal/core.js +1 -0
  29. package/package.json +15 -15
  30. package/types/abort.d.ts +13 -0
  31. package/types/{classic → automation}/abort.d.ts +5 -4
  32. package/types/{classic → automation}/close.d.ts +3 -4
  33. package/types/automation/get-nml-client.d.ts +3 -3
  34. package/types/automation/get-results.d.ts +11 -0
  35. package/types/automation/types.d.ts +78 -8
  36. package/types/automation/utils/extract-renderer-key.d.ts +2 -0
  37. package/types/{ufg → automation}/utils/uniquify-renderers.d.ts +1 -1
  38. package/types/check.d.ts +2 -2
  39. package/types/classic/check-and-close.d.ts +11 -4
  40. package/types/classic/check.d.ts +6 -3
  41. package/types/classic/core.d.ts +2 -1
  42. package/types/classic/get-base-eyes.d.ts +4 -8
  43. package/types/classic/open-eyes.d.ts +3 -4
  44. package/types/classic/types.d.ts +3 -4
  45. package/types/classic/utils/extract-default-renderers.d.ts +9 -0
  46. package/types/classic/utils/take-screenshots.d.ts +18 -0
  47. package/types/close.d.ts +3 -2
  48. package/types/core.d.ts +7 -1
  49. package/types/get-typed-eyes.d.ts +5 -4
  50. package/types/make-manager.d.ts +7 -1
  51. package/types/open-eyes.d.ts +7 -1
  52. package/types/types.d.ts +5 -8
  53. package/types/ufg/check-and-close.d.ts +8 -12
  54. package/types/ufg/check.d.ts +4 -9
  55. package/types/ufg/core.d.ts +3 -3
  56. package/types/ufg/get-base-eyes.d.ts +3 -7
  57. package/types/ufg/open-eyes.d.ts +3 -4
  58. package/types/ufg/types.d.ts +3 -24
  59. package/types/ufg/utils/extract-default-renderers.d.ts +5 -0
  60. package/types/ufg/utils/take-dom-snapshots.d.ts +3 -3
  61. package/dist/classic/abort.js +0 -23
  62. package/dist/classic/close.js +0 -23
  63. package/types/ufg/abort.d.ts +0 -21
  64. package/types/ufg/close.d.ts +0 -19
  65. package/types/ufg/get-results.d.ts +0 -16
  66. /package/dist/{ufg → automation}/utils/uniquify-renderers.js +0 -0
@@ -25,81 +25,78 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.makeCheck = void 0;
27
27
  const driver_1 = require("@applitools/driver");
28
- const take_screenshot_1 = require("../automation/utils/take-screenshot");
29
- const take_dom_capture_1 = require("./utils/take-dom-capture");
28
+ const take_screenshots_1 = require("./utils/take-screenshots");
30
29
  const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
31
30
  const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
31
+ const uniquify_renderers_1 = require("../automation/utils/uniquify-renderers");
32
+ const extract_renderer_key_1 = require("../automation/utils/extract-renderer-key");
33
+ const abort_error_1 = require("../errors/abort-error");
32
34
  const utils = __importStar(require("@applitools/utils"));
33
- function makeCheck({ eyes, target: defaultTarget, spec, logger: mainLogger, }) {
35
+ function makeCheck({ eyes, target: defaultTarget, renderers: defaultRenderers = [], spec, signal, logger: mainLogger, }) {
34
36
  return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
35
- var _a, _b, _c, _d;
37
+ var _a, _b;
36
38
  logger = logger.extend(mainLogger);
37
39
  logger.log('Command "check" is called with settings', settings);
38
40
  if (!target)
39
41
  throw new Error('Method was called with no target');
40
- const baseEyes = await eyes.getBaseEyes();
41
- if (!(0, driver_1.isDriver)(target, spec)) {
42
- return (await Promise.all(baseEyes.map(baseEyes => baseEyes.check({ target, settings: settings, logger })))).flat();
42
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
43
+ logger.warn('Command "check" was called after test was already aborted');
44
+ throw new abort_error_1.AbortError('Command "check" was called after test was already aborted');
43
45
  }
44
- const driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
45
- const environment = await driver.getEnvironment();
46
- await driver.currentContext.setScrollingElement((_a = settings.scrollRootElement) !== null && _a !== void 0 ? _a : null);
47
- if (settings.lazyLoad && environment.isWeb) {
48
- if (settings.lazyLoad) {
46
+ const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : defaultRenderers);
47
+ const baseTargets = [];
48
+ const baseSettings = [];
49
+ const transformedRenderers = [];
50
+ if ((0, driver_1.isDriver)(target, spec)) {
51
+ const driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
52
+ await driver.currentContext.setScrollingElement((_b = settings.scrollRootElement) !== null && _b !== void 0 ? _b : null);
53
+ const environment = await driver.getEnvironment();
54
+ uniqueRenderers.forEach(renderer => {
55
+ var _a, _b;
56
+ var _c, _d;
57
+ if (utils.types.has(renderer, 'iosDeviceInfo')) {
58
+ (_a = (_c = renderer.iosDeviceInfo).version) !== null && _a !== void 0 ? _a : (_c.version = environment.platformVersion);
59
+ }
60
+ else if (utils.types.has(renderer, 'androidDeviceInfo')) {
61
+ (_b = (_d = renderer.androidDeviceInfo).version) !== null && _b !== void 0 ? _b : (_d.version = environment.platformVersion);
62
+ }
63
+ return renderer;
64
+ });
65
+ if (settings.lazyLoad && environment.isWeb) {
49
66
  await (0, wait_for_lazy_load_1.waitForLazyLoad)({
50
67
  context: driver.currentContext,
51
68
  settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
52
69
  logger,
53
70
  });
54
71
  }
55
- }
56
- // TODO it actually could be different per eyes
57
- const shouldRunOnce = true;
58
- const finishAt = Date.now() + ((_b = settings.retryTimeout) !== null && _b !== void 0 ? _b : 0);
59
- let baseTarget;
60
- let baseSettings;
61
- let results;
62
- const { elementReferencesToCalculate, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
63
- do {
64
- if (environment.isWeb ||
65
- !environment.isApplitoolsLib ||
66
- settings.webview ||
67
- settings.screenshotMode === 'default') {
68
- const screenshot = await (0, take_screenshot_1.takeScreenshot)({
72
+ const { elementReferencesToCalculate, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
73
+ if (environment.isWeb || !environment.isApplitoolsLib || settings.screenshotMode === 'default') {
74
+ const screenshots = await (0, take_screenshots_1.takeScreenshots)({
69
75
  driver,
70
- settings: { ...settings, regionsToCalculate: elementReferencesToCalculate },
76
+ settings: {
77
+ ...settings,
78
+ renderers: uniqueRenderers,
79
+ regionsToCalculate: elementReferencesToCalculate,
80
+ calculateView: !!settings.pageId,
81
+ domSettings: settings.sendDom ? { proxy: eyes.test.eyesServer.proxy } : undefined,
82
+ },
71
83
  logger,
72
84
  });
73
- baseTarget = {
74
- name: await driver.getTitle(),
75
- source: await driver.getUrl(),
76
- image: await screenshot.image.toPng(),
77
- locationInViewport: utils.geometry.location(screenshot.region),
78
- isTransformed: true,
79
- };
80
- baseSettings = getBaseCheckSettings({ calculatedRegions: screenshot.calculatedRegions });
81
- if (environment.isWeb && settings.sendDom) {
82
- if (settings.fully)
83
- await ((_c = screenshot.scrollingElement) === null || _c === void 0 ? void 0 : _c.setAttribute('data-applitools-scroll', 'true'));
84
- else
85
- await ((_d = screenshot.element) === null || _d === void 0 ? void 0 : _d.setAttribute('data-applitools-scroll', 'true'));
86
- baseTarget.dom = await (0, take_dom_capture_1.takeDomCapture)({ driver, settings: { proxy: eyes.test.eyesServer.proxy }, logger }).catch(() => undefined);
87
- }
88
- if (settings.pageId) {
89
- const scrollingElement = await driver.mainContext.getScrollingElement();
90
- const scrollingOffset = !scrollingElement || environment.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
91
- baseTarget.locationInView = utils.geometry.offset(scrollingOffset, screenshot.region);
92
- baseTarget.fullViewSize = scrollingElement
93
- ? await scrollingElement.getContentSize()
94
- : await driver.getViewportSize();
95
- }
96
- await screenshot.restoreState();
85
+ transformedRenderers.push(...uniqueRenderers);
86
+ screenshots.forEach(({ calculatedRegions, ...baseTarget }) => {
87
+ baseTargets.push(baseTarget);
88
+ baseSettings.push(getBaseCheckSettings({ calculatedRegions }));
89
+ });
97
90
  }
98
91
  else {
99
- const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.eyesServer, driver, logger });
100
- const screenshot = await nmlClient.takeScreenshot({
92
+ const nmlClient = await eyes.core.getNMLClient({
93
+ driver,
94
+ settings: { ...eyes.test.eyesServer, renderEnvironmentsUrl: eyes.test.renderEnvironmentsUrl },
95
+ logger,
96
+ });
97
+ const screenshots = await nmlClient.takeScreenshots({
101
98
  settings: {
102
- name: settings.name,
99
+ renderers: uniqueRenderers,
103
100
  fully: settings.fully,
104
101
  stitchMode: settings.stitchMode,
105
102
  hideScrollbars: settings.hideScrollbars,
@@ -108,20 +105,68 @@ function makeCheck({ eyes, target: defaultTarget, spec, logger: mainLogger, }) {
108
105
  waitBeforeCapture: settings.waitBeforeCapture,
109
106
  waitBetweenStitches: settings.waitBetweenStitches,
110
107
  lazyLoad: settings.lazyLoad,
108
+ name: settings.name,
111
109
  },
112
110
  logger,
113
111
  });
114
- baseTarget = { image: screenshot.image, isTransformed: true };
115
- baseSettings = getBaseCheckSettings({ calculatedRegions: [] });
112
+ screenshots.forEach(({ calculatedRegions: _calculatedRegions, renderEnvironment, ...baseTarget }) => {
113
+ transformedRenderers.push({ environment: renderEnvironment });
114
+ baseTargets.push({ ...baseTarget, isTransformed: true });
115
+ baseSettings.push(getBaseCheckSettings({ calculatedRegions: [] }));
116
+ });
116
117
  }
117
- baseSettings.ignoreMismatch = !shouldRunOnce;
118
- results = (await Promise.all(baseEyes.map(baseEyes => baseEyes.check({ target: baseTarget, settings: baseSettings, logger })))).flat();
119
- } while (!shouldRunOnce && !results.some(result => result.asExpected) && Date.now() < finishAt);
120
- if (!shouldRunOnce && !results.some(result => result.asExpected)) {
121
- baseSettings.ignoreMismatch = false;
122
- results = (await Promise.all(baseEyes.map(baseEyes => baseEyes.check({ target: baseTarget, settings: baseSettings, logger })))).flat();
123
118
  }
124
- return results;
119
+ else {
120
+ transformedRenderers.push(...uniqueRenderers);
121
+ baseTargets.push(target);
122
+ baseSettings.push(settings);
123
+ }
124
+ const promises = transformedRenderers.map(async (renderer, index) => {
125
+ const rendererLogger = logger.extend({ tags: [`renderer-${utils.general.shortid()}`] });
126
+ try {
127
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
128
+ rendererLogger.warn('Command "check" was aborted before checking');
129
+ throw new abort_error_1.AbortError('Command "check" was aborted before checking');
130
+ }
131
+ const baseEyes = await eyes.getBaseEyes({ settings: { renderer }, logger: rendererLogger });
132
+ try {
133
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
134
+ rendererLogger.warn('Command "check" was aborted before checking');
135
+ throw new abort_error_1.AbortError('Command "check" was aborted before checking');
136
+ }
137
+ else if (!baseEyes.running) {
138
+ rendererLogger.warn(`Check on environment with id "${baseEyes.test.renderEnvironmentId}" was aborted during one of the previous steps`);
139
+ throw new abort_error_1.AbortError(`Check on environment with id "${baseEyes.test.renderEnvironmentId}" was aborted during one of the previous steps`);
140
+ }
141
+ await baseEyes.check({
142
+ target: baseTargets[index],
143
+ settings: baseSettings[index],
144
+ logger: rendererLogger,
145
+ });
146
+ }
147
+ catch (error) {
148
+ rendererLogger.error(`Check on environment with id "${baseEyes.test.renderEnvironmentId}" failed due to an error`, error);
149
+ if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
150
+ await baseEyes.abort({ logger: rendererLogger });
151
+ error.info = { eyes: baseEyes };
152
+ throw error;
153
+ }
154
+ }
155
+ catch (error) {
156
+ rendererLogger.error(`Check with id ${renderer.id} failed before checking started due to an error`, error);
157
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer };
158
+ throw error;
159
+ }
160
+ });
161
+ transformedRenderers.forEach((renderer, index) => {
162
+ const key = (0, extract_renderer_key_1.extractRendererKey)(renderer);
163
+ let item = eyes.storage.get(key);
164
+ if (!item) {
165
+ item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
166
+ eyes.storage.set(key, item);
167
+ }
168
+ item.jobs.push(promises[index]);
169
+ });
125
170
  };
126
171
  }
127
172
  exports.makeCheck = makeCheck;
@@ -34,21 +34,21 @@ const extract_text_1 = require("../automation/extract-text");
34
34
  const get_nml_client_1 = require("../automation/get-nml-client");
35
35
  const open_eyes_1 = require("./open-eyes");
36
36
  const utils = __importStar(require("@applitools/utils"));
37
- function makeCore({ spec, clients, base, agentId = 'core-classic', cwd = process.cwd(), logger: defaultLogger, }) {
37
+ function makeCore({ spec, clients, base, concurrency, agentId = 'core-classic', cwd = process.cwd(), logger: defaultLogger, }) {
38
38
  const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'core-classic' } });
39
39
  logger.log(`Core classic is initialized ${base ? 'with' : 'without'} custom base core`);
40
- base !== null && base !== void 0 ? base : (base = (0, core_base_1.makeCore)({ agentId, cwd, logger }));
40
+ base !== null && base !== void 0 ? base : (base = (0, core_base_1.makeCore)({ concurrency, agentId, cwd, logger }));
41
41
  return utils.general.extend(base, core => {
42
42
  return {
43
43
  type: 'classic',
44
44
  base: base,
45
45
  getViewportSize: spec && (0, get_viewport_size_1.makeGetViewportSize)({ spec, logger }),
46
46
  setViewportSize: spec && (0, set_viewport_size_1.makeSetViewportSize)({ spec, logger }),
47
- getNMLClient: (0, get_nml_client_1.makeGetNMLClient)({ client: clients === null || clients === void 0 ? void 0 : clients.nml, logger }),
48
- openEyes: (0, open_eyes_1.makeOpenEyes)({ spec, core, logger }),
49
47
  locate: (0, locate_1.makeLocate)({ spec, core, logger }),
50
48
  locateText: (0, locate_text_1.makeLocateText)({ spec, core, logger }),
51
49
  extractText: (0, extract_text_1.makeExtractText)({ spec, core, logger }),
50
+ getNMLClient: (0, get_nml_client_1.makeGetNMLClient)({ client: clients === null || clients === void 0 ? void 0 : clients.nml, logger }),
51
+ openEyes: (0, open_eyes_1.makeOpenEyes)({ spec, core, logger }),
52
52
  };
53
53
  });
54
54
  }
@@ -24,17 +24,40 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.makeGetBaseEyes = void 0;
27
+ const extract_renderer_key_1 = require("../automation/utils/extract-renderer-key");
27
28
  const utils = __importStar(require("@applitools/utils"));
28
- function makeGetBaseEyes({ settings, eyes, base, logger: mainLogger }) {
29
- const getBaseEyesWithCache = utils.general.cachify(getBaseEyes, () => 'default');
30
- if (base)
31
- getBaseEyesWithCache.setCachedValue('default', Promise.resolve(base));
29
+ function makeGetBaseEyes({ settings: defaultSettings, eyes, logger: mainLogger, }) {
30
+ const getBaseEyesWithCache = utils.general.wrap(getBaseEyes, (getBaseEyes, options) => {
31
+ const key = (0, extract_renderer_key_1.extractRendererKey)(options.settings.renderer);
32
+ let item = eyes.storage.get(key);
33
+ if (!item) {
34
+ item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
35
+ eyes.storage.set(key, item);
36
+ }
37
+ if (!item.eyes.settled)
38
+ item.eyes.resolve(getBaseEyes(options));
39
+ return item.eyes;
40
+ });
32
41
  return getBaseEyesWithCache;
33
- async function getBaseEyes({ logger = mainLogger } = {}) {
42
+ async function getBaseEyes({ settings, logger = mainLogger, }) {
34
43
  logger = logger.extend(mainLogger);
35
44
  logger.log(`Command "getBaseEyes" is called with settings`, settings);
36
- const baseEyes = await eyes.core.base.openEyes({ settings, logger });
37
- return [baseEyes];
45
+ let environment;
46
+ if (utils.types.has(settings.renderer, 'environment')) {
47
+ environment = settings.renderer.environment;
48
+ }
49
+ else {
50
+ // NOTE: ios and android handled by nml-client
51
+ // TODO: chrome emulation, desktop
52
+ environment = { renderer: settings.renderer };
53
+ }
54
+ return eyes.core.base.openEyes({
55
+ settings: {
56
+ ...defaultSettings,
57
+ environment: { ...defaultSettings.environment, ...environment, properties: settings.renderer.properties },
58
+ },
59
+ logger,
60
+ });
38
61
  }
39
62
  }
40
63
  exports.makeGetBaseEyes = makeGetBaseEyes;
@@ -28,71 +28,57 @@ const driver_1 = require("@applitools/driver");
28
28
  const get_base_eyes_1 = require("./get-base-eyes");
29
29
  const check_1 = require("./check");
30
30
  const check_and_close_1 = require("./check-and-close");
31
- const close_1 = require("./close");
32
- const abort_1 = require("./abort");
31
+ const close_1 = require("../automation/close");
32
+ const abort_1 = require("../automation/abort");
33
+ const get_results_1 = require("../automation/get-results");
34
+ const extract_default_renderers_1 = require("./utils/extract-default-renderers");
35
+ const abort_controller_1 = require("abort-controller");
33
36
  const utils = __importStar(require("@applitools/utils"));
34
37
  function makeOpenEyes({ core, spec, logger: mainLogger }) {
35
- return async function openEyes({ target, settings, base, logger = mainLogger, }) {
38
+ return async function openEyes({ target, settings, storage = new Map(), logger = mainLogger, }) {
36
39
  var _a, _b, _c;
37
- var _d;
38
40
  logger = logger.extend(mainLogger);
39
- logger.log(`Command "openEyes" is called with ${target ? 'default driver and' : ''}`, ...(settings ? ['settings', settings] : []), base ? 'predefined eyes' : '');
41
+ logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), storage.size > 0 ? 'and default eyes storage' : '');
40
42
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
41
- if (driver && !base) {
43
+ if (driver && storage.size === 0) {
42
44
  const environment = await driver.getEnvironment();
43
- const currentContext = driver.currentContext;
44
- (_a = settings.environment) !== null && _a !== void 0 ? _a : (settings.environment = {});
45
- if (environment.isEC) {
46
- settings.environment.ecSessionId = (await driver.getSessionId());
47
- }
48
- if (environment.isWeb) {
49
- (_b = (_d = settings.environment).userAgent) !== null && _b !== void 0 ? _b : (_d.userAgent = await driver.getUserAgentLegacy());
50
- }
51
- if (!settings.environment.deviceName && environment.deviceName) {
52
- settings.environment.deviceName = environment.deviceName;
53
- }
54
- if (!settings.environment.os) {
55
- if (environment.isNative && environment.platformName) {
56
- settings.environment.os = environment.platformName;
57
- if (!settings.keepPlatformNameAsIs) {
58
- if (/^android/i.test(settings.environment.os)) {
59
- settings.environment.os = `Android${settings.environment.os.slice(7)}`;
60
- }
61
- if (/^ios/i.test(settings.environment.os)) {
62
- settings.environment.os = `iOS${settings.environment.os.slice(3)}`;
63
- }
64
- }
65
- if (environment.platformVersion) {
66
- settings.environment.os += ` ${environment.platformVersion}`;
67
- }
68
- }
69
- else if (environment.isReliable &&
70
- environment.isChromium &&
71
- ((environment.isWindows && Number.parseInt(environment.browserVersion) >= 107) ||
72
- (environment.isMac && Number.parseInt(environment.browserVersion) >= 90))) {
73
- settings.environment.os = `${environment.platformName} ${(_c = environment.platformVersion) !== null && _c !== void 0 ? _c : ''}`.trim();
74
- }
75
- }
76
- if (!settings.environment.viewportSize || environment.isMobile) {
77
- const viewport = await driver.getViewport();
78
- const size = await driver.getViewportSize();
79
- settings.environment.viewportSize = utils.geometry.scale(size, viewport.viewportScale);
80
- }
81
- else {
45
+ if (((_a = settings.environment) === null || _a === void 0 ? void 0 : _a.viewportSize) && !environment.isMobile) {
82
46
  await driver.setViewportSize(settings.environment.viewportSize);
83
47
  }
84
- await currentContext.focus();
48
+ (_b = settings.environment) !== null && _b !== void 0 ? _b : (settings.environment = {});
49
+ if (environment.isEC) {
50
+ settings.environment.ecSessionId = (_c = (await driver.getSessionId())) !== null && _c !== void 0 ? _c : undefined;
51
+ }
85
52
  }
86
- base !== null && base !== void 0 ? base : (base = [await core.base.openEyes({ settings, logger })]);
87
- return utils.general.extend(base[0], eyes => ({
88
- type: 'classic',
89
- core,
90
- getBaseEyes: (0, get_base_eyes_1.makeGetBaseEyes)({ settings, eyes, base, logger }),
91
- check: (0, check_1.makeCheck)({ eyes, target: driver, spec, logger }),
92
- checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, target: driver, spec, logger }),
93
- close: (0, close_1.makeClose)({ eyes, target: driver, spec, logger }),
94
- abort: (0, abort_1.makeAbort)({ eyes, target: driver, spec, logger }),
95
- }));
53
+ const renderers = await (0, extract_default_renderers_1.extractDefaultRenderers)({ driver, settings });
54
+ const controller = new abort_controller_1.AbortController();
55
+ const account = await core.getAccountInfo({ settings, logger });
56
+ return utils.general.extend({}, eyes => {
57
+ var _a;
58
+ return {
59
+ type: 'classic',
60
+ core,
61
+ test: {
62
+ userTestId: settings.userTestId,
63
+ batchId: (_a = settings.batch) === null || _a === void 0 ? void 0 : _a.id,
64
+ keepBatchOpen: settings.keepBatchOpen,
65
+ eyesServer: account.eyesServer,
66
+ ufgServer: account.ufgServer,
67
+ uploadUrl: account.uploadUrl,
68
+ stitchingServiceUrl: account.stitchingServiceUrl,
69
+ renderEnvironmentsUrl: account.renderEnvironmentsUrl,
70
+ account,
71
+ },
72
+ running: true,
73
+ storage,
74
+ getBaseEyes: (0, get_base_eyes_1.makeGetBaseEyes)({ settings, eyes, logger }),
75
+ check: (0, check_1.makeCheck)({ eyes, target: driver, renderers, spec, signal: controller.signal, logger }),
76
+ checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, target: driver, renderers, spec, signal: controller.signal, logger }),
77
+ close: (0, close_1.makeClose)({ eyes, target: driver, renderers, logger }),
78
+ abort: (0, abort_1.makeAbort)({ eyes, target: driver, renderers, spec, controller, logger }),
79
+ getResults: (0, get_results_1.makeGetResults)({ eyes, logger }),
80
+ };
81
+ });
96
82
  };
97
83
  }
98
84
  exports.makeOpenEyes = makeOpenEyes;
@@ -0,0 +1,72 @@
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.extractDefaultRenderers = void 0;
27
+ const utils = __importStar(require("@applitools/utils"));
28
+ async function extractDefaultRenderers({ driver, settings, }) {
29
+ var _a, _b, _c;
30
+ const renderer = { environment: {} };
31
+ if (!driver) {
32
+ renderer.environment = (_a = settings === null || settings === void 0 ? void 0 : settings.environment) !== null && _a !== void 0 ? _a : {};
33
+ return [renderer];
34
+ }
35
+ const currentContext = driver.currentContext;
36
+ try {
37
+ const environment = await driver.getEnvironment();
38
+ const viewport = await driver.getViewport();
39
+ const size = await driver.getViewportSize();
40
+ renderer.environment.viewportSize = utils.geometry.scale(size, viewport.viewportScale);
41
+ if (environment.isEC)
42
+ renderer.environment.ecSessionId = (_b = (await driver.getSessionId())) !== null && _b !== void 0 ? _b : undefined;
43
+ if (environment.isWeb)
44
+ renderer.environment.userAgent = await driver.getUserAgentLegacy();
45
+ if (environment.deviceName)
46
+ renderer.environment.deviceName = environment.deviceName;
47
+ if (environment.isNative && environment.platformName) {
48
+ renderer.environment.os = environment.platformName;
49
+ if (environment.platformVersion)
50
+ renderer.environment.os += ` ${environment.platformVersion}`;
51
+ if (!(settings === null || settings === void 0 ? void 0 : settings.keepPlatformNameAsIs)) {
52
+ if (/^android/i.test(renderer.environment.os)) {
53
+ renderer.environment.os = `Android${renderer.environment.os.slice(7)}`;
54
+ }
55
+ if (/^ios/i.test(renderer.environment.os)) {
56
+ renderer.environment.os = `iOS${renderer.environment.os.slice(3)}`;
57
+ }
58
+ }
59
+ }
60
+ else if (environment.isReliable &&
61
+ environment.isChromium &&
62
+ ((environment.isWindows && Number.parseInt(environment.browserVersion) >= 107) ||
63
+ (environment.isMac && Number.parseInt(environment.browserVersion) >= 90))) {
64
+ renderer.environment.os = `${environment.platformName} ${(_c = environment.platformVersion) !== null && _c !== void 0 ? _c : ''}`.trim();
65
+ }
66
+ return [renderer];
67
+ }
68
+ finally {
69
+ await currentContext.focus();
70
+ }
71
+ }
72
+ exports.extractDefaultRenderers = extractDefaultRenderers;
@@ -0,0 +1,60 @@
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.takeScreenshots = void 0;
27
+ const take_dom_capture_1 = require("./take-dom-capture");
28
+ const take_screenshot_1 = require("../../automation/utils/take-screenshot");
29
+ const utils = __importStar(require("@applitools/utils"));
30
+ async function takeScreenshots({ driver, settings, logger, }) {
31
+ var _a, _b;
32
+ const screenshot = await (0, take_screenshot_1.takeScreenshot)({ driver, settings, logger });
33
+ const baseTarget = {
34
+ name: await driver.getTitle(),
35
+ source: await driver.getUrl(),
36
+ image: await screenshot.image.toPng(),
37
+ locationInViewport: utils.geometry.location(screenshot.region),
38
+ calculatedRegions: screenshot.calculatedRegions,
39
+ isTransformed: true,
40
+ };
41
+ const environment = await driver.getEnvironment();
42
+ if (environment.isWeb && settings.domSettings) {
43
+ if (settings.fully)
44
+ await ((_a = screenshot.scrollingElement) === null || _a === void 0 ? void 0 : _a.setAttribute('data-applitools-scroll', 'true'));
45
+ else
46
+ await ((_b = screenshot.element) === null || _b === void 0 ? void 0 : _b.setAttribute('data-applitools-scroll', 'true'));
47
+ baseTarget.dom = await (0, take_dom_capture_1.takeDomCapture)({ driver, settings: settings.domSettings, logger }).catch(() => undefined);
48
+ }
49
+ if (settings.calculateView) {
50
+ const scrollingElement = await driver.mainContext.getScrollingElement();
51
+ const scrollingOffset = !scrollingElement || environment.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
52
+ baseTarget.locationInView = utils.geometry.offset(scrollingOffset, screenshot.region);
53
+ baseTarget.fullViewSize = scrollingElement
54
+ ? await scrollingElement.getContentSize()
55
+ : await driver.getViewportSize();
56
+ }
57
+ await screenshot.restoreState();
58
+ return new Array(settings.renderers.length).fill(baseTarget);
59
+ }
60
+ exports.takeScreenshots = takeScreenshots;
package/dist/close.js CHANGED
@@ -25,13 +25,16 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.makeClose = void 0;
27
27
  const utils = __importStar(require("@applitools/utils"));
28
- function makeClose({ eyes, logger: mainLogger, }) {
28
+ function makeClose({ eyes, renderers: defaultRenderers, logger: mainLogger, }) {
29
29
  return async function close({ settings, config, logger = mainLogger, } = {}) {
30
- var _a;
30
+ var _a, _b;
31
31
  logger = logger.extend(mainLogger, { tags: [`close-${utils.general.shortid()}`] });
32
+ const typedEyes = await eyes.getTypedEyes({ logger });
32
33
  settings = { ...config === null || config === void 0 ? void 0 : config.close, ...settings };
33
34
  (_a = settings.updateBaselineIfNew) !== null && _a !== void 0 ? _a : (settings.updateBaselineIfNew = true);
34
- const typedEyes = await eyes.getTypedEyes({ logger });
35
+ if (typedEyes.type === 'classic' && !utils.types.isEmpty(defaultRenderers)) {
36
+ (_b = settings.renderers) !== null && _b !== void 0 ? _b : (settings.renderers = defaultRenderers);
37
+ }
35
38
  await typedEyes.close({ settings, logger });
36
39
  };
37
40
  }
package/dist/core.js CHANGED
@@ -40,7 +40,7 @@ const close_batch_1 = require("./close-batch");
40
40
  const delete_test_1 = require("./delete-test");
41
41
  const extract_environment_1 = require("./utils/extract-environment");
42
42
  const utils = __importStar(require("@applitools/utils"));
43
- function makeCore({ spec, concurrency, base: defaultBase, environment: defaultEnvironment, agentId = 'core', cwd = process.cwd(), logger: defaultLogger, } = {}) {
43
+ function makeCore({ spec, clients, concurrency, base: defaultBase, environment: defaultEnvironment, agentId = 'core', cwd = process.cwd(), logger: defaultLogger, } = {}) {
44
44
  const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'core' } });
45
45
  const environment = (0, extract_environment_1.extractEnvironment)(defaultEnvironment);
46
46
  logger.log(`Core is initialized ${defaultBase ? 'with' : 'without'} custom base core and environment`, environment);
@@ -50,14 +50,14 @@ function makeCore({ spec, concurrency, base: defaultBase, environment: defaultEn
50
50
  base: base,
51
51
  getViewportSize: spec && (0, get_viewport_size_1.makeGetViewportSize)({ spec, logger }),
52
52
  setViewportSize: spec && (0, set_viewport_size_1.makeSetViewportSize)({ spec, logger }),
53
- getNMLClient: (0, get_nml_client_1.makeGetNMLClient)({ logger }),
53
+ getNMLClient: (0, get_nml_client_1.makeGetNMLClient)({ client: clients === null || clients === void 0 ? void 0 : clients.nml, logger }),
54
54
  getECClient: (0, get_ec_client_1.makeGetECClient)({ logger }),
55
55
  getAccountInfo: (0, get_account_info_1.makeGetAccountInfo)({ core, logger }),
56
- makeManager: (0, make_manager_1.makeMakeManager)({ spec, concurrency, core, base: defaultBase, agentId, environment, logger }),
56
+ makeManager: (0, make_manager_1.makeMakeManager)({ spec, clients, concurrency, core, base: defaultBase, agentId, environment, logger }),
57
57
  locate: (0, locate_1.makeLocate)({ spec, core, logger }),
58
58
  locateText: (0, locate_text_1.makeLocateText)({ spec, core, logger }),
59
59
  extractText: (0, extract_text_1.makeExtractText)({ spec, core, logger }),
60
- openEyes: (0, open_eyes_1.makeOpenEyes)({ spec, core, concurrency, environment, logger }),
60
+ openEyes: (0, open_eyes_1.makeOpenEyes)({ spec, clients, core, concurrency, environment, logger }),
61
61
  closeBatch: (0, close_batch_1.makeCloseBatch)({ core, logger }),
62
62
  deleteTest: (0, delete_test_1.makeDeleteTest)({ core, logger }),
63
63
  };
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeGetTypedEyes = void 0;
4
4
  function makeGetTypedEyes({ type: defaultType, settings: defaultSettings, target, cores, logger: mainLogger, }) {
5
5
  let eyes;
6
- return async function getTypedEyes({ type = defaultType, settings, logger = mainLogger, } = {}) {
6
+ return async function getTypedEyes({ type = defaultType, logger = mainLogger, } = {}) {
7
7
  logger = logger.extend(mainLogger);
8
8
  if (!eyes) {
9
9
  eyes = await cores[type].openEyes({ target, settings: defaultSettings, logger });
@@ -13,13 +13,11 @@ function makeGetTypedEyes({ type: defaultType, settings: defaultSettings, target
13
13
  return eyes;
14
14
  }
15
15
  else if (type === 'ufg') {
16
- const base = await eyes.getBaseEyes({ logger });
17
- const typedEyes = await cores.ufg.openEyes({ target, settings: defaultSettings, base, logger });
16
+ const typedEyes = await cores.ufg.openEyes({ target, settings: defaultSettings, storage: eyes.storage, logger });
18
17
  return typedEyes;
19
18
  }
20
19
  else {
21
- const base = (await Promise.all(settings.map(settings => eyes.getBaseEyes({ settings, logger })))).flat();
22
- const typedEyes = await cores.classic.openEyes({ target, settings: defaultSettings, base, logger });
20
+ const typedEyes = await cores.classic.openEyes({ target, settings: defaultSettings, storage: eyes.storage, logger });
23
21
  return typedEyes;
24
22
  }
25
23
  };
@@ -30,7 +30,7 @@ const core_2 = require("./ufg/core");
30
30
  const open_eyes_1 = require("./open-eyes");
31
31
  const get_manager_results_1 = require("./get-manager-results");
32
32
  const utils = __importStar(require("@applitools/utils"));
33
- function makeMakeManager({ spec, concurrency: defaultConcurrency = utils.general.getEnvValue('CONCURRENCY', 'number'), core, base, agentId: defaultAgentId, environment, cwd = process.cwd(), logger: mainLogger, }) {
33
+ function makeMakeManager({ spec, clients, concurrency: defaultConcurrency = utils.general.getEnvValue('CONCURRENCY', 'number'), core, base, agentId: defaultAgentId, environment, cwd = process.cwd(), logger: mainLogger, }) {
34
34
  return async function makeManager({ type = 'classic', settings, logger = mainLogger, } = {}) {
35
35
  var _a, _b, _c, _d, _e;
36
36
  var _f;
@@ -48,7 +48,7 @@ function makeMakeManager({ spec, concurrency: defaultConcurrency = utils.general
48
48
  };
49
49
  const storage = [];
50
50
  return {
51
- openEyes: utils.general.wrap((0, open_eyes_1.makeOpenEyes)({ type, batch: settings.batch, spec, core, cores, environment, logger }), async (openEyes, options) => {
51
+ openEyes: utils.general.wrap((0, open_eyes_1.makeOpenEyes)({ type, clients, batch: settings.batch, spec, core, cores, environment, logger }), async (openEyes, options) => {
52
52
  const eyes = await openEyes(options);
53
53
  storage.push(eyes);
54
54
  return eyes;