@applitools/core 1.4.6 → 1.4.8
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/{classic → automation}/extract-text.js +14 -11
- package/dist/automation/get-viewport-size.js +2 -2
- package/dist/{classic → automation}/locate-text.js +5 -6
- package/dist/automation/locate.js +2 -2
- package/dist/automation/set-viewport-size.js +2 -2
- package/dist/automation/utils/take-screenshot.js +2 -2
- package/dist/{utils → automation/utils}/to-base-check-settings.js +3 -2
- package/dist/{utils → automation/utils}/wait-for-lazy-load.js +2 -2
- package/dist/check-and-close.js +7 -5
- package/dist/check.js +4 -5
- package/dist/classic/abort.js +15 -6
- package/dist/classic/check-and-close.js +9 -5
- package/dist/classic/check.js +12 -8
- package/dist/classic/close.js +14 -5
- package/dist/classic/core.js +9 -5
- package/dist/classic/open-eyes.js +17 -19
- package/dist/classic/utils/take-dom-capture.js +35 -54
- package/dist/close.js +1 -25
- package/dist/core.js +9 -5
- package/dist/errors/abort-error.js +5 -1
- package/dist/extract-text.js +13 -17
- package/dist/get-eyes-results.js +18 -0
- package/dist/{close-manager.js → get-manager-results.js} +11 -12
- package/dist/get-typed-eyes.js +5 -6
- package/dist/index.js +3 -3
- package/dist/locate-text.js +33 -7
- package/dist/locate.js +1 -1
- package/dist/make-ec-client.js +1 -9
- package/dist/make-manager.js +8 -33
- package/dist/open-eyes.js +3 -5
- package/dist/troubleshoot/check-network.js +41 -34
- package/dist/troubleshoot/eyes.js +2 -2
- package/dist/troubleshoot/ufg.js +3 -2
- package/dist/troubleshoot/utils.js +1 -25
- package/dist/types.js +0 -1
- package/dist/ufg/abort.js +19 -24
- package/dist/ufg/check-and-close.js +55 -55
- package/dist/ufg/check.js +33 -24
- package/dist/ufg/close.js +25 -18
- package/dist/ufg/core.js +9 -5
- package/dist/ufg/get-base-eyes.js +2 -0
- package/dist/ufg/get-results.js +27 -0
- package/dist/ufg/open-eyes.js +30 -25
- package/dist/ufg/utils/extract-broker-url.js +52 -0
- package/dist/ufg/utils/generate-safe-selectors.js +10 -5
- package/dist/ufg/utils/take-dom-snapshot.js +37 -36
- package/dist/ufg/utils/take-dom-snapshots.js +13 -17
- package/dist/ufg/utils/take-snapshots.js +3 -3
- package/dist/ufg/utils/take-vhses.js +60 -166
- package/dist/utils/format-results.js +37 -37
- package/package.json +19 -36
- package/types/automation/extract-text.d.ts +16 -0
- package/types/automation/get-viewport-size.d.ts +7 -7
- package/types/automation/locate-text.d.ts +15 -0
- package/types/automation/locate.d.ts +8 -8
- package/types/automation/set-viewport-size.d.ts +7 -7
- package/types/automation/types.d.ts +38 -42
- package/types/automation/utils/take-screenshot.d.ts +9 -9
- package/types/automation/utils/to-base-check-settings.d.ts +17 -0
- package/types/{utils → automation/utils}/wait-for-lazy-load.d.ts +3 -3
- package/types/check-and-close.d.ts +11 -13
- package/types/check.d.ts +12 -12
- package/types/classic/abort.d.ts +10 -10
- package/types/classic/check-and-close.d.ts +15 -11
- package/types/classic/check.d.ts +11 -11
- package/types/classic/close.d.ts +10 -10
- package/types/classic/core.d.ts +4 -4
- package/types/classic/get-base-eyes.d.ts +4 -4
- package/types/classic/open-eyes.d.ts +9 -9
- package/types/classic/types.d.ts +7 -7
- package/types/classic/utils/take-dom-capture.d.ts +4 -4
- package/types/close-batch.d.ts +1 -1
- package/types/close.d.ts +9 -8
- package/types/core.d.ts +4 -4
- package/types/delete-test.d.ts +1 -1
- package/types/errors/abort-error.d.ts +3 -2
- package/types/extract-text.d.ts +11 -9
- package/types/get-eyes-results.d.ts +12 -0
- package/types/get-manager-results.d.ts +14 -0
- package/types/get-typed-eyes.d.ts +9 -8
- package/types/index.d.ts +3 -3
- package/types/locate-text.d.ts +11 -9
- package/types/locate.d.ts +9 -9
- package/types/make-ec-client.d.ts +3 -3
- package/types/make-manager.d.ts +12 -12
- package/types/open-eyes.d.ts +13 -13
- package/types/troubleshoot/check-network.d.ts +3 -3
- package/types/troubleshoot/utils.d.ts +0 -2
- package/types/types.d.ts +65 -85
- package/types/ufg/abort.d.ts +14 -18
- package/types/ufg/check-and-close.d.ts +25 -13
- package/types/ufg/check.d.ts +11 -11
- package/types/ufg/close.d.ts +14 -18
- package/types/ufg/core.d.ts +4 -4
- package/types/ufg/get-base-eyes.d.ts +6 -6
- package/types/ufg/get-results.d.ts +16 -0
- package/types/ufg/open-eyes.d.ts +9 -9
- package/types/ufg/types.d.ts +15 -17
- package/types/ufg/utils/extract-broker-url.d.ts +6 -0
- package/types/ufg/utils/generate-safe-selectors.d.ts +14 -10
- package/types/ufg/utils/take-dom-snapshot.d.ts +34 -9
- package/types/ufg/utils/take-dom-snapshots.d.ts +3 -3
- package/types/ufg/utils/take-snapshots.d.ts +4 -4
- package/types/ufg/utils/take-vhses.d.ts +4 -4
- package/types/utils/format-results.d.ts +1 -1
- package/dist/utils/extract-broker-url.js +0 -24
- package/types/classic/extract-text.d.ts +0 -16
- package/types/classic/locate-text.d.ts +0 -15
- package/types/close-manager.d.ts +0 -18
- package/types/utils/extract-broker-url.d.ts +0 -2
- package/types/utils/to-base-check-settings.d.ts +0 -18
|
@@ -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
|
-
|
|
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
|
|
36
|
-
|
|
37
|
-
selector: 'UFG_TriggerArea',
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
43
|
-
|
|
44
|
-
selector:
|
|
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
|
|
25
|
+
serverUrl: settings.serverUrl,
|
|
53
26
|
apiKey: settings.apiKey,
|
|
54
|
-
proxy: settings.proxy
|
|
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
|
|
59
|
-
|
|
60
|
-
selector:
|
|
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
|
|
71
|
-
|
|
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
|
|
82
|
-
|
|
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
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
100
|
+
throw new Error(`unknown mode for android: ${info.mode}`);
|
|
122
101
|
}
|
|
123
|
-
const clear = await
|
|
124
|
-
|
|
125
|
-
selector: 'UFG_ClearArea',
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
}
|
|
@@ -4,13 +4,13 @@ exports.toJsonOutput = exports.toXmlOutput = exports.toFlattenedTAPString = expo
|
|
|
4
4
|
const OK = 'ok';
|
|
5
5
|
const NOT_OK = 'not ok';
|
|
6
6
|
function toFormatterString(results, { includeSubTests = true, markNewAsPassed = false } = {}) {
|
|
7
|
-
|
|
7
|
+
var _a;
|
|
8
|
+
if (results.length === 0)
|
|
8
9
|
return 'No results found.';
|
|
9
|
-
}
|
|
10
10
|
let formattedString = '[EYES: TEST RESULTS]:\n';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const testTitle = `${currentResult.name} [${currentResult.hostDisplaySize.width}x${currentResult.hostDisplaySize.height}]`;
|
|
11
|
+
results.forEach(currentResult => {
|
|
12
|
+
var _a, _b, _c, _d;
|
|
13
|
+
const testTitle = `${currentResult.name} [${(_a = currentResult.hostDisplaySize) === null || _a === void 0 ? void 0 : _a.width}x${(_b = currentResult.hostDisplaySize) === null || _b === void 0 ? void 0 : _b.height}]`;
|
|
14
14
|
let testResult = '';
|
|
15
15
|
if (currentResult.isNew) {
|
|
16
16
|
testResult = markNewAsPassed ? 'Passed' : 'New';
|
|
@@ -19,39 +19,35 @@ function toFormatterString(results, { includeSubTests = true, markNewAsPassed =
|
|
|
19
19
|
testResult = 'Passed';
|
|
20
20
|
}
|
|
21
21
|
else {
|
|
22
|
-
const stepsFailed = currentResult.mismatches + currentResult.missing;
|
|
22
|
+
const stepsFailed = ((_c = currentResult.mismatches) !== null && _c !== void 0 ? _c : 0) + ((_d = currentResult.missing) !== null && _d !== void 0 ? _d : 0);
|
|
23
23
|
testResult = `Failed ${stepsFailed} of ${currentResult.steps}`;
|
|
24
24
|
}
|
|
25
25
|
formattedString += `${testTitle} - ${testResult}\n`;
|
|
26
26
|
if (includeSubTests) {
|
|
27
|
-
if (currentResult.stepsInfo.length > 0) {
|
|
28
|
-
|
|
29
|
-
const currentStep = currentResult.stepsInfo[j];
|
|
27
|
+
if (currentResult.stepsInfo && currentResult.stepsInfo.length > 0) {
|
|
28
|
+
currentResult.stepsInfo.forEach(currentStep => {
|
|
30
29
|
const subTestTitle = currentStep.name;
|
|
31
30
|
const subTestResult = currentStep.isDifferent ? 'Passed' : 'Failed';
|
|
32
31
|
formattedString += `\t> ${subTestTitle} - ${subTestResult}\n`;
|
|
33
|
-
}
|
|
32
|
+
});
|
|
34
33
|
}
|
|
35
34
|
else {
|
|
36
35
|
formattedString += '\tNo steps exist for this test.\n';
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
|
-
}
|
|
40
|
-
formattedString += `See details at ${results[0].appUrls.batch}`;
|
|
38
|
+
});
|
|
39
|
+
formattedString += `See details at ${(_a = results[0].appUrls) === null || _a === void 0 ? void 0 : _a.batch}`;
|
|
41
40
|
return formattedString;
|
|
42
41
|
}
|
|
43
42
|
exports.toFormatterString = toFormatterString;
|
|
44
43
|
function toHierarchicTAPString(results, { includeSubTests = true, markNewAsPassed = false } = {}) {
|
|
45
|
-
if (results.length === 0)
|
|
44
|
+
if (results.length === 0)
|
|
46
45
|
return '';
|
|
47
|
-
}
|
|
48
46
|
let tapString = `1..${results.length}\n`;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const tapIndex = i + 1;
|
|
52
|
-
if (i > 0) {
|
|
47
|
+
results.forEach((currentResult, index) => {
|
|
48
|
+
if (index > 0)
|
|
53
49
|
tapString += '#\n';
|
|
54
|
-
|
|
50
|
+
const tapIndex = index + 1;
|
|
55
51
|
const name = `Test: '${currentResult.name}', Application: '${currentResult.appName}'`;
|
|
56
52
|
if (!currentResult.isDifferent) {
|
|
57
53
|
tapString += `${OK} ${tapIndex} - [PASSED TEST] ${name}\n`;
|
|
@@ -73,24 +69,26 @@ function toHierarchicTAPString(results, { includeSubTests = true, markNewAsPasse
|
|
|
73
69
|
}
|
|
74
70
|
tapString += `#\tMismatches: ${currentResult.mismatches}\n`;
|
|
75
71
|
}
|
|
76
|
-
const url = currentResult.appUrls && currentResult.appUrls.session
|
|
72
|
+
const url = currentResult.appUrls && currentResult.appUrls.session
|
|
73
|
+
? currentResult.appUrls.session
|
|
74
|
+
: "No URL (session didn't start).";
|
|
77
75
|
tapString += `#\tTest url: ${url}\n`;
|
|
78
76
|
tapString += `#\tBrowser: ${currentResult.hostApp}, Viewport: ${currentResult.hostDisplaySize}\n`;
|
|
79
77
|
if (includeSubTests) {
|
|
80
|
-
if (currentResult.stepsInfo.length > 0) {
|
|
78
|
+
if (currentResult.stepsInfo && currentResult.stepsInfo.length > 0) {
|
|
81
79
|
tapString += `\t1..${currentResult.stepsInfo.length}\n`;
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
currentResult.stepsInfo.forEach(currentStep => {
|
|
81
|
+
var _a;
|
|
84
82
|
tapString += '\t';
|
|
85
83
|
tapString += currentStep.isDifferent ? NOT_OK : OK;
|
|
86
|
-
tapString += ` '${currentStep.name}', URL: ${currentStep.appUrls.step}\n`;
|
|
87
|
-
}
|
|
84
|
+
tapString += ` '${currentStep.name}', URL: ${(_a = currentStep.appUrls) === null || _a === void 0 ? void 0 : _a.step}\n`;
|
|
85
|
+
});
|
|
88
86
|
}
|
|
89
87
|
else {
|
|
90
88
|
tapString += '\tNo steps exist for this test.\n';
|
|
91
89
|
}
|
|
92
90
|
}
|
|
93
|
-
}
|
|
91
|
+
});
|
|
94
92
|
return tapString;
|
|
95
93
|
}
|
|
96
94
|
exports.toHierarchicTAPString = toHierarchicTAPString;
|
|
@@ -98,10 +96,9 @@ function toFlattenedTAPString(results, { markNewAsPassed = false } = {}) {
|
|
|
98
96
|
let tapString = '';
|
|
99
97
|
let stepsCounter = 0;
|
|
100
98
|
// We'll add the TAP plan at the beginning, after we calculate the total number of steps.
|
|
101
|
-
|
|
99
|
+
results.forEach((currentResult, index) => {
|
|
102
100
|
tapString += '#\n';
|
|
103
|
-
|
|
104
|
-
const tapIndex = i + 1;
|
|
101
|
+
const tapIndex = index + 1;
|
|
105
102
|
const name = `Test: '${currentResult.name}', Application: '${currentResult.appName}'`;
|
|
106
103
|
if (!currentResult.isDifferent) {
|
|
107
104
|
tapString += `# ${OK} ${tapIndex} - [PASSED TEST] ${name}\n`;
|
|
@@ -123,20 +120,22 @@ function toFlattenedTAPString(results, { markNewAsPassed = false } = {}) {
|
|
|
123
120
|
}
|
|
124
121
|
tapString += `#\tMismatches: ${currentResult.mismatches}\n`;
|
|
125
122
|
}
|
|
126
|
-
const url = currentResult.appUrls && currentResult.appUrls.session
|
|
123
|
+
const url = currentResult.appUrls && currentResult.appUrls.session
|
|
124
|
+
? currentResult.appUrls.session
|
|
125
|
+
: "No URL (session didn't start).";
|
|
127
126
|
tapString += `#\tTest url: ${url}\n`;
|
|
128
|
-
if (currentResult.stepsInfo.length > 0) {
|
|
129
|
-
|
|
127
|
+
if (currentResult.stepsInfo && currentResult.stepsInfo.length > 0) {
|
|
128
|
+
currentResult.stepsInfo.forEach(currentStep => {
|
|
129
|
+
var _a;
|
|
130
130
|
stepsCounter += 1;
|
|
131
|
-
const currentStep = currentResult.stepsInfo[j];
|
|
132
131
|
tapString += currentStep.isDifferent ? NOT_OK : OK;
|
|
133
|
-
tapString += ` ${stepsCounter} '${currentStep.name}', URL: ${currentStep.appUrls.step}\n`;
|
|
134
|
-
}
|
|
132
|
+
tapString += ` ${stepsCounter} '${currentStep.name}', URL: ${(_a = currentStep.appUrls) === null || _a === void 0 ? void 0 : _a.step}\n`;
|
|
133
|
+
});
|
|
135
134
|
}
|
|
136
135
|
else {
|
|
137
136
|
tapString += '#\tNo steps exist for this test.\n';
|
|
138
137
|
}
|
|
139
|
-
}
|
|
138
|
+
});
|
|
140
139
|
if (stepsCounter > 0) {
|
|
141
140
|
tapString = `1..${stepsCounter}\n${tapString}`;
|
|
142
141
|
}
|
|
@@ -148,6 +147,7 @@ function toXmlOutput(results, { totalTime } = {}) {
|
|
|
148
147
|
let output = `<?xml version="1.0" encoding="UTF-8" ?>`;
|
|
149
148
|
output += `\n<testsuite name="${suiteName}" tests="${results.length}" time="${totalTime}">`;
|
|
150
149
|
results.forEach(result => {
|
|
150
|
+
var _a;
|
|
151
151
|
output += `\n<testcase name="${result.name}"${result.duration ? ` time="${result.duration}"` : ''}>`;
|
|
152
152
|
const properties = {};
|
|
153
153
|
if (result.hostOS)
|
|
@@ -165,7 +165,7 @@ function toXmlOutput(results, { totalTime } = {}) {
|
|
|
165
165
|
}
|
|
166
166
|
if (result.isDifferent) {
|
|
167
167
|
output += `\n<failure>`;
|
|
168
|
-
output += `\nDifference found. See ${result.appUrls.batch} for details.`;
|
|
168
|
+
output += `\nDifference found. See ${(_a = result.appUrls) === null || _a === void 0 ? void 0 : _a.batch} for details.`;
|
|
169
169
|
output += `\n</failure>`;
|
|
170
170
|
}
|
|
171
171
|
else if (result.isAborted) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/core",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.8",
|
|
4
4
|
"homepage": "https://applitools.com",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
|
|
@@ -40,74 +40,57 @@
|
|
|
40
40
|
"types"
|
|
41
41
|
],
|
|
42
42
|
"scripts": {
|
|
43
|
-
"lint": "eslint '**/*.ts'",
|
|
44
|
-
"build": "tsc --project ./tsconfig.build.json",
|
|
43
|
+
"lint": "node ../../node_modules/.bin/eslint '**/*.ts'",
|
|
44
|
+
"build": "node ../../node_modules/.bin/tsc --project ./tsconfig.build.json",
|
|
45
45
|
"test": "mocha --no-timeouts -r ts-node/register --parallel --jobs 15 './test/**/*.spec.ts'",
|
|
46
46
|
"test:sanity": "yarn test:unit",
|
|
47
47
|
"test:e2e": "mocha --no-timeouts -r ts-node/register --parallel --jobs 15 './test/e2e/**/*.spec.ts'",
|
|
48
48
|
"test:it": "mocha --no-timeouts -r ts-node/register './test/it/**/*.spec.ts'",
|
|
49
49
|
"test:unit": "mocha --no-timeouts -r ts-node/register './test/unit/**/*.spec.ts'",
|
|
50
50
|
"setup": "yarn docker:setup",
|
|
51
|
-
"docker:setup": "node
|
|
51
|
+
"docker:setup": "node ../../scripts/generate-docker-compose-config.js && docker-compose up -d",
|
|
52
52
|
"docker:teardown": "docker-compose down",
|
|
53
53
|
"deps": "bongo deps",
|
|
54
54
|
"preversion": "bongo preversion",
|
|
55
55
|
"version": "bongo version",
|
|
56
56
|
"postversion": "bongo postversion --skip-release-notification"
|
|
57
57
|
},
|
|
58
|
-
"husky": {
|
|
59
|
-
"hooks": {
|
|
60
|
-
"pre-push": "yarn bongo lint"
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
58
|
"dependencies": {
|
|
64
|
-
"@applitools/core-base": "1.1.
|
|
59
|
+
"@applitools/core-base": "1.1.35",
|
|
65
60
|
"@applitools/dom-capture": "11.2.1",
|
|
66
61
|
"@applitools/dom-snapshot": "4.7.3",
|
|
67
|
-
"@applitools/driver": "1.11.
|
|
68
|
-
"@applitools/logger": "1.1.
|
|
69
|
-
"@applitools/nml-client": "1.3.
|
|
70
|
-
"@applitools/req": "1.1.
|
|
71
|
-
"@applitools/screenshoter": "3.7.
|
|
72
|
-
"@applitools/snippets": "2.4.
|
|
73
|
-
"@applitools/ufg-client": "1.1.
|
|
74
|
-
"@applitools/utils": "1.3.
|
|
62
|
+
"@applitools/driver": "1.11.29",
|
|
63
|
+
"@applitools/logger": "1.1.45",
|
|
64
|
+
"@applitools/nml-client": "1.3.32",
|
|
65
|
+
"@applitools/req": "1.1.30",
|
|
66
|
+
"@applitools/screenshoter": "3.7.25",
|
|
67
|
+
"@applitools/snippets": "2.4.15",
|
|
68
|
+
"@applitools/ufg-client": "1.1.24",
|
|
69
|
+
"@applitools/utils": "1.3.30",
|
|
75
70
|
"abort-controller": "3.0.0",
|
|
76
71
|
"chalk": "4.1.2",
|
|
77
72
|
"node-fetch": "2.6.7",
|
|
78
73
|
"throat": "6.0.1"
|
|
79
74
|
},
|
|
80
75
|
"optionalDependencies": {
|
|
81
|
-
"@applitools/ec-client": "
|
|
76
|
+
"@applitools/ec-client": "1.2.6"
|
|
82
77
|
},
|
|
83
78
|
"devDependencies": {
|
|
84
79
|
"@applitools/bongo": "^2.2.2",
|
|
85
|
-
"@applitools/
|
|
86
|
-
"@applitools/spec-driver-
|
|
87
|
-
"@applitools/spec-driver-
|
|
88
|
-
"@applitools/
|
|
89
|
-
"@applitools/test-
|
|
90
|
-
"@applitools/test-utils": "^1.5.10",
|
|
80
|
+
"@applitools/spec-driver-puppeteer": "^1.1.40",
|
|
81
|
+
"@applitools/spec-driver-selenium": "^1.5.27",
|
|
82
|
+
"@applitools/spec-driver-webdriverio": "^1.4.24",
|
|
83
|
+
"@applitools/test-server": "^1.1.24",
|
|
84
|
+
"@applitools/test-utils": "^1.5.12",
|
|
91
85
|
"@types/mocha": "^9.1.1",
|
|
92
86
|
"@types/node": "12",
|
|
93
87
|
"@types/selenium-webdriver": "^4.1.2",
|
|
94
|
-
"@typescript-eslint/eslint-plugin": "^5.38.0",
|
|
95
|
-
"@typescript-eslint/parser": "^5.38.0",
|
|
96
88
|
"chromedriver": "^106.0.0",
|
|
97
|
-
"eslint": "^8.23.1",
|
|
98
|
-
"eslint-config-prettier": "^8.5.0",
|
|
99
|
-
"eslint-plugin-no-only-tests": "^3.0.0",
|
|
100
|
-
"eslint-plugin-node": "^11.1.0",
|
|
101
|
-
"eslint-plugin-prettier": "^4.0.0",
|
|
102
|
-
"husky": "^4.3.7",
|
|
103
89
|
"mocha": "^10.0.0",
|
|
104
90
|
"nock": "^13.2.8",
|
|
105
91
|
"png-async": "^0.9.4",
|
|
106
|
-
"prettier": "^2.6.2",
|
|
107
92
|
"puppeteer": "^16.2.0",
|
|
108
93
|
"selenium-webdriver": "4.4",
|
|
109
|
-
"ts-node": "^10.7.0",
|
|
110
|
-
"typescript": "^4.9.4",
|
|
111
94
|
"webdriverio": "^7.25.0"
|
|
112
95
|
},
|
|
113
96
|
"engines": {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MaybeArray } from '@applitools/utils';
|
|
2
|
+
import type { DriverTarget, ImageTarget, ExtractTextSettings } from '../classic/types';
|
|
3
|
+
import type { Core as BaseCore } from '@applitools/core-base';
|
|
4
|
+
import { type Logger } from '@applitools/logger';
|
|
5
|
+
import { type SpecType, type SpecDriver } from '@applitools/driver';
|
|
6
|
+
type Options<TSpec extends SpecType> = {
|
|
7
|
+
core: BaseCore;
|
|
8
|
+
spec?: SpecDriver<TSpec>;
|
|
9
|
+
logger: Logger;
|
|
10
|
+
};
|
|
11
|
+
export declare function makeExtractText<TSpec extends SpecType>({ core, spec, logger: defaultLogger }: Options<TSpec>): ({ target, settings, logger, }: {
|
|
12
|
+
target: DriverTarget<TSpec> | ImageTarget;
|
|
13
|
+
settings: MaybeArray<ExtractTextSettings<TSpec>>;
|
|
14
|
+
logger?: Logger | undefined;
|
|
15
|
+
}) => Promise<string[]>;
|
|
16
|
+
export {};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { DriverTarget } from './types';
|
|
2
2
|
import { type Logger } from '@applitools/logger';
|
|
3
|
-
import { type SpecDriver } from '@applitools/driver';
|
|
4
|
-
type Options<
|
|
5
|
-
spec: SpecDriver<
|
|
6
|
-
logger
|
|
3
|
+
import { type SpecType, type SpecDriver } from '@applitools/driver';
|
|
4
|
+
type Options<TSpec extends SpecType> = {
|
|
5
|
+
spec: SpecDriver<TSpec>;
|
|
6
|
+
logger: Logger;
|
|
7
7
|
};
|
|
8
|
-
export declare function makeGetViewportSize<
|
|
9
|
-
target: DriverTarget<
|
|
10
|
-
logger?: Logger;
|
|
8
|
+
export declare function makeGetViewportSize<TSpec extends SpecType>({ spec, logger: defaultLogger }: Options<TSpec>): ({ target, logger, }: {
|
|
9
|
+
target: DriverTarget<TSpec>;
|
|
10
|
+
logger?: Logger | undefined;
|
|
11
11
|
}) => Promise<import("@applitools/utils").Size>;
|
|
12
12
|
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DriverTarget, ImageTarget, LocateTextSettings, LocateTextResult } from './types';
|
|
2
|
+
import type { Core as BaseCore } from '@applitools/core-base';
|
|
3
|
+
import { type Logger } from '@applitools/logger';
|
|
4
|
+
import { type SpecType, type SpecDriver } from '@applitools/driver';
|
|
5
|
+
type Options<TSpec extends SpecType> = {
|
|
6
|
+
core: BaseCore;
|
|
7
|
+
spec?: SpecDriver<TSpec>;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
};
|
|
10
|
+
export declare function makeLocateText<TSpec extends SpecType>({ core, spec, logger: defaultLogger }: Options<TSpec>): <TPattern extends string>({ target, settings, logger, }: {
|
|
11
|
+
target: DriverTarget<TSpec> | ImageTarget;
|
|
12
|
+
settings: LocateTextSettings<TPattern, TSpec>;
|
|
13
|
+
logger?: Logger | undefined;
|
|
14
|
+
}) => Promise<LocateTextResult<TPattern>>;
|
|
15
|
+
export {};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { DriverTarget, ImageTarget, LocateSettings, LocateResult } from './types';
|
|
2
2
|
import type { Core as BaseCore } from '@applitools/core-base';
|
|
3
3
|
import { type Logger } from '@applitools/logger';
|
|
4
|
-
import { type SpecDriver } from '@applitools/driver';
|
|
5
|
-
type Options<
|
|
4
|
+
import { type SpecType, type SpecDriver } from '@applitools/driver';
|
|
5
|
+
type Options<TSpec extends SpecType> = {
|
|
6
6
|
core: BaseCore;
|
|
7
|
-
spec
|
|
8
|
-
logger
|
|
7
|
+
spec?: SpecDriver<TSpec>;
|
|
8
|
+
logger: Logger;
|
|
9
9
|
};
|
|
10
|
-
export declare function makeLocate<
|
|
11
|
-
target: DriverTarget<
|
|
12
|
-
settings: LocateSettings<TLocator,
|
|
13
|
-
logger?: Logger;
|
|
10
|
+
export declare function makeLocate<TSpec extends SpecType>({ spec, core, logger: defaultLogger }: Options<TSpec>): <TLocator extends string>({ settings, target, logger, }: {
|
|
11
|
+
target: DriverTarget<TSpec> | ImageTarget;
|
|
12
|
+
settings: LocateSettings<TLocator, TSpec>;
|
|
13
|
+
logger?: Logger | undefined;
|
|
14
14
|
}) => Promise<LocateResult<TLocator>>;
|
|
15
15
|
export {};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { Size } from '@applitools/utils';
|
|
2
2
|
import type { DriverTarget } from './types';
|
|
3
3
|
import { type Logger } from '@applitools/logger';
|
|
4
|
-
import { type SpecDriver } from '@applitools/driver';
|
|
5
|
-
type Options<
|
|
6
|
-
spec: SpecDriver<
|
|
7
|
-
logger
|
|
4
|
+
import { type SpecType, type SpecDriver } from '@applitools/driver';
|
|
5
|
+
type Options<TSpec extends SpecType> = {
|
|
6
|
+
spec: SpecDriver<TSpec>;
|
|
7
|
+
logger: Logger;
|
|
8
8
|
};
|
|
9
|
-
export declare function makeSetViewportSize<
|
|
10
|
-
target: DriverTarget<
|
|
9
|
+
export declare function makeSetViewportSize<TSpec extends SpecType>({ spec, logger: defaultLogger }: Options<TSpec>): ({ target, size, logger, }: {
|
|
10
|
+
target: DriverTarget<TSpec>;
|
|
11
11
|
size: Size;
|
|
12
|
-
logger?: Logger;
|
|
12
|
+
logger?: Logger | undefined;
|
|
13
13
|
}) => Promise<void>;
|
|
14
14
|
export {};
|