@applitools/core 2.5.2 → 2.5.3-legacy
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/dist/abort.js +40 -0
- package/dist/automation/abort.js +47 -0
- package/dist/automation/close.js +52 -0
- package/dist/automation/extract-text.js +3 -2
- package/dist/automation/get-nml-client.js +36 -0
- package/dist/automation/get-results.js +21 -0
- package/dist/automation/get-viewport-size.js +3 -2
- package/dist/automation/locate-text.js +3 -2
- package/dist/automation/locate.js +3 -2
- package/dist/automation/set-viewport-size.js +3 -2
- package/dist/automation/types.js +0 -15
- package/dist/automation/utils/report-kobiton.js +21 -0
- package/dist/automation/utils/take-screenshot.js +4 -2
- package/dist/automation/utils/to-base-check-settings.js +69 -7
- package/dist/automation/utils/to-environment-key.js +31 -0
- package/dist/automation/utils/uniquify-environments.js +27 -0
- package/dist/automation/utils/wait-for-lazy-load.js +9 -8
- package/dist/autonomous/core.js +25 -0
- package/dist/autonomous/create-render-results.js +49 -0
- package/dist/autonomous/create-render-target.js +19 -0
- package/dist/autonomous/get-render-results.js +55 -0
- package/dist/autonomous/open-eyes.js +13 -0
- package/dist/autonomous/start-renders.js +67 -0
- package/dist/autonomous/take-snapshots.js +16 -0
- package/dist/autonomous/types.js +17 -0
- package/dist/check-and-close.js +32 -15
- package/dist/check.js +33 -30
- package/dist/classic/check-and-close.js +189 -46
- package/dist/classic/check.js +319 -60
- package/dist/classic/core.js +6 -5
- package/dist/classic/get-base-eyes.js +27 -7
- package/dist/classic/open-eyes.js +47 -57
- package/dist/classic/utils/extract-default-environments.js +73 -0
- package/dist/classic/utils/take-dom-capture.js +2 -1
- package/dist/classic/utils/take-screenshots.js +63 -0
- package/dist/cli/cli.js +99 -3
- package/dist/close-batch.js +8 -7
- package/dist/close.js +32 -4
- package/dist/core.js +43 -9
- package/dist/delete-test.js +9 -7
- package/dist/extract-text.js +9 -5
- package/dist/get-account-info.js +36 -0
- package/dist/get-ec-client.js +3 -2
- package/dist/get-eyes-results.js +29 -3
- package/dist/get-manager-results.js +52 -18
- package/dist/get-typed-eyes.js +5 -6
- package/dist/index.js +3 -3
- package/dist/lang.js +31 -0
- package/dist/locate-text.js +7 -5
- package/dist/locate.js +7 -5
- package/dist/make-manager.js +34 -11
- package/dist/offline/merge-configs.js +42 -0
- package/dist/offline/run-offline-snapshots.js +341 -0
- package/dist/open-eyes.js +192 -48
- package/dist/run-offline-snapshots.js +336 -0
- package/dist/troubleshoot/check-network.js +5 -1
- package/dist/troubleshoot/eyes.js +3 -3
- package/dist/troubleshoot/logs.js +76 -0
- package/dist/troubleshoot/ufg.js +23 -16
- package/dist/ufg/check-and-close.js +109 -174
- package/dist/ufg/check.js +111 -178
- package/dist/ufg/core.js +10 -8
- package/dist/ufg/create-render-target-from-snapshot.js +21 -0
- package/dist/ufg/get-base-eyes.js +40 -12
- package/dist/ufg/get-ufg-client.js +13 -4
- package/dist/ufg/open-eyes.js +33 -57
- package/dist/ufg/take-snapshots.js +92 -0
- package/dist/ufg/utils/extract-default-environment.js +22 -0
- package/dist/ufg/utils/generate-safe-selectors.js +9 -32
- package/dist/ufg/utils/take-dom-snapshot.js +61 -26
- package/dist/ufg/utils/take-dom-snapshots.js +99 -68
- package/dist/ufg/utils/to-generated-selectors.js +67 -0
- package/dist/ufg/utils/to-safe-check-settings.js +69 -0
- package/dist/universal/core-server.js +53 -22
- package/dist/universal/core.js +23 -6
- package/dist/universal/history.js +9 -0
- package/dist/universal/spec-driver.js +46 -50
- package/dist/{ufg/get-nml-client.js → utils/ensure-offline-folder.js} +14 -13
- package/dist/utils/extract-branching-timestamp.js +56 -0
- package/dist/utils/extract-current-commit.js +72 -0
- package/dist/utils/extract-git-info.js +168 -0
- package/dist/utils/extract-start-info.js +100 -0
- package/dist/utils/extract-test-environment.js +70 -0
- package/dist/utils/memory-usage-logging.js +46 -0
- package/dist/utils/populate-eyes-server-settings.js +41 -0
- package/dist/utils/validate-sdk-version.js +89 -0
- package/package.json +3 -3
- package/types/abort.d.ts +13 -0
- package/types/automation/abort.d.ts +16 -0
- package/types/automation/close.d.ts +14 -0
- package/types/automation/extract-text.d.ts +1 -1
- package/types/automation/get-nml-client.d.ts +16 -0
- package/types/automation/get-results.d.ts +11 -0
- package/types/automation/get-viewport-size.d.ts +1 -1
- package/types/automation/locate-text.d.ts +1 -1
- package/types/automation/locate.d.ts +1 -1
- package/types/automation/set-viewport-size.d.ts +1 -1
- package/types/automation/types.d.ts +107 -16
- package/types/automation/utils/report-kobiton.d.ts +12 -0
- package/types/automation/utils/take-screenshot.d.ts +5 -2
- package/types/automation/utils/to-base-check-settings.d.ts +13 -3
- package/types/automation/utils/to-environment-key.d.ts +2 -0
- package/types/automation/utils/uniquify-environments.d.ts +2 -0
- package/types/automation/utils/wait-for-lazy-load.d.ts +4 -8
- package/types/autonomous/core.d.ts +19 -0
- package/types/autonomous/create-render-results.d.ts +10 -0
- package/types/autonomous/create-render-target.d.ts +12 -0
- package/types/autonomous/get-render-results.d.ts +12 -0
- package/types/autonomous/open-eyes.d.ts +13 -0
- package/types/autonomous/start-renders.d.ts +12 -0
- package/types/autonomous/take-snapshots.d.ts +15 -0
- package/types/autonomous/types.d.ts +57 -0
- package/types/check-and-close.d.ts +3 -3
- package/types/check.d.ts +3 -3
- package/types/classic/check-and-close.d.ts +12 -5
- package/types/classic/check.d.ts +6 -3
- package/types/classic/core.d.ts +8 -2
- package/types/classic/get-base-eyes.d.ts +4 -8
- package/types/classic/open-eyes.d.ts +3 -4
- package/types/classic/types.d.ts +4 -5
- package/types/classic/utils/extract-default-environments.d.ts +9 -0
- package/types/classic/utils/take-dom-capture.d.ts +8 -0
- package/types/classic/utils/take-screenshots.d.ts +18 -0
- package/types/close-batch.d.ts +1 -1
- package/types/close.d.ts +3 -2
- package/types/core.d.ts +11 -2
- package/types/delete-test.d.ts +1 -1
- package/types/extract-text.d.ts +1 -1
- package/types/get-account-info.d.ts +11 -0
- package/types/get-ec-client.d.ts +1 -1
- package/types/get-eyes-results.d.ts +1 -1
- package/types/get-manager-results.d.ts +1 -1
- package/types/get-typed-eyes.d.ts +2 -4
- package/types/index.d.ts +2 -1
- package/types/lang.d.ts +32 -0
- package/types/locate-text.d.ts +1 -1
- package/types/locate.d.ts +1 -1
- package/types/make-manager.d.ts +11 -2
- package/types/offline/merge-configs.d.ts +1 -0
- package/types/offline/run-offline-snapshots.d.ts +11 -0
- package/types/open-eyes.d.ts +11 -2
- package/types/run-offline-snapshots.d.ts +6 -0
- package/types/troubleshoot/logs.d.ts +25 -0
- package/types/types.d.ts +19 -11
- package/types/ufg/check-and-close.d.ts +18 -10
- package/types/ufg/check.d.ts +5 -4
- package/types/ufg/core.d.ts +8 -5
- package/types/ufg/create-render-target-from-snapshot.d.ts +8 -0
- package/types/ufg/get-base-eyes.d.ts +4 -9
- package/types/ufg/get-ufg-client.d.ts +6 -3
- package/types/ufg/open-eyes.d.ts +3 -4
- package/types/ufg/take-snapshots.d.ts +17 -0
- package/types/ufg/types.d.ts +39 -39
- package/types/ufg/utils/extract-default-environment.d.ts +5 -0
- package/types/ufg/utils/generate-safe-selectors.d.ts +3 -12
- package/types/ufg/utils/take-dom-snapshot.d.ts +16 -21
- package/types/ufg/utils/take-dom-snapshots.d.ts +14 -10
- package/types/ufg/utils/to-generated-selectors.d.ts +34 -0
- package/types/ufg/utils/to-safe-check-settings.d.ts +22 -0
- package/types/universal/core-server.d.ts +6 -2
- package/types/universal/core.d.ts +6 -2
- package/types/universal/spec-driver.d.ts +6 -5
- package/types/universal/types.d.ts +59 -51
- package/types/utils/ensure-offline-folder.d.ts +1 -0
- package/types/utils/extract-branching-timestamp.d.ts +16 -0
- package/types/utils/extract-current-commit.d.ts +24 -0
- package/types/utils/extract-git-info.d.ts +59 -0
- package/types/utils/extract-start-info.d.ts +29 -0
- package/types/utils/extract-test-environment.d.ts +2 -0
- package/types/utils/memory-usage-logging.d.ts +7 -0
- package/types/utils/populate-eyes-server-settings.d.ts +2 -0
- package/types/utils/validate-sdk-version.d.ts +42 -0
- package/CHANGELOG.md +0 -222
- package/dist/classic/abort.js +0 -22
- package/dist/classic/close.js +0 -22
- package/dist/ufg/abort.js +0 -32
- package/dist/ufg/close.js +0 -37
- package/dist/ufg/get-results.js +0 -27
- package/dist/ufg/utils/take-vhses.js +0 -153
- package/dist/ufg/utils/uniquify-renderers.js +0 -27
- package/dist/utils/extract-ci-provider.js +0 -31
- package/types/classic/abort.d.ts +0 -16
- package/types/classic/close.d.ts +0 -16
- package/types/ufg/abort.d.ts +0 -21
- package/types/ufg/close.d.ts +0 -19
- package/types/ufg/get-nml-client.d.ts +0 -17
- package/types/ufg/get-results.d.ts +0 -16
- package/types/ufg/utils/take-vhses.d.ts +0 -17
- package/types/ufg/utils/uniquify-renderers.d.ts +0 -2
- package/types/utils/extract-ci-provider.d.ts +0 -1
package/dist/classic/check.js
CHANGED
|
@@ -22,81 +22,340 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
25
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
29
|
exports.makeCheck = void 0;
|
|
30
|
+
const nml_client_1 = require("@applitools/nml-client");
|
|
27
31
|
const driver_1 = require("@applitools/driver");
|
|
28
|
-
const
|
|
29
|
-
const take_dom_capture_1 = require("./utils/take-dom-capture");
|
|
32
|
+
const take_screenshots_1 = require("./utils/take-screenshots");
|
|
30
33
|
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
31
34
|
const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
|
|
35
|
+
const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
|
|
36
|
+
const to_environment_key_1 = require("../automation/utils/to-environment-key");
|
|
37
|
+
const abort_error_1 = require("../errors/abort-error");
|
|
38
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
32
39
|
const utils = __importStar(require("@applitools/utils"));
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
const lang = __importStar(require("../lang"));
|
|
41
|
+
function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
|
|
42
|
+
return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
|
|
43
|
+
var _a;
|
|
44
|
+
// logging
|
|
45
|
+
logger = logger.extend(mainLogger);
|
|
36
46
|
logger.log('Command "check" is called with settings', settings);
|
|
47
|
+
// input validation and sanitization
|
|
37
48
|
if (!target)
|
|
38
49
|
throw new Error('Method was called with no target');
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
51
|
+
logger.warn('Command "check" was called after test was already aborted');
|
|
52
|
+
throw new abort_error_1.AbortError('Command "check" was called after test was already aborted');
|
|
42
53
|
}
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (settings.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
const uniqueEnvironments = (0, uniquify_environments_1.uniquifyEnvironments)((_a = settings.environments) !== null && _a !== void 0 ? _a : defaultEnvironments);
|
|
55
|
+
let driver = undefined;
|
|
56
|
+
if ((0, driver_1.isDriver)(target, spec)) {
|
|
57
|
+
driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
|
|
58
|
+
if (settings.retryTimeout) {
|
|
59
|
+
// when retry 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
|
|
60
|
+
logger.log(`Retry timeout is set to ${settings.retryTimeout}ms - will retry checking until it passes or timeout is reached`);
|
|
61
|
+
const start = Date.now();
|
|
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.retryTimeout));
|
|
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.retryTimeout);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// generate base targets (images to be compared) and settings for each environment
|
|
100
|
+
const baseScreenshotsAndSettings = await generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver);
|
|
101
|
+
// when no retry timeout is set, queue all environment checks against the server without stalling the client test execution
|
|
102
|
+
baseScreenshotsAndSettings.forEach(({ exactEnvironment: environment, baseSetting, baseTarget }) => {
|
|
103
|
+
checkInTheBackground(environment, baseTarget, baseSetting);
|
|
52
104
|
});
|
|
53
105
|
}
|
|
54
106
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
107
|
+
else {
|
|
108
|
+
uniqueEnvironments.forEach(environment => checkInTheBackground(environment, target, settings));
|
|
109
|
+
}
|
|
110
|
+
function checkInTheBackground(environment, target, settings) {
|
|
111
|
+
putInStorage(environment, eyes, checkEnvironment({ eyes, driver, target, environment, signal, logger, settings }));
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
function putInStorage(environment, eyes, promise) {
|
|
115
|
+
const key = (0, to_environment_key_1.toEnvironmentKey)(environment);
|
|
116
|
+
let item = eyes.storage.get(key);
|
|
117
|
+
if (!item) {
|
|
118
|
+
item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
|
|
119
|
+
eyes.storage.set(key, item);
|
|
120
|
+
}
|
|
121
|
+
item.jobs.push(promise.then());
|
|
122
|
+
return item;
|
|
123
|
+
}
|
|
124
|
+
function getBaseEyes({ environment, driver, logger, }) {
|
|
125
|
+
return eyes.getBaseEyes({ settings: { environment, driver }, logger });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.makeCheck = makeCheck;
|
|
129
|
+
async function logAmmutabilityIfNeeded({ eyes, baseEyes, settings, }) {
|
|
130
|
+
var _a;
|
|
131
|
+
if (settings.assumesMutability) {
|
|
132
|
+
await eyes.core.logEvent({
|
|
133
|
+
settings: {
|
|
134
|
+
level: 'Notice',
|
|
135
|
+
event: {
|
|
136
|
+
type: 'eyes.check',
|
|
137
|
+
message: 'Assuming mutability for check Target',
|
|
138
|
+
test: {
|
|
139
|
+
checkName: settings.name,
|
|
140
|
+
batchId: baseEyes.test.batchId,
|
|
141
|
+
sessionId: baseEyes.test.sessionId,
|
|
142
|
+
testName: baseEyes.test.testName,
|
|
143
|
+
testId: baseEyes.test.testId,
|
|
144
|
+
userTestId: baseEyes.test.userTestId,
|
|
145
|
+
appId: baseEyes.test.appId,
|
|
146
|
+
baselineId: baseEyes.test.baselineId,
|
|
147
|
+
environmentId: (_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId,
|
|
148
|
+
},
|
|
149
|
+
isNew: baseEyes.test.isNew,
|
|
150
|
+
resultsUrl: baseEyes.test.resultsUrl,
|
|
151
|
+
},
|
|
152
|
+
...eyes.test.eyesServer,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
settings.assumesMutability = false; // prevent from logging this message again for the same check
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function checkEnvironment({ eyes, driver, target, environment, signal, logger, settings, }) {
|
|
159
|
+
var _a, _b;
|
|
160
|
+
const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
|
|
161
|
+
environmentLogger.log('Command "check" is called with settings', settings);
|
|
162
|
+
try {
|
|
163
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
164
|
+
abortError({ logger: environmentLogger, message: 'Command "check" was aborted before checking' });
|
|
165
|
+
}
|
|
166
|
+
const baseEyes = await eyes.getBaseEyes({ settings: { environment, driver }, logger: environmentLogger });
|
|
167
|
+
void logAmmutabilityIfNeeded({
|
|
168
|
+
eyes,
|
|
169
|
+
baseEyes,
|
|
170
|
+
settings,
|
|
171
|
+
});
|
|
172
|
+
try {
|
|
173
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
174
|
+
abortError({
|
|
175
|
+
logger: environmentLogger,
|
|
176
|
+
message: `Command "check" was aborted before checking`,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else if (!baseEyes.running) {
|
|
180
|
+
abortError({
|
|
181
|
+
logger: environmentLogger,
|
|
182
|
+
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`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
return await baseEyes.check({
|
|
186
|
+
target,
|
|
187
|
+
settings: settings,
|
|
188
|
+
logger: environmentLogger,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
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);
|
|
193
|
+
if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
|
|
194
|
+
void baseEyes.abort({ logger: environmentLogger, settings: { reason: error } });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
environmentLogger.error(`Environment with id ${environment.environmentId} failed before checking started due to an error`, error);
|
|
199
|
+
error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
return { asExpected: false };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* @throws {AbortError}
|
|
206
|
+
*/
|
|
207
|
+
function abortError({ logger, message }) {
|
|
208
|
+
logger.warn(message);
|
|
209
|
+
throw new abort_error_1.AbortError(message);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* create base targets (array of screenshots) and base settings (array of check settings) for each environment
|
|
213
|
+
*/
|
|
214
|
+
async function generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver) {
|
|
215
|
+
var _a;
|
|
216
|
+
const driverEnvironment = await driver.getEnvironment();
|
|
217
|
+
uniqueEnvironments = addMobileDeviceInfo(uniqueEnvironments, driverEnvironment);
|
|
218
|
+
await beforeScreenshot();
|
|
219
|
+
const shouldTakeWebScreenshot = driverEnvironment.isWeb ||
|
|
220
|
+
!((_a = driverEnvironment.applitoolsLib) === null || _a === void 0 ? void 0 : _a.instrumented) ||
|
|
221
|
+
settings.webview ||
|
|
222
|
+
settings.screenshotMode === 'default';
|
|
223
|
+
if (shouldTakeWebScreenshot) {
|
|
224
|
+
return await takeWebScreenshot({
|
|
225
|
+
driver,
|
|
226
|
+
settings,
|
|
227
|
+
environments: uniqueEnvironments,
|
|
228
|
+
logger,
|
|
229
|
+
eyes,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
// take screenshot using NML
|
|
234
|
+
checkConflictingCapabilities();
|
|
235
|
+
return await takeNMLScreenshot({
|
|
236
|
+
driver,
|
|
237
|
+
settings,
|
|
238
|
+
environments: uniqueEnvironments,
|
|
239
|
+
logger,
|
|
240
|
+
eyes,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
async function beforeScreenshot() {
|
|
244
|
+
var _a;
|
|
245
|
+
await driver.currentContext.setScrollingElement((_a = settings.scrollRootElement) !== null && _a !== void 0 ? _a : null);
|
|
246
|
+
if (settings.lazyLoad && driverEnvironment.isWeb) {
|
|
247
|
+
await (0, wait_for_lazy_load_1.waitForLazyLoad)({
|
|
248
|
+
context: driver.currentContext,
|
|
249
|
+
settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
|
|
66
250
|
logger,
|
|
67
251
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function checkConflictingCapabilities() {
|
|
255
|
+
var _a;
|
|
256
|
+
if ((_a = driverEnvironment.applitoolsLib) === null || _a === void 0 ? void 0 : _a.conflictingCapabilities) {
|
|
257
|
+
const message = lang.applitoolsLibConflictingCapabilitiesWarning({
|
|
258
|
+
conflictingCapabilities: driverEnvironment.applitoolsLib.conflictingCapabilities,
|
|
259
|
+
});
|
|
260
|
+
logger.console.log(chalk_1.default.yellow(message));
|
|
261
|
+
logger.log(message);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function addMobileDeviceInfo(environments, driverEnvironment) {
|
|
265
|
+
return environments.map(environment => {
|
|
266
|
+
var _a, _b;
|
|
267
|
+
var _c, _d;
|
|
268
|
+
if (utils.types.has(environment, 'iosDeviceInfo')) {
|
|
269
|
+
(_a = (_c = environment.iosDeviceInfo).version) !== null && _a !== void 0 ? _a : (_c.version = driverEnvironment.platformVersion);
|
|
82
270
|
}
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
const scrollingOffset = !scrollingElement || environment.isNative ? { x: 0, y: 0 } : await scrollingElement.getScrollOffset();
|
|
86
|
-
baseTarget.locationInView = utils.geometry.offset(scrollingOffset, screenshot.region);
|
|
87
|
-
baseTarget.fullViewSize = scrollingElement
|
|
88
|
-
? await scrollingElement.getContentSize()
|
|
89
|
-
: await driver.getViewportSize();
|
|
271
|
+
else if (utils.types.has(environment, 'androidDeviceInfo')) {
|
|
272
|
+
(_b = (_d = environment.androidDeviceInfo).version) !== null && _b !== void 0 ? _b : (_d.version = driverEnvironment.platformVersion);
|
|
90
273
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
274
|
+
return environment;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async function takeWebScreenshot({ driver, settings, environments, logger, eyes, }) {
|
|
279
|
+
let actualEnvironments = environments;
|
|
280
|
+
if (settings.screenshotMode === 'default') {
|
|
281
|
+
const { localEnvironment, renderEnvironments } = await (0, nml_client_1.getNMLEnvironmentsInfo)({
|
|
282
|
+
environments: environments,
|
|
283
|
+
supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl,
|
|
284
|
+
proxy: eyes.test.eyesServer.proxy,
|
|
285
|
+
logger,
|
|
286
|
+
});
|
|
287
|
+
actualEnvironments = localEnvironment ? [localEnvironment] : renderEnvironments;
|
|
288
|
+
}
|
|
289
|
+
const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
|
|
290
|
+
const screenshots = await (0, take_screenshots_1.takeScreenshots)({
|
|
291
|
+
driver,
|
|
292
|
+
settings: {
|
|
293
|
+
...settings,
|
|
294
|
+
environments: actualEnvironments,
|
|
295
|
+
regionsToCalculate: elementReferences.calculate,
|
|
296
|
+
calculateView: !!settings.pageId,
|
|
297
|
+
domSettings: settings.sendDom ? { proxy: eyes.test.eyesServer.proxy } : undefined,
|
|
298
|
+
},
|
|
299
|
+
logger,
|
|
300
|
+
});
|
|
301
|
+
return screenshots.map(({ calculatedRegions, ...baseTarget }, i) => {
|
|
302
|
+
return {
|
|
303
|
+
baseTarget,
|
|
304
|
+
baseSetting: getBaseCheckSettings({ calculatedRegions }),
|
|
305
|
+
exactEnvironment: actualEnvironments[i],
|
|
306
|
+
};
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
async function takeNMLScreenshot({ driver, settings, environments, logger, eyes, }) {
|
|
310
|
+
const nmlClient = await eyes.core.getNMLClient({
|
|
311
|
+
driver,
|
|
312
|
+
settings: { ...eyes.test.eyesServer, supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl },
|
|
313
|
+
logger,
|
|
314
|
+
});
|
|
315
|
+
if (settings.scrollRootElement || settings.region || (0, to_base_check_settings_1.hasCodedRegions)(settings))
|
|
316
|
+
await nmlClient.preTakeScreenshot({ logger });
|
|
317
|
+
const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
|
|
318
|
+
settings: {
|
|
319
|
+
...settings,
|
|
320
|
+
...(await (0, to_base_check_settings_1.extractMobileElementsIntoCheckSettings)({ settings, driver, logger })),
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
const calculate = elementReferences.calculate;
|
|
324
|
+
const screenshots = await nmlClient.takeScreenshots({
|
|
325
|
+
settings: {
|
|
326
|
+
environments: environments,
|
|
327
|
+
fully: settings.fully,
|
|
328
|
+
stitchMode: settings.stitchMode,
|
|
329
|
+
hideScrollbars: settings.hideScrollbars,
|
|
330
|
+
hideCaret: settings.hideScrollbars,
|
|
331
|
+
overlap: settings.overlap,
|
|
332
|
+
waitBeforeCapture: settings.waitBeforeCapture,
|
|
333
|
+
waitBetweenStitches: settings.waitBetweenStitches,
|
|
334
|
+
lazyLoad: settings.lazyLoad,
|
|
335
|
+
name: settings.name,
|
|
336
|
+
region: elementReferences.target,
|
|
337
|
+
selectorsToFindRegionsFor: calculate.map(({ name }) => name),
|
|
338
|
+
scrollRootElement: elementReferences.scrolling,
|
|
339
|
+
},
|
|
340
|
+
logger,
|
|
341
|
+
});
|
|
342
|
+
return screenshots.map(({ calculateRegions, ...baseTarget }) => {
|
|
343
|
+
const aggregateCalculatedRegions = [];
|
|
344
|
+
calculate.forEach(({ reference }, index) => {
|
|
345
|
+
const regions = calculateRegions === null || calculateRegions === void 0 ? void 0 : calculateRegions[index];
|
|
346
|
+
if (regions) {
|
|
347
|
+
aggregateCalculatedRegions.push({ regions, selector: reference });
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
logger.log(`Regions "${reference}" was not found in the screenshot`);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
return {
|
|
354
|
+
baseTarget: { ...baseTarget, isTransformed: true },
|
|
355
|
+
baseSetting: getBaseCheckSettings({
|
|
356
|
+
calculatedRegions: aggregateCalculatedRegions,
|
|
357
|
+
}),
|
|
358
|
+
exactEnvironment: baseTarget.environment,
|
|
359
|
+
};
|
|
360
|
+
});
|
|
101
361
|
}
|
|
102
|
-
exports.makeCheck = makeCheck;
|
package/dist/classic/core.js
CHANGED
|
@@ -31,13 +31,13 @@ const set_viewport_size_1 = require("../automation/set-viewport-size");
|
|
|
31
31
|
const locate_1 = require("../automation/locate");
|
|
32
32
|
const locate_text_1 = require("../automation/locate-text");
|
|
33
33
|
const extract_text_1 = require("../automation/extract-text");
|
|
34
|
+
const get_nml_client_1 = require("../automation/get-nml-client");
|
|
34
35
|
const open_eyes_1 = require("./open-eyes");
|
|
35
36
|
const utils = __importStar(require("@applitools/utils"));
|
|
36
|
-
function makeCore({ spec, base, agentId = 'core-classic',
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
base !== null && base !== void 0 ? base : (base = (0, core_base_1.makeCore)({ agentId, cwd, logger }));
|
|
37
|
+
function makeCore({ spec, clients, base: defaultBase, concurrency, agentId = 'core-classic', logger: defaultLogger, maskLog, offlineLocationPath, }) {
|
|
38
|
+
const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'core-classic' }, maskLog });
|
|
39
|
+
logger.log(`Core classic is initialized ${defaultBase ? 'with' : 'without'} custom base core`);
|
|
40
|
+
const base = defaultBase !== null && defaultBase !== void 0 ? defaultBase : (0, core_base_1.makeCore)({ agentId, concurrency, logger, offlineLocationPath, maskLog });
|
|
41
41
|
return utils.general.extend(base, core => {
|
|
42
42
|
return {
|
|
43
43
|
type: 'classic',
|
|
@@ -47,6 +47,7 @@ function makeCore({ spec, base, agentId = 'core-classic', cwd = process.cwd(), l
|
|
|
47
47
|
locate: (0, locate_1.makeLocate)({ spec, core, logger }),
|
|
48
48
|
locateText: (0, locate_text_1.makeLocateText)({ spec, core, logger }),
|
|
49
49
|
extractText: (0, extract_text_1.makeExtractText)({ spec, core, logger }),
|
|
50
|
+
...(0, get_nml_client_1.makeGetNMLClient)({ client: clients === null || clients === void 0 ? void 0 : clients.nml, logger }),
|
|
50
51
|
openEyes: (0, open_eyes_1.makeOpenEyes)({ spec, core, logger }),
|
|
51
52
|
};
|
|
52
53
|
});
|
|
@@ -24,16 +24,36 @@ 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 to_environment_key_1 = require("../automation/utils/to-environment-key");
|
|
27
28
|
const utils = __importStar(require("@applitools/utils"));
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const report_kobiton_1 = require("../automation/utils/report-kobiton");
|
|
30
|
+
function makeGetBaseEyes({ settings: defaultSettings, eyes, logger: mainLogger, }) {
|
|
31
|
+
const getBaseEyesWithCache = utils.general.wrap(getBaseEyes, (getBaseEyes, options) => {
|
|
32
|
+
const key = (0, to_environment_key_1.toEnvironmentKey)(options.settings.environment);
|
|
33
|
+
let item = eyes.storage.get(key);
|
|
34
|
+
if (!item) {
|
|
35
|
+
item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
|
|
36
|
+
eyes.storage.set(key, item);
|
|
37
|
+
}
|
|
38
|
+
if (!item.eyes.settled)
|
|
39
|
+
item.eyes.resolve(getBaseEyes(options));
|
|
40
|
+
return item.eyes;
|
|
41
|
+
});
|
|
32
42
|
return getBaseEyesWithCache;
|
|
33
|
-
async function getBaseEyes({ logger =
|
|
43
|
+
async function getBaseEyes({ settings, logger = mainLogger, }) {
|
|
44
|
+
var _a;
|
|
45
|
+
logger = logger.extend(mainLogger);
|
|
34
46
|
logger.log(`Command "getBaseEyes" is called with settings`, settings);
|
|
35
|
-
const baseEyes = await eyes.core.base.openEyes({
|
|
36
|
-
|
|
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;
|
|
37
57
|
}
|
|
38
58
|
}
|
|
39
59
|
exports.makeGetBaseEyes = makeGetBaseEyes;
|
|
@@ -28,69 +28,59 @@ 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("
|
|
32
|
-
const abort_1 = require("
|
|
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_environments_1 = require("./utils/extract-default-environments");
|
|
35
|
+
const abort_controller_1 = require("abort-controller");
|
|
33
36
|
const utils = __importStar(require("@applitools/utils"));
|
|
34
|
-
function makeOpenEyes({ core, spec, logger:
|
|
35
|
-
return async function openEyes({ target, settings,
|
|
36
|
-
var _a, _b, _c
|
|
37
|
-
|
|
38
|
-
logger.log(`Command "openEyes" is called with ${target ? 'default driver
|
|
37
|
+
function makeOpenEyes({ core, spec, logger: mainLogger }) {
|
|
38
|
+
return async function openEyes({ target, settings, storage = new Map(), logger = mainLogger, }) {
|
|
39
|
+
var _a, _b, _c;
|
|
40
|
+
logger = logger.extend(mainLogger);
|
|
41
|
+
logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), storage.size > 0 ? 'and default eyes storage' : '');
|
|
39
42
|
const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
|
|
40
|
-
if (driver &&
|
|
43
|
+
if (driver && storage.size === 0) {
|
|
41
44
|
const environment = await driver.getEnvironment();
|
|
42
|
-
|
|
43
|
-
(_a = settings.environment) !== null && _a !== void 0 ? _a : (settings.environment = {});
|
|
44
|
-
if (environment.isEC) {
|
|
45
|
-
settings.environment.ecSessionId = (await driver.getSessionId());
|
|
46
|
-
}
|
|
47
|
-
if (environment.isWeb) {
|
|
48
|
-
(_b = (_g = settings.environment).userAgent) !== null && _b !== void 0 ? _b : (_g.userAgent = (_c = (await driver.getUserAgentLegacy())) !== null && _c !== void 0 ? _c : undefined);
|
|
49
|
-
}
|
|
50
|
-
if (!settings.environment.deviceName && environment.deviceName) {
|
|
51
|
-
settings.environment.deviceName = environment.deviceName;
|
|
52
|
-
}
|
|
53
|
-
if (!settings.environment.os) {
|
|
54
|
-
if (environment.isNative && environment.platformName) {
|
|
55
|
-
settings.environment.os = environment.platformName;
|
|
56
|
-
if (!settings.keepPlatformNameAsIs) {
|
|
57
|
-
if ((_d = settings.environment.os) === null || _d === void 0 ? void 0 : _d.startsWith('android')) {
|
|
58
|
-
settings.environment.os = `Android${settings.environment.os.slice(7)}`;
|
|
59
|
-
}
|
|
60
|
-
if ((_e = settings.environment.os) === null || _e === void 0 ? void 0 : _e.startsWith('ios')) {
|
|
61
|
-
settings.environment.os = `iOS${settings.environment.os.slice(3)}`;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (environment.platformVersion) {
|
|
65
|
-
settings.environment.os += ` ${environment.platformVersion}`;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else if (environment.isChromium &&
|
|
69
|
-
((environment.isWindows && Number.parseInt(environment.browserVersion) >= 107) ||
|
|
70
|
-
(environment.isMac && Number.parseInt(environment.browserVersion) >= 90))) {
|
|
71
|
-
settings.environment.os = `${environment.platformName} ${(_f = environment.platformVersion) !== null && _f !== void 0 ? _f : ''}`.trim();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (!settings.environment.viewportSize || environment.isMobile) {
|
|
75
|
-
const viewport = await driver.getViewport();
|
|
76
|
-
const size = await driver.getViewportSize();
|
|
77
|
-
settings.environment.viewportSize = utils.geometry.scale(size, viewport.viewportScale);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
45
|
+
if (((_a = settings.environment) === null || _a === void 0 ? void 0 : _a.viewportSize) && !environment.isMobile) {
|
|
80
46
|
await driver.setViewportSize(settings.environment.viewportSize);
|
|
81
47
|
}
|
|
82
|
-
|
|
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
|
+
}
|
|
83
52
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
53
|
+
const environments = await (0, extract_default_environments_1.extractDefaultEnvironments)({ driver, settings });
|
|
54
|
+
const controller = new abort_controller_1.AbortController();
|
|
55
|
+
const { signal } = controller;
|
|
56
|
+
const account = await core.getAccountInfo({ settings, logger });
|
|
57
|
+
return utils.general.extend({}, eyes => {
|
|
58
|
+
var _a, _b, _c, _d;
|
|
59
|
+
return {
|
|
60
|
+
type: 'classic',
|
|
61
|
+
core,
|
|
62
|
+
test: {
|
|
63
|
+
userTestId: settings.userTestId,
|
|
64
|
+
batchId: (_a = settings.batch) === null || _a === void 0 ? void 0 : _a.id,
|
|
65
|
+
batchBuildId: (_b = settings.batch) === null || _b === void 0 ? void 0 : _b.buildId,
|
|
66
|
+
keepBatchOpen: settings.keepBatchOpen,
|
|
67
|
+
eyesServer: account.eyesServer,
|
|
68
|
+
ufgServer: { ...account.ufgServer, ufgServerUrl: (_c = settings.ufgServerUrl) !== null && _c !== void 0 ? _c : (_d = account.ufgServer) === null || _d === void 0 ? void 0 : _d.ufgServerUrl },
|
|
69
|
+
uploadUrl: account.uploadUrl,
|
|
70
|
+
stitchingServiceUrl: account.stitchingServiceUrl,
|
|
71
|
+
supportedEnvironmentsUrl: account.supportedEnvironmentsUrl,
|
|
72
|
+
account,
|
|
73
|
+
},
|
|
74
|
+
running: true,
|
|
75
|
+
storage,
|
|
76
|
+
getBaseEyes: (0, get_base_eyes_1.makeGetBaseEyes)({ settings, eyes, logger }),
|
|
77
|
+
check: (0, check_1.makeCheck)({ eyes, target: driver, environments, spec, signal, logger }),
|
|
78
|
+
checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, target: driver, environments, spec, signal, logger }),
|
|
79
|
+
close: (0, close_1.makeClose)({ eyes, driver, environments, logger }),
|
|
80
|
+
abort: (0, abort_1.makeAbort)({ eyes, driver, environments, controller, logger }),
|
|
81
|
+
getResults: (0, get_results_1.makeGetResults)({ eyes, logger }),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
94
84
|
};
|
|
95
85
|
}
|
|
96
86
|
exports.makeOpenEyes = makeOpenEyes;
|