@applitools/core 4.74.2 → 4.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/README.md +15 -20
- package/dist/automation/abort.js +8 -18
- package/dist/automation/close.js +8 -27
- package/dist/automation/get-results.js +3 -11
- package/dist/automation/utils/make-environment-loggers.js +39 -0
- package/dist/automation/utils/to-environment-key.js +6 -1
- package/dist/classic/check-and-close.js +26 -69
- package/dist/classic/check.js +85 -354
- package/dist/classic/get-base-eyes.js +15 -54
- package/dist/classic/open-eyes.js +17 -10
- package/dist/classic/utils/capture.js +209 -0
- package/dist/get-typed-eyes.js +2 -2
- package/dist/offline/run-offline-snapshots.js +3 -1
- package/dist/tasks/abort.js +32 -0
- package/dist/tasks/aborted-check.js +14 -0
- package/dist/tasks/classic/capture.js +54 -0
- package/dist/tasks/classic/steps.js +51 -0
- package/dist/tasks/classic/upload.js +40 -0
- package/dist/tasks/close.js +31 -0
- package/dist/tasks/fill.js +13 -0
- package/dist/tasks/get-results.js +29 -0
- package/dist/tasks/graph.js +6 -0
- package/dist/tasks/index.js +20 -0
- package/dist/tasks/lifecycle.js +101 -0
- package/dist/tasks/match.js +109 -0
- package/dist/tasks/open.js +38 -0
- package/dist/tasks/queries.js +39 -0
- package/dist/tasks/types.js +2 -0
- package/dist/tasks/ufg/create-render-target.js +16 -0
- package/dist/tasks/ufg/recheck.js +49 -0
- package/dist/tasks/ufg/render.js +66 -0
- package/dist/tasks/ufg/steps.js +51 -0
- package/dist/tasks/upload-target.js +10 -0
- package/dist/ufg/check-and-close.js +32 -137
- package/dist/ufg/check.js +39 -175
- package/dist/ufg/get-base-eyes.js +34 -72
- package/dist/ufg/open-eyes.js +14 -8
- package/package.json +6 -5
- package/types/automation/abort.d.ts +2 -3
- package/types/automation/close.d.ts +2 -3
- package/types/automation/types.d.ts +13 -16
- package/types/automation/utils/make-environment-loggers.d.ts +3 -0
- package/types/classic/get-base-eyes.d.ts +5 -9
- package/types/classic/open-eyes.d.ts +4 -3
- package/types/classic/types.d.ts +1 -1
- package/types/classic/utils/capture.d.ts +21 -0
- package/types/tasks/abort.d.ts +11 -0
- package/types/tasks/aborted-check.d.ts +9 -0
- package/types/tasks/classic/capture.d.ts +10 -0
- package/types/tasks/classic/steps.d.ts +17 -0
- package/types/tasks/classic/upload.d.ts +14 -0
- package/types/tasks/close.d.ts +9 -0
- package/types/tasks/fill.d.ts +8 -0
- package/types/tasks/get-results.d.ts +6 -0
- package/types/tasks/graph.d.ts +3 -0
- package/types/tasks/index.d.ts +3 -0
- package/types/tasks/lifecycle.d.ts +23 -0
- package/types/tasks/match.d.ts +13 -0
- package/types/tasks/open.d.ts +10 -0
- package/types/tasks/queries.d.ts +15 -0
- package/types/tasks/types.d.ts +187 -0
- package/types/tasks/ufg/create-render-target.d.ts +11 -0
- package/types/tasks/ufg/recheck.d.ts +20 -0
- package/types/tasks/ufg/render.d.ts +15 -0
- package/types/tasks/ufg/steps.d.ts +15 -0
- package/types/tasks/upload-target.d.ts +5 -0
- package/types/ufg/get-base-eyes.d.ts +5 -10
- package/types/ufg/open-eyes.d.ts +4 -3
- package/types/ufg/types.d.ts +1 -1
package/dist/classic/check.js
CHANGED
|
@@ -1,43 +1,14 @@
|
|
|
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
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
3
|
exports.makeCheck = void 0;
|
|
30
|
-
const nml_client_1 = require("@applitools/nml-client");
|
|
31
4
|
const driver_1 = require("@applitools/driver");
|
|
32
|
-
const take_screenshots_1 = require("./utils/take-screenshots");
|
|
33
|
-
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
34
|
-
const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
|
|
35
5
|
const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
|
|
36
6
|
const to_environment_key_1 = require("../automation/utils/to-environment-key");
|
|
7
|
+
const tasks_1 = require("../tasks");
|
|
8
|
+
const steps_1 = require("../tasks/classic/steps");
|
|
9
|
+
const capture_1 = require("./utils/capture");
|
|
37
10
|
const abort_error_1 = require("../errors/abort-error");
|
|
38
|
-
const
|
|
39
|
-
const utils = __importStar(require("@applitools/utils"));
|
|
40
|
-
const lang = __importStar(require("../lang"));
|
|
11
|
+
const ABORTED = 'Command "check" was aborted before checking';
|
|
41
12
|
function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
|
|
42
13
|
return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
|
|
43
14
|
var _a;
|
|
@@ -52,335 +23,95 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
|
|
|
52
23
|
throw new abort_error_1.AbortError('Command "check" was called after test was already aborted');
|
|
53
24
|
}
|
|
54
25
|
const uniqueEnvironments = (0, uniquify_environments_1.uniquifyEnvironments)((_a = settings.environments) !== null && _a !== void 0 ? _a : defaultEnvironments);
|
|
55
|
-
|
|
56
|
-
if ((0, driver_1.isDriver)(target, spec)) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
|
|
63
|
-
// this getter actually open the eyes session if it's not already open
|
|
64
|
-
const baseEyes = await Promise.all(uniqueEnvironments.map(environment => getBaseEyes({ environment, driver, logger: environmentLogger })));
|
|
65
|
-
// if the test is new for any of the environments, we wait for the page to stabaliize before starting the checks. This should prevent us from creating a baseline with a loading spinner or something similar
|
|
66
|
-
if (baseEyes.map(baseEye => baseEye.test.isNew).some(isNew => isNew)) {
|
|
67
|
-
await new Promise(resolve => setTimeout(resolve, settings.matchTimeout));
|
|
68
|
-
}
|
|
69
|
-
let asExpected = false, retries = 0;
|
|
70
|
-
do {
|
|
71
|
-
retries++;
|
|
72
|
-
// generate base targets (images to be compared) and settings for each environment
|
|
73
|
-
const baseScreenshotsAndSettings = await generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver);
|
|
74
|
-
const promises = baseScreenshotsAndSettings.map(async ({ exactEnvironment: environment, baseSetting: settings, baseTarget: target }) => {
|
|
75
|
-
return await checkEnvironment({
|
|
76
|
-
eyes,
|
|
77
|
-
driver,
|
|
78
|
-
target,
|
|
79
|
-
environment,
|
|
80
|
-
signal,
|
|
81
|
-
logger,
|
|
82
|
-
settings: {
|
|
83
|
-
...settings,
|
|
84
|
-
replaceLast: retries > 1,
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
const results = await Promise.all(promises);
|
|
89
|
-
asExpected = results.every(result => result.asExpected);
|
|
90
|
-
if (retries === 1) {
|
|
91
|
-
baseScreenshotsAndSettings.forEach(({ exactEnvironment }) => {
|
|
92
|
-
// put dummy promises in storage to tell eyes.close that all checks hepped
|
|
93
|
-
putInStorage(exactEnvironment, eyes, Promise.resolve());
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
} while (!asExpected && Date.now() - start < settings.matchTimeout);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
// Eagerly start opening sessions for web environments while screenshots are being taken.
|
|
100
|
-
// NML environments are excluded because their exact environment shape (deviceName, os,
|
|
101
|
-
// viewportSize) is only resolved after generateBaseScreenshotsAndSettings() returns, and
|
|
102
|
-
// using the unique env shape would open the session with wrong/empty fields.
|
|
103
|
-
const environmentLoggers = new Map();
|
|
104
|
-
uniqueEnvironments
|
|
105
|
-
.filter(env => !('iosDeviceInfo' in env) && !('androidDeviceInfo' in env))
|
|
106
|
-
.forEach(environment => {
|
|
107
|
-
const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
|
|
108
|
-
environmentLoggers.set((0, to_environment_key_1.toEnvironmentKey)(environment), environmentLogger);
|
|
109
|
-
void getBaseEyes({ environment, driver, logger: environmentLogger });
|
|
110
|
-
});
|
|
111
|
-
// generate base targets (images to be compared) and settings for each environment
|
|
112
|
-
const baseScreenshotsAndSettings = await generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver);
|
|
113
|
-
// when no match timeout is set, queue all environment checks against the server without stalling the client test execution
|
|
114
|
-
baseScreenshotsAndSettings.forEach(({ exactEnvironment: environment, baseSetting, baseTarget }) => {
|
|
115
|
-
checkInTheBackground(environment, baseTarget, baseSetting, environmentLoggers.get((0, to_environment_key_1.toEnvironmentKey)(environment)));
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
uniqueEnvironments.forEach(environment => checkInTheBackground(environment, target, settings));
|
|
121
|
-
}
|
|
122
|
-
function checkInTheBackground(environment, target, settings, environmentLogger) {
|
|
123
|
-
putInStorage(environment, eyes, checkEnvironment({ eyes, driver, target, environment, signal, logger, settings, environmentLogger }));
|
|
26
|
+
const mutability = settings.assumesMutability ? { eyes, checkName: settings.name } : undefined;
|
|
27
|
+
if (!(0, driver_1.isDriver)(target, spec)) {
|
|
28
|
+
uniqueEnvironments.forEach(environment => addStep(environment, { upload: { target, settings: settings } }, undefined, {
|
|
29
|
+
canFuse: true,
|
|
30
|
+
mutability,
|
|
31
|
+
}));
|
|
32
|
+
return;
|
|
124
33
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
34
|
+
const driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
|
|
35
|
+
if ((signal === null || signal === void 0 ? void 0 : signal.aborted) && settings.matchTimeout)
|
|
36
|
+
throw abortError();
|
|
37
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted)
|
|
38
|
+
return (0, tasks_1.addAbortedCheck)(eyes, uniqueEnvironments, ABORTED, logger);
|
|
39
|
+
if (settings.matchTimeout) {
|
|
40
|
+
// when match timeout is set, retry checking until it passes or timeout is reached. This will stall the client test execution until it passes or timeout is reached to prevent the test from continuing and changing the state of the app
|
|
41
|
+
logger.log(`Match timeout is set to ${settings.matchTimeout}ms - will retry checking until it passes or timeout is reached`);
|
|
42
|
+
const start = Date.now();
|
|
43
|
+
let asExpected = false;
|
|
44
|
+
let retries = 0;
|
|
45
|
+
do {
|
|
46
|
+
retries += 1;
|
|
47
|
+
const capture = (0, steps_1.addCapture)(eyes.session, {
|
|
48
|
+
eyes,
|
|
49
|
+
driver,
|
|
50
|
+
settings: { ...settings, replaceLast: retries > 1 },
|
|
51
|
+
environments: uniqueEnvironments,
|
|
52
|
+
newTestDelay: retries === 1 ? settings.matchTimeout : undefined,
|
|
53
|
+
logger,
|
|
54
|
+
});
|
|
55
|
+
// Each attempt's steps go to the session of the environment the capture resolved.
|
|
56
|
+
const environments = await capture.promise.then(captured => captured.map(({ exactEnvironment }) => exactEnvironment), () => uniqueEnvironments);
|
|
57
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted)
|
|
58
|
+
throw abortError();
|
|
59
|
+
const matches = environments.map((environment, index) => addStep(environment, { upload: { index }, capture }, driver, {
|
|
60
|
+
canFuse: false,
|
|
61
|
+
mutability: retries === 1 ? mutability : undefined,
|
|
62
|
+
}));
|
|
63
|
+
const results = Promise.all(matches.map(match => match.promise.then(result => result.asExpected, () => false)));
|
|
64
|
+
await capture.promise;
|
|
65
|
+
asExpected = (await results).every(Boolean);
|
|
66
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted)
|
|
67
|
+
throw abortError();
|
|
68
|
+
} while (!asExpected && Date.now() - start < settings.matchTimeout);
|
|
69
|
+
return;
|
|
132
70
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
await eyes.core.logEvent({
|
|
145
|
-
settings: {
|
|
146
|
-
level: 'Notice',
|
|
147
|
-
event: {
|
|
148
|
-
type: 'eyes.check',
|
|
149
|
-
message: 'Assuming mutability for check Target',
|
|
150
|
-
test: {
|
|
151
|
-
checkName: settings.name,
|
|
152
|
-
batchId: baseEyes.test.batchId,
|
|
153
|
-
sessionId: baseEyes.test.sessionId,
|
|
154
|
-
testName: baseEyes.test.testName,
|
|
155
|
-
testId: baseEyes.test.testId,
|
|
156
|
-
userTestId: baseEyes.test.userTestId,
|
|
157
|
-
appId: baseEyes.test.appId,
|
|
158
|
-
baselineId: baseEyes.test.baselineId,
|
|
159
|
-
environmentId: (_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId,
|
|
160
|
-
},
|
|
161
|
-
isNew: baseEyes.test.isNew,
|
|
162
|
-
resultsUrl: baseEyes.test.resultsUrl,
|
|
163
|
-
},
|
|
164
|
-
...eyes.test.eyesServer,
|
|
165
|
-
},
|
|
166
|
-
logger,
|
|
71
|
+
// One capture of every environment; the check returns once it's done (the test may change the page
|
|
72
|
+
// right after), while its steps run in the background.
|
|
73
|
+
const driverEnvironment = await driver.getEnvironment();
|
|
74
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted)
|
|
75
|
+
return (0, tasks_1.addAbortedCheck)(eyes, uniqueEnvironments, ABORTED, logger);
|
|
76
|
+
const capture = (0, steps_1.addCapture)(eyes.session, { eyes, driver, settings, environments: uniqueEnvironments, logger });
|
|
77
|
+
const canOpenBeforeCapture = uniqueEnvironments.map(environment => (0, capture_1.isCapturedAsRequested)(settings, driverEnvironment, environment));
|
|
78
|
+
uniqueEnvironments.forEach((environment, index) => {
|
|
79
|
+
if (canOpenBeforeCapture[index]) {
|
|
80
|
+
addStep(environment, { upload: { index }, capture }, driver, { canFuse: true, mutability });
|
|
81
|
+
}
|
|
167
82
|
});
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
async function checkEnvironment({ eyes, driver, target, environment, signal, logger, settings, environmentLogger: providedEnvironmentLogger, }) {
|
|
172
|
-
var _a, _b;
|
|
173
|
-
const environmentLogger = providedEnvironmentLogger !== null && providedEnvironmentLogger !== void 0 ? providedEnvironmentLogger : logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
|
|
174
|
-
environmentLogger.log('Command "check" is called with settings', settings);
|
|
175
|
-
try {
|
|
83
|
+
const captured = await capture.promise;
|
|
176
84
|
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
177
|
-
|
|
85
|
+
return (0, tasks_1.addAbortedCheck)(eyes, captured.map(({ exactEnvironment }) => exactEnvironment), ABORTED, logger);
|
|
178
86
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
baseEyes,
|
|
183
|
-
settings,
|
|
184
|
-
logger: environmentLogger,
|
|
185
|
-
});
|
|
186
|
-
try {
|
|
187
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
188
|
-
abortError({
|
|
189
|
-
logger: environmentLogger,
|
|
190
|
-
message: `Command "check" was aborted before checking`,
|
|
191
|
-
});
|
|
87
|
+
captured.forEach(({ exactEnvironment }, index) => {
|
|
88
|
+
if (!canOpenBeforeCapture[index]) {
|
|
89
|
+
addStep(exactEnvironment, { upload: { index }, capture }, driver, { canFuse: true, mutability });
|
|
192
90
|
}
|
|
193
|
-
else if (!baseEyes.running) {
|
|
194
|
-
abortError({
|
|
195
|
-
logger: environmentLogger,
|
|
196
|
-
message: `Check on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" was aborted during one of the previous steps`,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
return await baseEyes.check({
|
|
200
|
-
target,
|
|
201
|
-
settings: settings,
|
|
202
|
-
logger: environmentLogger,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
environmentLogger.error(`Check on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" failed due to an error`, error);
|
|
207
|
-
if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
|
|
208
|
-
void baseEyes.abort({ logger: environmentLogger, settings: { reason: error } });
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
environmentLogger.error(`Environment with id ${environment.environmentId} failed before checking started due to an error`, error);
|
|
213
|
-
error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
|
|
214
|
-
throw error;
|
|
215
|
-
}
|
|
216
|
-
return { asExpected: false };
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* @throws {AbortError}
|
|
220
|
-
*/
|
|
221
|
-
function abortError({ logger, message }) {
|
|
222
|
-
logger.warn(message);
|
|
223
|
-
throw new abort_error_1.AbortError(message);
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* create base targets (array of screenshots) and base settings (array of check settings) for each environment
|
|
227
|
-
*/
|
|
228
|
-
async function generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver) {
|
|
229
|
-
var _a;
|
|
230
|
-
const driverEnvironment = await driver.getEnvironment();
|
|
231
|
-
uniqueEnvironments = addMobileDeviceInfo(uniqueEnvironments, driverEnvironment);
|
|
232
|
-
await beforeScreenshot();
|
|
233
|
-
const shouldTakeWebScreenshot = driverEnvironment.isWeb ||
|
|
234
|
-
!((_a = driverEnvironment.applitoolsLib) === null || _a === void 0 ? void 0 : _a.instrumented) ||
|
|
235
|
-
settings.webview ||
|
|
236
|
-
settings.screenshotMode === 'default';
|
|
237
|
-
if (shouldTakeWebScreenshot) {
|
|
238
|
-
return await takeWebScreenshot({
|
|
239
|
-
driver,
|
|
240
|
-
settings,
|
|
241
|
-
environments: uniqueEnvironments,
|
|
242
|
-
logger,
|
|
243
|
-
eyes,
|
|
244
91
|
});
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
checkConflictingCapabilities();
|
|
249
|
-
return await takeNMLScreenshot({
|
|
250
|
-
driver,
|
|
251
|
-
settings,
|
|
252
|
-
environments: uniqueEnvironments,
|
|
253
|
-
logger,
|
|
254
|
-
eyes,
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
async function beforeScreenshot() {
|
|
258
|
-
var _a;
|
|
259
|
-
await driver.currentContext.setScrollingElement((_a = settings.scrollRootElement) !== null && _a !== void 0 ? _a : null);
|
|
260
|
-
if (settings.lazyLoad && driverEnvironment.isWeb) {
|
|
261
|
-
await (0, wait_for_lazy_load_1.waitForLazyLoad)({
|
|
262
|
-
context: driver.currentContext,
|
|
263
|
-
settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
|
|
264
|
-
logger,
|
|
265
|
-
});
|
|
92
|
+
function abortError() {
|
|
93
|
+
logger.warn(ABORTED);
|
|
94
|
+
return new abort_error_1.AbortError(ABORTED, { userTestId: eyes.test.userTestId, environment: uniqueEnvironments[0] });
|
|
266
95
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
96
|
+
function addStep(environment, step, driver, match) {
|
|
97
|
+
const environmentLogger = eyes.getEnvironmentLogger(environment, logger);
|
|
98
|
+
const open = { eyes, environment, driver, logger: environmentLogger };
|
|
99
|
+
return (0, steps_1.addCheck)(eyes.session, (0, to_environment_key_1.toEnvironmentKey)(environment), {
|
|
100
|
+
open,
|
|
101
|
+
capture: step.capture,
|
|
102
|
+
upload: { ...step.upload, signal, logger: environmentLogger },
|
|
103
|
+
inputs: {
|
|
104
|
+
...match,
|
|
105
|
+
signal,
|
|
106
|
+
onError: (error, baseEyes) => {
|
|
107
|
+
var _a;
|
|
108
|
+
environmentLogger.error(`Check on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" failed due to an error`, error);
|
|
109
|
+
error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
|
|
110
|
+
},
|
|
111
|
+
logger: environmentLogger,
|
|
112
|
+
},
|
|
273
113
|
});
|
|
274
|
-
logger.console.log(chalk_1.default.yellow(message));
|
|
275
|
-
logger.log(message);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
function addMobileDeviceInfo(environments, driverEnvironment) {
|
|
279
|
-
return environments.map(environment => {
|
|
280
|
-
var _a, _b;
|
|
281
|
-
var _c, _d;
|
|
282
|
-
if (utils.types.has(environment, 'iosDeviceInfo')) {
|
|
283
|
-
(_a = (_c = environment.iosDeviceInfo).version) !== null && _a !== void 0 ? _a : (_c.version = driverEnvironment.platformVersion);
|
|
284
|
-
}
|
|
285
|
-
else if (utils.types.has(environment, 'androidDeviceInfo')) {
|
|
286
|
-
(_b = (_d = environment.androidDeviceInfo).version) !== null && _b !== void 0 ? _b : (_d.version = driverEnvironment.platformVersion);
|
|
287
|
-
}
|
|
288
|
-
return environment;
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
async function takeWebScreenshot({ driver, settings, environments, logger, eyes, }) {
|
|
293
|
-
let actualEnvironments = environments;
|
|
294
|
-
if (settings.screenshotMode === 'default') {
|
|
295
|
-
const { localEnvironment, renderEnvironments } = await (0, nml_client_1.getNMLEnvironmentsInfo)({
|
|
296
|
-
environments: environments,
|
|
297
|
-
supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl,
|
|
298
|
-
proxy: eyes.test.eyesServer.proxy,
|
|
299
|
-
logger,
|
|
300
|
-
});
|
|
301
|
-
actualEnvironments = localEnvironment ? [localEnvironment] : renderEnvironments;
|
|
302
|
-
}
|
|
303
|
-
const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
|
|
304
|
-
const screenshots = await (0, take_screenshots_1.takeScreenshots)({
|
|
305
|
-
driver,
|
|
306
|
-
settings: {
|
|
307
|
-
...settings,
|
|
308
|
-
environments: actualEnvironments,
|
|
309
|
-
regionsToCalculate: elementReferences.calculate,
|
|
310
|
-
calculateView: !!settings.pageId,
|
|
311
|
-
domSettings: settings.sendDom ? { proxy: eyes.test.eyesServer.proxy } : undefined,
|
|
312
|
-
},
|
|
313
|
-
logger,
|
|
314
|
-
});
|
|
315
|
-
return screenshots.map(({ calculatedRegions, ...baseTarget }, i) => {
|
|
316
|
-
return {
|
|
317
|
-
baseTarget,
|
|
318
|
-
baseSetting: getBaseCheckSettings({ calculatedRegions }),
|
|
319
|
-
exactEnvironment: actualEnvironments[i],
|
|
320
|
-
};
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
async function takeNMLScreenshot({ driver, settings, environments, logger, eyes, }) {
|
|
324
|
-
const nmlClient = await eyes.core.getNMLClient({
|
|
325
|
-
driver,
|
|
326
|
-
settings: { ...eyes.test.eyesServer, supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl },
|
|
327
|
-
logger,
|
|
328
|
-
});
|
|
329
|
-
if (settings.scrollRootElement || settings.region || (0, to_base_check_settings_1.hasCodedRegions)(settings)) {
|
|
330
|
-
//TODO we can skip `preTakeScreenshot` if the element/s already have the attribute `content-desc` (for android)
|
|
331
|
-
// and send it to `takeScreenshot` right away (possibly with `name` attribute for ios as well)
|
|
332
|
-
await nmlClient.preTakeScreenshot({ logger });
|
|
333
|
-
}
|
|
334
|
-
const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
335
|
-
settings: {
|
|
336
|
-
...settings,
|
|
337
|
-
...(await (0, to_base_check_settings_1.extractMobileElementsIntoCheckSettings)({ settings, driver, logger })),
|
|
338
|
-
},
|
|
339
|
-
});
|
|
340
|
-
const calculate = elementReferences.calculate;
|
|
341
|
-
if (typeof settings.waitBeforeCapture === 'function') {
|
|
342
|
-
throw new Error('providing functions to waitBeforeCapture is not supported in NML - please use a number instead');
|
|
343
|
-
}
|
|
344
|
-
const screenshots = await nmlClient.takeScreenshots({
|
|
345
|
-
settings: {
|
|
346
|
-
environments: environments,
|
|
347
|
-
fully: settings.fully,
|
|
348
|
-
stitchMode: settings.stitchMode,
|
|
349
|
-
hideScrollbars: settings.hideScrollbars,
|
|
350
|
-
hideCaret: settings.hideCaret,
|
|
351
|
-
overlap: settings.overlap,
|
|
352
|
-
waitBeforeCapture: settings.waitBeforeCapture,
|
|
353
|
-
waitBetweenStitches: settings.waitBetweenStitches,
|
|
354
|
-
lazyLoad: settings.lazyLoad,
|
|
355
|
-
name: settings.name,
|
|
356
|
-
region: elementReferences.target,
|
|
357
|
-
selectorsToFindRegionsFor: calculate.map(({ name }) => name),
|
|
358
|
-
scrollRootElement: elementReferences.scrolling,
|
|
359
|
-
sendDom: settings.sendDom,
|
|
360
|
-
},
|
|
361
|
-
logger,
|
|
362
|
-
});
|
|
363
|
-
return screenshots.map(({ calculateRegions, ...baseTarget }) => {
|
|
364
|
-
var _a, _b;
|
|
365
|
-
const aggregateCalculatedRegions = [];
|
|
366
|
-
calculate.forEach(({ reference }, index) => {
|
|
367
|
-
const regions = calculateRegions === null || calculateRegions === void 0 ? void 0 : calculateRegions[index];
|
|
368
|
-
if (regions) {
|
|
369
|
-
aggregateCalculatedRegions.push({ regions, selector: reference });
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
logger.log(`Regions "${JSON.stringify(reference)}" was not found in the screenshot`);
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
if ((_a = baseTarget.dom) === null || _a === void 0 ? void 0 : _a.error) {
|
|
376
|
-
logger.warn('could not fetch DOM: ' + baseTarget.dom.error);
|
|
377
114
|
}
|
|
378
|
-
|
|
379
|
-
baseTarget: { ...baseTarget, dom: (_b = baseTarget.dom) === null || _b === void 0 ? void 0 : _b.url, isTransformed: true },
|
|
380
|
-
baseSetting: getBaseCheckSettings({
|
|
381
|
-
calculatedRegions: aggregateCalculatedRegions,
|
|
382
|
-
}),
|
|
383
|
-
exactEnvironment: baseTarget.environment,
|
|
384
|
-
};
|
|
385
|
-
});
|
|
115
|
+
};
|
|
386
116
|
}
|
|
117
|
+
exports.makeCheck = makeCheck;
|
|
@@ -1,59 +1,20 @@
|
|
|
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
|
-
exports.
|
|
27
|
-
const to_environment_key_1 = require("../automation/utils/to-environment-key");
|
|
28
|
-
const utils = __importStar(require("@applitools/utils"));
|
|
3
|
+
exports.getBaseEyes = void 0;
|
|
29
4
|
const report_kobiton_1 = require("../automation/utils/report-kobiton");
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
5
|
+
async function getBaseEyes({ eyes, settings, logger, }) {
|
|
6
|
+
var _a;
|
|
7
|
+
const defaultSettings = eyes.openSettings;
|
|
8
|
+
logger.log(`Command "getBaseEyes" is called with settings`, settings);
|
|
9
|
+
const baseEyes = await eyes.core.base.openEyes({
|
|
10
|
+
settings: {
|
|
11
|
+
...defaultSettings,
|
|
12
|
+
fallbackBaselineId: (_a = settings.environment) === null || _a === void 0 ? void 0 : _a.fallbackBaselineId,
|
|
13
|
+
environment: { ...defaultSettings.environment, ...settings.environment },
|
|
14
|
+
},
|
|
15
|
+
logger,
|
|
41
16
|
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
var _a;
|
|
45
|
-
logger = logger.extend(mainLogger);
|
|
46
|
-
logger.log(`Command "getBaseEyes" is called with settings`, settings);
|
|
47
|
-
const baseEyes = await eyes.core.base.openEyes({
|
|
48
|
-
settings: {
|
|
49
|
-
...defaultSettings,
|
|
50
|
-
fallbackBaselineId: (_a = settings.environment) === null || _a === void 0 ? void 0 : _a.fallbackBaselineId,
|
|
51
|
-
environment: { ...defaultSettings.environment, ...settings.environment },
|
|
52
|
-
},
|
|
53
|
-
logger,
|
|
54
|
-
});
|
|
55
|
-
void (0, report_kobiton_1.reportKobiton)({ driver: settings.driver, settings: baseEyes.test, logger });
|
|
56
|
-
return baseEyes;
|
|
57
|
-
}
|
|
17
|
+
void (0, report_kobiton_1.reportKobiton)({ driver: settings.driver, settings: baseEyes.test, logger });
|
|
18
|
+
return baseEyes;
|
|
58
19
|
}
|
|
59
|
-
exports.
|
|
20
|
+
exports.getBaseEyes = getBaseEyes;
|
|
@@ -25,22 +25,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.makeOpenEyes = void 0;
|
|
27
27
|
const driver_1 = require("@applitools/driver");
|
|
28
|
-
const get_base_eyes_1 = require("./get-base-eyes");
|
|
29
28
|
const check_1 = require("./check");
|
|
30
29
|
const check_and_close_1 = require("./check-and-close");
|
|
31
30
|
const close_1 = require("../automation/close");
|
|
32
31
|
const abort_1 = require("../automation/abort");
|
|
33
32
|
const get_results_1 = require("../automation/get-results");
|
|
34
33
|
const extract_default_environments_1 = require("./utils/extract-default-environments");
|
|
34
|
+
const make_environment_loggers_1 = require("../automation/utils/make-environment-loggers");
|
|
35
|
+
const tasks_1 = require("../tasks");
|
|
36
|
+
const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
|
|
35
37
|
const abort_controller_1 = require("abort-controller");
|
|
36
38
|
const utils = __importStar(require("@applitools/utils"));
|
|
37
39
|
function makeOpenEyes({ core, spec, logger: mainLogger }) {
|
|
38
|
-
return async function openEyes({ target, settings,
|
|
39
|
-
var _a, _b, _c, _d;
|
|
40
|
+
return async function openEyes({ target, settings, session = {}, logger = mainLogger, }) {
|
|
41
|
+
var _a, _b, _c, _d, _e;
|
|
40
42
|
logger = logger.extend(mainLogger);
|
|
41
|
-
logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []),
|
|
43
|
+
logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), (0, tasks_1.activeEnvironmentKeys)(session).length > 0 ? 'and existing sessions' : '');
|
|
42
44
|
const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
|
|
43
|
-
if (driver &&
|
|
45
|
+
if (driver && (0, tasks_1.activeEnvironmentKeys)(session).length === 0) {
|
|
44
46
|
const environment = await driver.getEnvironment();
|
|
45
47
|
if (((_a = settings.environment) === null || _a === void 0 ? void 0 : _a.viewportSize) && !environment.isMobile) {
|
|
46
48
|
await driver.setViewportSize(settings.environment.viewportSize);
|
|
@@ -68,7 +70,7 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
|
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
|
-
|
|
73
|
+
const eyes = utils.general.extend({}, eyes => {
|
|
72
74
|
var _a, _b, _c, _d;
|
|
73
75
|
return {
|
|
74
76
|
type: 'classic',
|
|
@@ -86,15 +88,20 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
|
|
|
86
88
|
account,
|
|
87
89
|
},
|
|
88
90
|
running: true,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
+
session,
|
|
92
|
+
getEnvironmentLogger: (0, make_environment_loggers_1.makeEnvironmentLoggers)(),
|
|
93
|
+
openSettings: settings,
|
|
91
94
|
check: (0, check_1.makeCheck)({ eyes, target: driver, environments, spec, signal, logger }),
|
|
92
95
|
checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, target: driver, environments, spec, signal, logger }),
|
|
93
|
-
close: (0, close_1.makeClose)({ eyes, driver,
|
|
94
|
-
abort: (0, abort_1.makeAbort)({ eyes, driver,
|
|
96
|
+
close: (0, close_1.makeClose)({ eyes, driver, logger }),
|
|
97
|
+
abort: (0, abort_1.makeAbort)({ eyes, driver, controller, logger }),
|
|
95
98
|
getResults: (0, get_results_1.makeGetResults)({ eyes, logger }),
|
|
96
99
|
};
|
|
97
100
|
});
|
|
101
|
+
// A device environment's session opens with the exact environment its capture resolves, so it isn't declared here.
|
|
102
|
+
const declared = (0, uniquify_environments_1.uniquifyEnvironments)(((_e = settings.environments) === null || _e === void 0 ? void 0 : _e.length) ? settings.environments : environments).filter(environment => !utils.types.has(environment, 'iosDeviceInfo') && !utils.types.has(environment, 'androidDeviceInfo'));
|
|
103
|
+
(0, tasks_1.declareOpens)(eyes, declared, driver, logger);
|
|
104
|
+
return eyes;
|
|
98
105
|
};
|
|
99
106
|
}
|
|
100
107
|
exports.makeOpenEyes = makeOpenEyes;
|