@applitools/core 1.4.6 → 1.4.7

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 (90) hide show
  1. package/dist/automation/get-viewport-size.js +1 -1
  2. package/dist/automation/locate.js +1 -1
  3. package/dist/automation/set-viewport-size.js +1 -1
  4. package/dist/automation/utils/take-screenshot.js +2 -2
  5. package/dist/{utils → automation/utils}/to-base-check-settings.js +3 -2
  6. package/dist/{utils → automation/utils}/wait-for-lazy-load.js +2 -2
  7. package/dist/check-and-close.js +7 -5
  8. package/dist/check.js +7 -5
  9. package/dist/classic/abort.js +1 -1
  10. package/dist/classic/check-and-close.js +9 -5
  11. package/dist/classic/check.js +12 -8
  12. package/dist/classic/close.js +1 -1
  13. package/dist/classic/core.js +5 -5
  14. package/dist/classic/extract-text.js +11 -5
  15. package/dist/classic/locate-text.js +2 -0
  16. package/dist/classic/open-eyes.js +16 -14
  17. package/dist/classic/utils/take-dom-capture.js +35 -54
  18. package/dist/close-manager.js +4 -3
  19. package/dist/core.js +5 -5
  20. package/dist/get-typed-eyes.js +1 -4
  21. package/dist/make-ec-client.js +1 -9
  22. package/dist/make-manager.js +25 -27
  23. package/dist/troubleshoot/check-network.js +41 -34
  24. package/dist/troubleshoot/eyes.js +2 -2
  25. package/dist/troubleshoot/ufg.js +3 -2
  26. package/dist/troubleshoot/utils.js +1 -25
  27. package/dist/ufg/abort.js +2 -7
  28. package/dist/ufg/check-and-close.js +50 -46
  29. package/dist/ufg/check.js +31 -24
  30. package/dist/ufg/core.js +5 -5
  31. package/dist/ufg/get-base-eyes.js +2 -0
  32. package/dist/ufg/open-eyes.js +11 -2
  33. package/dist/ufg/utils/extract-broker-url.js +52 -0
  34. package/dist/ufg/utils/generate-safe-selectors.js +10 -5
  35. package/dist/ufg/utils/take-dom-snapshot.js +37 -36
  36. package/dist/ufg/utils/take-dom-snapshots.js +13 -17
  37. package/dist/ufg/utils/take-snapshots.js +3 -3
  38. package/dist/ufg/utils/take-vhses.js +60 -166
  39. package/dist/utils/format-results.js +37 -37
  40. package/package.json +19 -36
  41. package/types/automation/get-viewport-size.d.ts +2 -2
  42. package/types/automation/locate.d.ts +3 -3
  43. package/types/automation/set-viewport-size.d.ts +2 -2
  44. package/types/automation/types.d.ts +7 -7
  45. package/types/automation/utils/take-screenshot.d.ts +6 -6
  46. package/types/automation/utils/to-base-check-settings.d.ts +24 -0
  47. package/types/{utils → automation/utils}/wait-for-lazy-load.d.ts +0 -0
  48. package/types/check-and-close.d.ts +7 -7
  49. package/types/check.d.ts +6 -6
  50. package/types/classic/abort.d.ts +2 -2
  51. package/types/classic/check-and-close.d.ts +8 -4
  52. package/types/classic/check.d.ts +4 -4
  53. package/types/classic/close.d.ts +2 -2
  54. package/types/classic/core.d.ts +1 -1
  55. package/types/classic/extract-text.d.ts +3 -3
  56. package/types/classic/get-base-eyes.d.ts +4 -4
  57. package/types/classic/locate-text.d.ts +3 -3
  58. package/types/classic/open-eyes.d.ts +4 -4
  59. package/types/classic/utils/take-dom-capture.d.ts +3 -3
  60. package/types/close-batch.d.ts +1 -1
  61. package/types/close-manager.d.ts +4 -4
  62. package/types/close.d.ts +3 -3
  63. package/types/delete-test.d.ts +1 -1
  64. package/types/errors/abort-error.d.ts +0 -1
  65. package/types/extract-text.d.ts +3 -3
  66. package/types/get-typed-eyes.d.ts +3 -3
  67. package/types/locate-text.d.ts +3 -3
  68. package/types/locate.d.ts +4 -4
  69. package/types/make-ec-client.d.ts +3 -3
  70. package/types/make-manager.d.ts +8 -8
  71. package/types/open-eyes.d.ts +6 -6
  72. package/types/troubleshoot/check-network.d.ts +3 -3
  73. package/types/troubleshoot/utils.d.ts +0 -2
  74. package/types/types.d.ts +6 -4
  75. package/types/ufg/abort.d.ts +3 -4
  76. package/types/ufg/check-and-close.d.ts +20 -8
  77. package/types/ufg/check.d.ts +4 -4
  78. package/types/ufg/close.d.ts +2 -2
  79. package/types/ufg/get-base-eyes.d.ts +6 -6
  80. package/types/ufg/open-eyes.d.ts +4 -4
  81. package/types/ufg/types.d.ts +2 -2
  82. package/types/ufg/utils/extract-broker-url.d.ts +6 -0
  83. package/types/ufg/utils/generate-safe-selectors.d.ts +9 -5
  84. package/types/ufg/utils/take-dom-snapshot.d.ts +31 -6
  85. package/types/ufg/utils/take-snapshots.d.ts +1 -1
  86. package/types/ufg/utils/take-vhses.d.ts +1 -1
  87. package/types/utils/format-results.d.ts +1 -1
  88. package/dist/utils/extract-broker-url.js +0 -24
  89. package/types/utils/extract-broker-url.d.ts +0 -2
  90. package/types/utils/to-base-check-settings.d.ts +0 -18
@@ -0,0 +1,52 @@
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.extractBrokerUrl = void 0;
27
+ const utils = __importStar(require("@applitools/utils"));
28
+ async function extractBrokerUrl({ driver, logger, }) {
29
+ if (!driver.isNative)
30
+ return null;
31
+ logger.log('Broker url extraction is started');
32
+ const element = await driver.element({ type: 'accessibility id', selector: 'Applitools_View' });
33
+ if (!element)
34
+ return null;
35
+ try {
36
+ let result;
37
+ do {
38
+ result = JSON.parse(await element.getText());
39
+ if (result.nextPath) {
40
+ logger.log('Broker url was extraction finished successfully with value', result.nextPath);
41
+ return result.nextPath;
42
+ }
43
+ await utils.general.sleep(1000);
44
+ } while (!result.error);
45
+ logger.error('Broker url extraction has failed with error', result.error);
46
+ return null;
47
+ }
48
+ catch (error) {
49
+ return null;
50
+ }
51
+ }
52
+ exports.extractBrokerUrl = extractBrokerUrl;
@@ -24,8 +24,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.generateSafeSelectors = void 0;
27
- const snippets = __importStar(require("@applitools/snippets"));
28
27
  const utils = __importStar(require("@applitools/utils"));
28
+ const { addElementIds, cleanupElementIds } = require('@applitools/snippets');
29
29
  async function generateSafeSelectors({ context, elementReferences, }) {
30
30
  const mapping = {
31
31
  elements: [],
@@ -36,14 +36,19 @@ async function generateSafeSelectors({ context, elementReferences, }) {
36
36
  mapping.elements.push(elements);
37
37
  mapping.ids.push(Array(elements.length).fill(utils.general.guid()));
38
38
  }
39
- const generatedSelectors = await context.execute(snippets.addElementIds, [mapping.elements.flat(), mapping.ids.flat()]);
39
+ const generatedSelectors = await context.execute(addElementIds, [
40
+ mapping.elements.flat(),
41
+ mapping.ids.flat(),
42
+ ]);
40
43
  let offset = 0;
41
44
  const selectors = mapping.elements.map((elements, index) => {
42
45
  if (elements.length === 0)
43
46
  return { safeSelector: null, originalSelector: null, elementReference: elementReferences[index] };
44
47
  const safeSelector = generatedSelectors[offset].reduce((selector, value) => {
45
- return selector ? { ...selector, shadow: { type: 'css', selector: value } } : { type: 'css', selector: value };
46
- }, null);
48
+ return utils.types.isObject(selector)
49
+ ? { ...selector, shadow: { type: 'css', selector: value } }
50
+ : { type: 'css', selector: value };
51
+ }, undefined);
47
52
  offset += elements.length;
48
53
  return { safeSelector, originalSelector: elements[0].commonSelector, elementReference: elementReferences[index] };
49
54
  });
@@ -54,7 +59,7 @@ async function generateSafeSelectors({ context, elementReferences, }) {
54
59
  async function cleanupGeneratedSelectors() {
55
60
  if (!mapping.elements.length)
56
61
  return;
57
- await context.execute(snippets.cleanupElementIds, [mapping.elements.flat()]);
62
+ await context.execute(cleanupElementIds, [mapping.elements.flat()]);
58
63
  }
59
64
  }
60
65
  exports.generateSafeSelectors = generateSafeSelectors;
@@ -24,45 +24,44 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.extractCrossFrames = exports.deserializeDomSnapshot = exports.takeDomSnapshot = void 0;
27
- const dom_snapshot_1 = require("@applitools/dom-snapshot");
28
27
  const utils = __importStar(require("@applitools/utils"));
28
+ const { getProcessPagePoll, getPollResult, getProcessPagePollForIE, getPollResultForIE, } = require('@applitools/dom-snapshot');
29
29
  async function takeDomSnapshot({ context, settings, logger, }) {
30
30
  var _a;
31
31
  const driver = context.driver;
32
- const isLegacyBrowser = driver.isIE || driver.isEdgeLegacy;
33
- const { canExecuteOnlyFunctionScripts } = driver.features;
34
- const arg = {
35
- dontFetchResources: settings === null || settings === void 0 ? void 0 : settings.disableBrowserFetching,
36
- skipResources: settings === null || settings === void 0 ? void 0 : settings.skipResources,
37
- removeReverseProxyURLPrefixes: Boolean(process.env.APPLITOOLS_SCRIPT_REMOVE_REVERSE_PROXY_URL_PREFIXES),
38
- 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)),
39
- serializeResources: true,
40
- compressResources: false,
41
- showLogs: settings === null || settings === void 0 ? void 0 : settings.showLogs,
42
- };
43
- const scripts = {
44
- main: canExecuteOnlyFunctionScripts
45
- ? require('@applitools/dom-snapshot').processPagePoll
46
- : `return (${isLegacyBrowser ? await (0, dom_snapshot_1.getProcessPagePollForIE)() : await (0, dom_snapshot_1.getProcessPagePoll)()}).apply(null, arguments);`,
47
- poll: canExecuteOnlyFunctionScripts
48
- ? require('@applitools/dom-snapshot').pollResult
49
- : `return (${isLegacyBrowser ? await (0, dom_snapshot_1.getPollResultForIE)() : await (0, dom_snapshot_1.getPollResult)()}).apply(null, arguments);`,
50
- };
51
- const cookies = driver.features.allCookies ? await driver.getCookies().catch(() => []) : [];
52
- const snapshot = await takeContextDomSnapshot({ context });
32
+ const cookies = ((_a = driver.features) === null || _a === void 0 ? void 0 : _a.allCookies) ? await driver.getCookies().catch(() => []) : [];
33
+ const snapshot = deserializeDomSnapshot({ snapshot: await takeContextDomSnapshot({ context }) });
53
34
  snapshot.cookies = cookies;
54
- return deserializeDomSnapshot({ snapshot });
35
+ return snapshot;
55
36
  async function takeContextDomSnapshot({ context }) {
56
37
  // logger.log(`taking dom snapshot. ${context._reference ? `context referece: ${JSON.stringify(context._reference)}` : ''}`)
57
- var _a, _b;
58
- if (!driver.features.allCookies) {
38
+ var _a, _b, _c, _d, _e, _f;
39
+ if (!((_a = driver.features) === null || _a === void 0 ? void 0 : _a.allCookies)) {
59
40
  cookies.push(...(await context.getCookies()));
60
41
  }
42
+ const isLegacyBrowser = driver.isIE || driver.isEdgeLegacy;
43
+ const arg = {
44
+ dontFetchResources: settings === null || settings === void 0 ? void 0 : settings.disableBrowserFetching,
45
+ skipResources: settings === null || settings === void 0 ? void 0 : settings.skipResources,
46
+ 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
+ serializeResources: true,
49
+ compressResources: false,
50
+ showLogs: settings === null || settings === void 0 ? void 0 : settings.showLogs,
51
+ };
52
+ const scripts = {
53
+ main: ((_c = driver.features) === null || _c === void 0 ? void 0 : _c.canExecuteOnlyFunctionScripts)
54
+ ? require('@applitools/dom-snapshot').processPagePoll
55
+ : `return (${isLegacyBrowser ? await getProcessPagePollForIE() : await getProcessPagePoll()}).apply(null, arguments);`,
56
+ poll: ((_d = driver.features) === null || _d === void 0 ? void 0 : _d.canExecuteOnlyFunctionScripts)
57
+ ? require('@applitools/dom-snapshot').pollResult
58
+ : `return (${isLegacyBrowser ? await getPollResultForIE() : await getPollResult()}).apply(null, arguments);`,
59
+ };
61
60
  const snapshot = await context.executePoll(scripts, {
62
61
  main: arg,
63
62
  poll: arg,
64
- executionTimeout: (_a = settings === null || settings === void 0 ? void 0 : settings.executionTimeout) !== null && _a !== void 0 ? _a : 5 * 60 * 1000,
65
- pollTimeout: (_b = settings === null || settings === void 0 ? void 0 : settings.pollTimeout) !== null && _b !== void 0 ? _b : 200,
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,
66
65
  });
67
66
  const crossFrames = extractCrossFrames({ snapshot, logger });
68
67
  for (const { reference, parentSnapshot, cdtNode } of crossFrames) {
@@ -88,16 +87,17 @@ async function takeDomSnapshot({ context, settings, logger, }) {
88
87
  }
89
88
  }
90
89
  logger.log(`dom snapshot cdt length: ${snapshot.cdt.length}`);
91
- logger.log(`blobs urls (${snapshot.blobs.length}):`, JSON.stringify(snapshot.blobs.map(({ url }) => url))); // eslint-disable-line prettier/prettier
92
- logger.log(`resource urls (${snapshot.resourceUrls.length}):`, JSON.stringify(snapshot.resourceUrls)); // eslint-disable-line prettier/prettier
90
+ logger.log(`blobs urls (${snapshot.blobs.length}):`, JSON.stringify(snapshot.blobs.map(({ url }) => url)));
91
+ logger.log(`resource urls (${snapshot.resourceUrls.length}):`, JSON.stringify(snapshot.resourceUrls));
93
92
  return snapshot;
94
93
  }
95
94
  }
96
95
  exports.takeDomSnapshot = takeDomSnapshot;
97
96
  function deserializeDomSnapshot({ snapshot }) {
97
+ const { blobs, selector: _, crossFrames: __, ...rest } = snapshot;
98
98
  const deserializedSnapshot = {
99
- ...snapshot,
100
- resourceContents: snapshot.blobs.reduce((resourceContents, blob) => {
99
+ ...rest,
100
+ resourceContents: blobs.reduce((resourceContents, blob) => {
101
101
  if (blob.value === undefined)
102
102
  return { ...resourceContents, [blob.url]: blob };
103
103
  else
@@ -105,13 +105,10 @@ function deserializeDomSnapshot({ snapshot }) {
105
105
  }, {}),
106
106
  frames: snapshot.frames.map(frameSnapshot => deserializeDomSnapshot({ snapshot: frameSnapshot })),
107
107
  };
108
- delete deserializedSnapshot.blobs;
109
- delete deserializedSnapshot.selector;
110
- delete deserializedSnapshot.crossFrames;
111
108
  return deserializedSnapshot;
112
109
  }
113
110
  exports.deserializeDomSnapshot = deserializeDomSnapshot;
114
- function extractCrossFrames({ snapshot, parent = null, logger }) {
111
+ function extractCrossFrames({ snapshot, parent = null, logger, }) {
115
112
  var _a;
116
113
  const crossFrames = [snapshot, ...((_a = snapshot.frames) !== null && _a !== void 0 ? _a : [])].flatMap((snapshot, index) => {
117
114
  var _a;
@@ -123,7 +120,11 @@ function extractCrossFrames({ snapshot, parent = null, logger }) {
123
120
  return [
124
121
  ...crossFrames,
125
122
  ...(index > 0
126
- ? extractCrossFrames({ snapshot, parent: { reference: { type: 'css', selector: snapshot.selector }, parent }, logger })
123
+ ? extractCrossFrames({
124
+ snapshot,
125
+ parent: { reference: { type: 'css', selector: snapshot.selector }, parent },
126
+ logger,
127
+ })
127
128
  : []),
128
129
  ];
129
130
  });
@@ -38,10 +38,10 @@ async function takeDomSnapshots({ driver, settings, hooks, provides, logger, })
38
38
  var _a, _b, _c, _d;
39
39
  const currentContext = driver.currentContext;
40
40
  const waitBeforeCapture = async () => {
41
- if (typeof settings.waitBeforeCapture === 'function') {
41
+ if (utils.types.isFunction(settings.waitBeforeCapture)) {
42
42
  await settings.waitBeforeCapture();
43
43
  }
44
- else {
44
+ else if (settings.waitBeforeCapture) {
45
45
  await utils.general.sleep(settings.waitBeforeCapture);
46
46
  }
47
47
  };
@@ -55,7 +55,7 @@ async function takeDomSnapshots({ driver, settings, hooks, provides, logger, })
55
55
  }
56
56
  const isStrictBreakpoints = utils.types.isArray(settings.layoutBreakpoints);
57
57
  const requiredWidths = await settings.renderers.reduce(async (prev, renderer, index) => {
58
- const { name, width } = await extractRendererInfo({ renderer });
58
+ const { name, width } = (await extractRendererInfo({ renderer }));
59
59
  const requiredWidths = await prev;
60
60
  const requiredWidth = isStrictBreakpoints
61
61
  ? calculateBreakpoint({ breakpoints: settings.layoutBreakpoints, value: width })
@@ -128,21 +128,17 @@ async function takeDomSnapshots({ driver, settings, hooks, provides, logger, })
128
128
  async function extractRendererInfo({ renderer }) {
129
129
  if (utils.types.has(renderer, ['width', 'height'])) {
130
130
  const { name, width, height } = renderer;
131
- return { name, width, height };
131
+ return { name: name !== null && name !== void 0 ? name : 'default', width, height };
132
132
  }
133
- else {
134
- let devices, info;
135
- if (utils.types.has(renderer, 'chromeEmulationInfo')) {
136
- info = renderer.chromeEmulationInfo;
137
- devices = await provides.getChromeEmulationDevices();
138
- }
139
- else if (utils.types.has(renderer, 'iosDeviceInfo')) {
140
- info = renderer.iosDeviceInfo;
141
- devices = await provides.getIOSDevices();
142
- }
143
- const { deviceName, screenOrientation = 'portrait' } = info;
144
- const size = devices[deviceName][screenOrientation];
145
- return { name: deviceName, screenOrientation, ...size };
133
+ else if (utils.types.has(renderer, 'chromeEmulationInfo')) {
134
+ const devices = await provides.getChromeEmulationDevices();
135
+ const { deviceName, screenOrientation = 'portrait' } = renderer.chromeEmulationInfo;
136
+ return { name: deviceName, screenOrientation, ...devices[deviceName][screenOrientation] };
137
+ }
138
+ else if (utils.types.has(renderer, 'iosDeviceInfo')) {
139
+ const devices = await provides.getIOSDevices();
140
+ const { deviceName, screenOrientation = 'portrait' } = renderer.iosDeviceInfo;
141
+ return { name: deviceName, screenOrientation, ...devices[deviceName][screenOrientation] };
146
142
  }
147
143
  }
148
144
  }
@@ -18,7 +18,7 @@ exports.takeSnapshots = void 0;
18
18
  const take_dom_snapshots_1 = require("./take-dom-snapshots");
19
19
  const take_vhses_1 = require("./take-vhses");
20
20
  const nml_client_1 = require("@applitools/nml-client");
21
- const extract_broker_url_1 = require("../../utils/extract-broker-url");
21
+ const extract_broker_url_1 = require("./extract-broker-url");
22
22
  __exportStar(require("./take-dom-snapshots"), exports);
23
23
  __exportStar(require("./take-vhses"), exports);
24
24
  async function takeSnapshots({ driver, settings, hooks, provides, logger, }) {
@@ -26,9 +26,9 @@ async function takeSnapshots({ driver, settings, hooks, provides, logger, }) {
26
26
  return (0, take_dom_snapshots_1.takeDomSnapshots)({ driver, settings, hooks, provides, logger });
27
27
  }
28
28
  else {
29
- const brokerUrl = await (0, extract_broker_url_1.extractBrokerUrl)(driver);
29
+ const brokerUrl = await (0, extract_broker_url_1.extractBrokerUrl)({ driver, logger });
30
30
  if (brokerUrl) {
31
- return (0, nml_client_1.takeSnapshots)({ url: brokerUrl, settings, logger });
31
+ return (await (0, nml_client_1.takeSnapshots)({ url: brokerUrl, settings, logger }));
32
32
  }
33
33
  else {
34
34
  return (0, take_vhses_1.takeVHSes)({ driver, settings, hooks, logger });
@@ -1,131 +1,109 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.takeVHSes = void 0;
27
- const utils = __importStar(require("@applitools/utils"));
28
4
  async function takeVHSes({ driver, settings, hooks, logger, }) {
29
5
  var _a;
30
6
  logger.log('taking VHS');
31
7
  if (!driver.isAndroid && !driver.isIOS) {
32
- throwError('cannot take VHS on mobile device other than iOS or Android');
8
+ throw new Error('cannot take VHS on mobile device other than iOS or Android');
33
9
  }
34
10
  await ((_a = hooks === null || hooks === void 0 ? void 0 : hooks.beforeSnapshots) === null || _a === void 0 ? void 0 : _a.call(hooks));
35
- const trigger = await findElement({
36
- driver,
37
- selector: 'UFG_TriggerArea',
38
- type: 'Button',
39
- timeout: 30000,
40
- });
11
+ const trigger = await driver.waitFor(driver.isAndroid
12
+ ? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_TriggerArea"]` }
13
+ : { type: 'accessibility id', selector: 'UFG_TriggerArea' }, { timeout: 30000 });
14
+ if (!trigger)
15
+ throw new Error('Trigger element could not be found');
41
16
  if (driver.isAndroid) {
42
- const apiKeyInput = await findElement({
43
- driver,
44
- selector: 'UFG_Apikey',
45
- type: 'EditText',
46
- throwErr: false,
17
+ const apiKeyInput = await driver.element({
18
+ type: 'xpath',
19
+ selector: `//android.widget.EditText[@content-desc="UFG_Apikey"]`,
47
20
  });
48
21
  if (apiKeyInput) {
49
22
  // in case 'apiKeyInput' does not exist, it means it was already triggered on previous cycle
50
23
  // this condition is to avoid re-sending 'inputJson' multiple times
51
24
  const inputString = JSON.stringify({
52
- serverUrl: settings.serverUrl || undefined,
25
+ serverUrl: settings.serverUrl,
53
26
  apiKey: settings.apiKey,
54
- proxy: settings.proxy ? transformProxy(settings.proxy) : undefined,
27
+ proxy: settings.proxy && transformProxy(settings.proxy),
55
28
  });
56
- log('sending API key to UFG lib', inputString);
29
+ logger.log('sending API key to UFG lib', inputString);
57
30
  await apiKeyInput.type(inputString);
58
- const ready = await findElement({
59
- driver,
60
- selector: 'UFG_ApikeyReady',
61
- type: 'Button',
31
+ const ready = await driver.element({
32
+ type: 'xpath',
33
+ selector: `//android.widget.Button[@content-desc="UFG_ApikeyReady"]`,
62
34
  });
35
+ if (!ready)
36
+ throw new Error('Api key readiness element could not be found');
63
37
  await ready.click();
64
38
  }
65
39
  else {
66
- log('UFG_Apikey was skipped');
40
+ logger.log('UFG_Apikey was skipped');
67
41
  }
68
42
  }
69
43
  await trigger.click(); // TODO handle stale element exception and then find the trigger again and click it
70
- let label = await findElement({
71
- driver,
72
- selector: 'UFG_SecondaryLabel',
73
- type: 'TextView',
74
- timeout: 10000,
75
- throwErr: false,
76
- });
44
+ let label = await driver.waitFor(driver.isAndroid
45
+ ? { type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_SecondaryLabel"]` }
46
+ : { type: 'accessibility id', selector: 'UFG_SecondaryLabel' }, { timeout: 10000 });
77
47
  if (!label) {
78
48
  // 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.
79
49
  // 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
80
- log('UFG_SecondaryLabel was not found after 10 seconds, trying to click UFG_TriggerArea again');
81
- const triggerRetry = await findElement({
82
- driver,
83
- selector: 'UFG_TriggerArea',
84
- type: 'Button',
85
- timeout: 30000,
86
- throwErr: false,
87
- });
50
+ 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
+ ? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_TriggerArea"]` }
53
+ : { type: 'accessibility id', selector: 'UFG_TriggerArea' }, { timeout: 30000 });
88
54
  if (triggerRetry) {
89
- log('UFG_TriggerArea was found on retry. clicking it.');
55
+ logger.log('UFG_TriggerArea was found on retry. clicking it.');
90
56
  await triggerRetry.click();
91
57
  }
92
58
  else {
93
- log('UFG_TriggerArea was NOT found on retry. Probably VHS is being taken.');
59
+ logger.log('UFG_TriggerArea was NOT found on retry. Probably VHS is being taken.');
94
60
  }
95
- label = await findElement({
96
- driver,
97
- selector: 'UFG_SecondaryLabel',
98
- type: 'TextView',
99
- timeout: 50000,
100
- });
61
+ label = await driver.waitFor(driver.isAndroid
62
+ ? { type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_SecondaryLabel"]` }
63
+ : { type: 'accessibility id', selector: 'UFG_SecondaryLabel' }, { timeout: 50000 });
101
64
  if (!label) {
102
- log('UFG_SecondaryLabel was not found eventually. Giving up.');
65
+ logger.log('UFG_SecondaryLabel was not found eventually. Giving up.');
66
+ throw new Error('Secondary label element could not be found');
103
67
  }
104
68
  }
105
69
  const info = JSON.parse(await label.getText());
106
- log('VHS info', info);
107
- if (info.error) {
108
- throwError(info.error);
109
- }
110
- let vhs;
70
+ logger.log('VHS info', info);
71
+ if (info.error)
72
+ throw new Error(`Error while taking VHS - ${info.error}`);
73
+ let vhs = '';
111
74
  if (driver.isIOS) {
112
- vhs = await extractVHS();
75
+ const label = await driver.element({ type: 'accessibility id', selector: 'UFG_Label' });
76
+ if (!label)
77
+ throw new Error('VHS label element could not be found');
78
+ vhs = await label.getText();
113
79
  }
114
80
  else if (info.mode === 'labels') {
115
- vhs = await collectChunkedVHS({ count: info.partsCount });
81
+ const labels = [
82
+ await driver.element({ type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_Label_0"]` }),
83
+ await driver.element({ type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_Label_1"]` }),
84
+ await driver.element({ type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_Label_2"]` }),
85
+ ];
86
+ if (labels.some(label => !label))
87
+ throw new Error('VHS label element could not be found');
88
+ for (let chunk = 0; chunk < info.partsCount / labels.length; ++chunk) {
89
+ for (let label = 0; label < Math.min(labels.length, info.partsCount - chunk * labels.length); ++label) {
90
+ vhs += await labels[label].getText();
91
+ }
92
+ if (chunk * labels.length < info.partsCount)
93
+ await trigger.click();
94
+ }
116
95
  }
117
96
  else if (info.mode === 'network') {
118
97
  // do nothing
119
98
  }
120
99
  else {
121
- throwError(`unknown mode for android: ${info.mode}`);
100
+ throw new Error(`unknown mode for android: ${info.mode}`);
122
101
  }
123
- const clear = await findElement({
124
- driver,
125
- selector: 'UFG_ClearArea',
126
- type: 'Button',
127
- timeout: 30000,
128
- });
102
+ const clear = await driver.waitFor(driver.isAndroid
103
+ ? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_ClearArea"]` }
104
+ : { type: 'accessibility id', selector: 'UFG_ClearArea' }, { timeout: 30000 });
105
+ if (!clear)
106
+ throw new Error('Clear element could not be found');
129
107
  await clear.click();
130
108
  let snapshot;
131
109
  if (driver.isAndroid) {
@@ -155,46 +133,6 @@ async function takeVHSes({ driver, settings, hooks, logger, }) {
155
133
  };
156
134
  }
157
135
  return Array(settings.renderers.length).fill(snapshot);
158
- async function extractVHS() {
159
- const label = await findElement({
160
- driver,
161
- selector: 'UFG_Label',
162
- type: 'TextView',
163
- });
164
- return await label.getText();
165
- }
166
- async function collectChunkedVHS({ count }) {
167
- const labels = [
168
- await findElement({
169
- driver,
170
- selector: 'UFG_Label_0',
171
- type: 'TextView',
172
- }),
173
- await findElement({
174
- driver,
175
- selector: 'UFG_Label_1',
176
- type: 'TextView',
177
- }),
178
- await findElement({
179
- driver,
180
- selector: 'UFG_Label_2',
181
- type: 'TextView',
182
- }),
183
- ];
184
- let vhs = '';
185
- for (let chunk = 0; chunk < count / labels.length; ++chunk) {
186
- for (let label = 0; label < Math.min(labels.length, count - chunk * labels.length); ++label) {
187
- vhs += await labels[label].getText();
188
- }
189
- if (chunk * labels.length < count) {
190
- await trigger.click();
191
- }
192
- }
193
- return vhs;
194
- }
195
- function log(...msg) {
196
- logger.log('[takeVHSes]', ...msg);
197
- }
198
136
  }
199
137
  exports.takeVHSes = takeVHSes;
200
138
  function transformProxy(proxy) {
@@ -212,47 +150,3 @@ function transformProxy(proxy) {
212
150
  }
213
151
  return transformedProxy;
214
152
  }
215
- function throwError(msg) {
216
- throw new Error(`Error while taking VHS - ${msg}`);
217
- }
218
- async function findElement(options) {
219
- const { selector, timeout = 0, throwErr = true } = options;
220
- let element = await findElementBySelector(options);
221
- if (!element && timeout)
222
- element = await waitFor(options);
223
- if (!element && throwErr) {
224
- const timeoutError = timeout ? `, (waited for ${timeout} ms)` : '.';
225
- throwError(`${selector} element could not be found${timeoutError}`);
226
- }
227
- return element;
228
- async function waitFor(options) {
229
- const { timeout } = options;
230
- const interval = 500;
231
- let waiting = true;
232
- const waitTime = setTimeout(() => (waiting = false), timeout);
233
- while (waiting) {
234
- const element = await findElementBySelector(options);
235
- if (element) {
236
- clearTimeout(waitTime);
237
- return element;
238
- }
239
- await utils.general.sleep(interval);
240
- }
241
- return null;
242
- }
243
- async function findElementBySelector(options) {
244
- const { driver, selector, type } = options;
245
- const context = driver.currentContext;
246
- let element;
247
- if (driver.isAndroid) {
248
- element = await driver.element({
249
- type: 'xpath',
250
- selector: `//android.widget.${type}[@content-desc="${selector}"]`,
251
- });
252
- }
253
- else {
254
- element = await context.element({ type: 'accessibility id', selector });
255
- }
256
- return element;
257
- }
258
- }