@applitools/core 3.1.0 → 3.2.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 +7 -0
- package/dist/ufg/check-and-close.js +3 -7
- package/dist/ufg/check.js +3 -7
- package/dist/ufg/get-nml-client.js +1 -1
- package/package.json +15 -15
- package/types/ufg/get-nml-client.d.ts +3 -3
- package/types/ufg/types.d.ts +1 -1
- package/dist/ufg/utils/take-vhses.js +0 -153
- package/types/ufg/utils/take-vhses.d.ts +0 -17
package/CHANGELOG.md
CHANGED
|
@@ -29,7 +29,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.makeCheckAndClose = void 0;
|
|
30
30
|
const driver_1 = require("@applitools/driver");
|
|
31
31
|
const take_dom_snapshots_1 = require("./utils/take-dom-snapshots");
|
|
32
|
-
const take_vhses_1 = require("./utils/take-vhses");
|
|
33
32
|
const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
|
|
34
33
|
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
35
34
|
const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
|
|
@@ -137,12 +136,7 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
|
|
|
137
136
|
}
|
|
138
137
|
else {
|
|
139
138
|
const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.server, driver, logger });
|
|
140
|
-
|
|
141
|
-
snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
snapshots = await (0, take_vhses_1.takeVHSes)({ driver, ...snapshotOptions, logger });
|
|
145
|
-
}
|
|
139
|
+
snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
|
|
146
140
|
}
|
|
147
141
|
await currentContext.focus();
|
|
148
142
|
snapshotUrl = await driver.getUrl();
|
|
@@ -244,12 +238,14 @@ function makeCheckAndClose({ eyes, target: defaultTarget, spec, signal, logger:
|
|
|
244
238
|
return { ...result, userTestId: eyes.test.userTestId, eyes: baseEyes, renderer };
|
|
245
239
|
}
|
|
246
240
|
catch (error) {
|
|
241
|
+
rendererLogger.error(`Renderer with id ${baseEyes.test.rendererId} failed due to an error`, error);
|
|
247
242
|
await baseEyes.abort({ logger: rendererLogger });
|
|
248
243
|
error.info = { eyes: baseEyes };
|
|
249
244
|
throw error;
|
|
250
245
|
}
|
|
251
246
|
}
|
|
252
247
|
catch (error) {
|
|
248
|
+
rendererLogger.error(`Renderer with id ${renderer.id} failed before rendering started due to an error`, error);
|
|
253
249
|
error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer };
|
|
254
250
|
throw error;
|
|
255
251
|
}
|
package/dist/ufg/check.js
CHANGED
|
@@ -29,7 +29,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.makeCheck = void 0;
|
|
30
30
|
const driver_1 = require("@applitools/driver");
|
|
31
31
|
const take_dom_snapshots_1 = require("./utils/take-dom-snapshots");
|
|
32
|
-
const take_vhses_1 = require("./utils/take-vhses");
|
|
33
32
|
const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
|
|
34
33
|
const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
|
|
35
34
|
const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
|
|
@@ -138,12 +137,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: mainLogg
|
|
|
138
137
|
}
|
|
139
138
|
else {
|
|
140
139
|
const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.server, driver, logger });
|
|
141
|
-
|
|
142
|
-
snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
snapshots = await (0, take_vhses_1.takeVHSes)({ driver, ...snapshotOptions, logger });
|
|
146
|
-
}
|
|
140
|
+
snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
|
|
147
141
|
}
|
|
148
142
|
await currentContext.focus();
|
|
149
143
|
snapshotUrl = await driver.getUrl();
|
|
@@ -249,6 +243,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: mainLogg
|
|
|
249
243
|
return { ...result, eyes: baseEyes, renderer };
|
|
250
244
|
}
|
|
251
245
|
catch (error) {
|
|
246
|
+
rendererLogger.error(`Renderer with id ${baseEyes.test.rendererId} failed due to an error`, error);
|
|
252
247
|
if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
|
|
253
248
|
await baseEyes.abort({ logger: rendererLogger });
|
|
254
249
|
error.info = { eyes: baseEyes };
|
|
@@ -256,6 +251,7 @@ function makeCheck({ eyes, target: defaultTarget, spec, signal, logger: mainLogg
|
|
|
256
251
|
}
|
|
257
252
|
}
|
|
258
253
|
catch (error) {
|
|
254
|
+
rendererLogger.error(`Renderer with id ${renderer.id} failed before rendering started due to an error`, error);
|
|
259
255
|
error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer };
|
|
260
256
|
throw error;
|
|
261
257
|
}
|
|
@@ -35,7 +35,7 @@ function makeGetNMLClient({ client, logger: mainLogger }) {
|
|
|
35
35
|
logger = logger.extend(mainLogger);
|
|
36
36
|
const brokerUrl = await driver.extractBrokerUrl();
|
|
37
37
|
if (!brokerUrl)
|
|
38
|
-
|
|
38
|
+
throw new Error('Unable to extract broker url from the device');
|
|
39
39
|
return (0, nml_client_1.makeNMLClient)({ config: { brokerUrl, ...config }, logger });
|
|
40
40
|
}
|
|
41
41
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/core",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"homepage": "https://applitools.com",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
|
|
@@ -78,19 +78,19 @@
|
|
|
78
78
|
]
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@applitools/core-base": "1.1.
|
|
81
|
+
"@applitools/core-base": "1.1.56",
|
|
82
82
|
"@applitools/dom-capture": "11.2.2",
|
|
83
83
|
"@applitools/dom-snapshot": "4.7.9",
|
|
84
|
-
"@applitools/driver": "1.12.
|
|
85
|
-
"@applitools/ec-client": "1.2.
|
|
86
|
-
"@applitools/logger": "2.0.
|
|
87
|
-
"@applitools/nml-client": "1.3.
|
|
84
|
+
"@applitools/driver": "1.12.1",
|
|
85
|
+
"@applitools/ec-client": "1.2.32",
|
|
86
|
+
"@applitools/logger": "2.0.2",
|
|
87
|
+
"@applitools/nml-client": "1.3.55",
|
|
88
88
|
"@applitools/req": "1.3.0",
|
|
89
|
-
"@applitools/screenshoter": "3.7.
|
|
89
|
+
"@applitools/screenshoter": "3.7.46",
|
|
90
90
|
"@applitools/snippets": "2.4.21",
|
|
91
|
-
"@applitools/socket": "1.1.
|
|
92
|
-
"@applitools/spec-driver-webdriver": "1.0.
|
|
93
|
-
"@applitools/ufg-client": "1.2.
|
|
91
|
+
"@applitools/socket": "1.1.1",
|
|
92
|
+
"@applitools/spec-driver-webdriver": "1.0.33",
|
|
93
|
+
"@applitools/ufg-client": "1.2.17",
|
|
94
94
|
"@applitools/utils": "1.3.37",
|
|
95
95
|
"@types/ws": "8.5.4",
|
|
96
96
|
"abort-controller": "3.0.0",
|
|
@@ -101,12 +101,12 @@
|
|
|
101
101
|
"yargs": "17.6.2"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
|
-
"@applitools/bongo": "^
|
|
104
|
+
"@applitools/bongo": "^4.0.0",
|
|
105
105
|
"@applitools/sdk-coverage-tests": "^3.0.2",
|
|
106
|
-
"@applitools/spec-driver-puppeteer": "^1.1.
|
|
107
|
-
"@applitools/spec-driver-selenium": "^1.5.
|
|
108
|
-
"@applitools/spec-driver-webdriverio": "^1.5.
|
|
109
|
-
"@applitools/test-server": "^1.2.
|
|
106
|
+
"@applitools/spec-driver-puppeteer": "^1.1.64",
|
|
107
|
+
"@applitools/spec-driver-selenium": "^1.5.47",
|
|
108
|
+
"@applitools/spec-driver-webdriverio": "^1.5.2",
|
|
109
|
+
"@applitools/test-server": "^1.2.2",
|
|
110
110
|
"@applitools/test-utils": "^1.5.17",
|
|
111
111
|
"@types/node": "^12.20.55",
|
|
112
112
|
"@types/selenium-webdriver": "^4.1.2",
|
|
@@ -9,9 +9,9 @@ export declare function makeGetNMLClient({ client, logger: mainLogger }: Options
|
|
|
9
9
|
driver: Driver<SpecType>;
|
|
10
10
|
config: Omit<NMLRequestsConfig, 'brokerUrl'>;
|
|
11
11
|
logger?: Logger | undefined;
|
|
12
|
-
}) => Promise<NMLClient
|
|
13
|
-
getCachedValues(): Promise<NMLClient
|
|
14
|
-
setCachedValue(key: any, value: Promise<NMLClient
|
|
12
|
+
}) => Promise<NMLClient>) & {
|
|
13
|
+
getCachedValues(): Promise<NMLClient>[];
|
|
14
|
+
setCachedValue(key: any, value: Promise<NMLClient>): void;
|
|
15
15
|
clearCache(): void;
|
|
16
16
|
};
|
|
17
17
|
export {};
|
package/types/ufg/types.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface Core<TSpec extends SpecType> extends AutomationCore.Core<TSpec>
|
|
|
20
20
|
config: Omit<NMLRequestsConfig, 'brokerUrl'>;
|
|
21
21
|
driver: Driver<TSpec>;
|
|
22
22
|
logger?: Logger;
|
|
23
|
-
}): Promise<NMLClient
|
|
23
|
+
}): Promise<NMLClient>;
|
|
24
24
|
openEyes(options: {
|
|
25
25
|
target?: AutomationCore.DriverTarget<TSpec>;
|
|
26
26
|
settings: AutomationCore.OpenSettings;
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.takeVHSes = void 0;
|
|
4
|
-
async function takeVHSes({ driver, settings, hooks, logger, }) {
|
|
5
|
-
var _a;
|
|
6
|
-
logger.log('taking VHS');
|
|
7
|
-
const environment = await driver.getEnvironment();
|
|
8
|
-
if (!environment.isAndroid && !environment.isIOS) {
|
|
9
|
-
throw new Error('cannot take VHS on mobile device other than iOS or Android');
|
|
10
|
-
}
|
|
11
|
-
await ((_a = hooks === null || hooks === void 0 ? void 0 : hooks.beforeSnapshots) === null || _a === void 0 ? void 0 : _a.call(hooks));
|
|
12
|
-
const trigger = await driver.waitFor(environment.isAndroid
|
|
13
|
-
? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_TriggerArea"]` }
|
|
14
|
-
: { type: 'accessibility id', selector: 'UFG_TriggerArea' }, { timeout: 30000 });
|
|
15
|
-
if (!trigger)
|
|
16
|
-
throw new Error('Trigger element could not be found');
|
|
17
|
-
if (environment.isAndroid) {
|
|
18
|
-
const apiKeyInput = await driver.element({
|
|
19
|
-
type: 'xpath',
|
|
20
|
-
selector: `//android.widget.EditText[@content-desc="UFG_Apikey"]`,
|
|
21
|
-
});
|
|
22
|
-
if (apiKeyInput) {
|
|
23
|
-
// in case 'apiKeyInput' does not exist, it means it was already triggered on previous cycle
|
|
24
|
-
// this condition is to avoid re-sending 'inputJson' multiple times
|
|
25
|
-
const inputString = JSON.stringify({
|
|
26
|
-
serverUrl: settings.serverUrl,
|
|
27
|
-
apiKey: settings.apiKey,
|
|
28
|
-
proxy: settings.proxy && transformProxy(settings.proxy),
|
|
29
|
-
});
|
|
30
|
-
logger.log('sending API key to UFG lib', inputString);
|
|
31
|
-
await apiKeyInput.type(inputString);
|
|
32
|
-
const ready = await driver.element({
|
|
33
|
-
type: 'xpath',
|
|
34
|
-
selector: `//android.widget.Button[@content-desc="UFG_ApikeyReady"]`,
|
|
35
|
-
});
|
|
36
|
-
if (!ready)
|
|
37
|
-
throw new Error('Api key readiness element could not be found');
|
|
38
|
-
await ready.click();
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
logger.log('UFG_Apikey was skipped');
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
await trigger.click(); // TODO handle stale element exception and then find the trigger again and click it
|
|
45
|
-
let label = await driver.waitFor(environment.isAndroid
|
|
46
|
-
? { type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_SecondaryLabel"]` }
|
|
47
|
-
: { type: 'accessibility id', selector: 'UFG_SecondaryLabel' }, { timeout: 10000 });
|
|
48
|
-
if (!label) {
|
|
49
|
-
// 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.
|
|
50
|
-
// 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
|
|
51
|
-
logger.log('UFG_SecondaryLabel was not found after 10 seconds, trying to click UFG_TriggerArea again');
|
|
52
|
-
const triggerRetry = await driver.waitFor(environment.isAndroid
|
|
53
|
-
? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_TriggerArea"]` }
|
|
54
|
-
: { type: 'accessibility id', selector: 'UFG_TriggerArea' }, { timeout: 30000 });
|
|
55
|
-
if (triggerRetry) {
|
|
56
|
-
logger.log('UFG_TriggerArea was found on retry. clicking it.');
|
|
57
|
-
await triggerRetry.click();
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
logger.log('UFG_TriggerArea was NOT found on retry. Probably VHS is being taken.');
|
|
61
|
-
}
|
|
62
|
-
label = await driver.waitFor(environment.isAndroid
|
|
63
|
-
? { type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_SecondaryLabel"]` }
|
|
64
|
-
: { type: 'accessibility id', selector: 'UFG_SecondaryLabel' }, { timeout: 50000 });
|
|
65
|
-
if (!label) {
|
|
66
|
-
logger.log('UFG_SecondaryLabel was not found eventually. Giving up.');
|
|
67
|
-
throw new Error('Secondary label element could not be found');
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
const info = JSON.parse(await label.getText());
|
|
71
|
-
logger.log('VHS info', info);
|
|
72
|
-
if (info.error)
|
|
73
|
-
throw new Error(`Error while taking VHS - ${info.error}`);
|
|
74
|
-
let vhs = '';
|
|
75
|
-
if (environment.isIOS) {
|
|
76
|
-
const label = await driver.element({ type: 'accessibility id', selector: 'UFG_Label' });
|
|
77
|
-
if (!label)
|
|
78
|
-
throw new Error('VHS label element could not be found');
|
|
79
|
-
vhs = await label.getText();
|
|
80
|
-
}
|
|
81
|
-
else if (info.mode === 'labels') {
|
|
82
|
-
const labels = [
|
|
83
|
-
await driver.element({ type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_Label_0"]` }),
|
|
84
|
-
await driver.element({ type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_Label_1"]` }),
|
|
85
|
-
await driver.element({ type: 'xpath', selector: `//android.widget.TextView[@content-desc="UFG_Label_2"]` }),
|
|
86
|
-
];
|
|
87
|
-
if (labels.some(label => !label))
|
|
88
|
-
throw new Error('VHS label element could not be found');
|
|
89
|
-
for (let chunk = 0; chunk < info.partsCount / labels.length; ++chunk) {
|
|
90
|
-
for (let label = 0; label < Math.min(labels.length, info.partsCount - chunk * labels.length); ++label) {
|
|
91
|
-
vhs += await labels[label].getText();
|
|
92
|
-
}
|
|
93
|
-
if (chunk * labels.length < info.partsCount)
|
|
94
|
-
await trigger.click();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else if (info.mode === 'network') {
|
|
98
|
-
// do nothing
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
throw new Error(`unknown mode for android: ${info.mode}`);
|
|
102
|
-
}
|
|
103
|
-
const clear = await driver.waitFor(environment.isAndroid
|
|
104
|
-
? { type: 'xpath', selector: `//android.widget.Button[@content-desc="UFG_ClearArea"]` }
|
|
105
|
-
: { type: 'accessibility id', selector: 'UFG_ClearArea' }, { timeout: 30000 });
|
|
106
|
-
if (!clear)
|
|
107
|
-
throw new Error('Clear element could not be found');
|
|
108
|
-
await clear.click();
|
|
109
|
-
let snapshot;
|
|
110
|
-
if (environment.isAndroid) {
|
|
111
|
-
snapshot = {
|
|
112
|
-
platformName: 'android',
|
|
113
|
-
vhsType: info.flavorName,
|
|
114
|
-
vhsHash: {
|
|
115
|
-
hashFormat: 'sha256',
|
|
116
|
-
hash: info.vhsHash,
|
|
117
|
-
contentType: `x-applitools-vhs/${info.flavorName}`,
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
snapshot = {
|
|
123
|
-
platformName: 'ios',
|
|
124
|
-
resourceContents: {
|
|
125
|
-
vhs: {
|
|
126
|
-
value: Buffer.from(vhs, 'base64'),
|
|
127
|
-
type: 'x-applitools-vhs/ios',
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
vhsCompatibilityParams: {
|
|
131
|
-
UIKitLinkTimeVersionNumber: info.UIKitLinkTimeVersionNumber,
|
|
132
|
-
UIKitRunTimeVersionNumber: info.UIKitRunTimeVersionNumber,
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
return Array(settings.renderers.length).fill(snapshot);
|
|
137
|
-
}
|
|
138
|
-
exports.takeVHSes = takeVHSes;
|
|
139
|
-
function transformProxy(proxy) {
|
|
140
|
-
const url = new URL(proxy.url);
|
|
141
|
-
const transformedProxy = {
|
|
142
|
-
protocol: url.protocol,
|
|
143
|
-
host: url.hostname,
|
|
144
|
-
port: url.port,
|
|
145
|
-
};
|
|
146
|
-
if (proxy.username) {
|
|
147
|
-
transformedProxy.auth = { username: proxy.username, password: proxy.password };
|
|
148
|
-
}
|
|
149
|
-
else if (url.username) {
|
|
150
|
-
transformedProxy.auth = { username: url.username, password: proxy.password };
|
|
151
|
-
}
|
|
152
|
-
return transformedProxy;
|
|
153
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { ServerSettings } from '../types';
|
|
2
|
-
import { type Logger } from '@applitools/logger';
|
|
3
|
-
import { type SpecType, type Driver } from '@applitools/driver';
|
|
4
|
-
import { type Renderer, type AndroidSnapshot, type IOSSnapshot } from '@applitools/ufg-client';
|
|
5
|
-
export type VHSesSettings = ServerSettings & {
|
|
6
|
-
renderers: Renderer[];
|
|
7
|
-
waitBeforeCapture?: number;
|
|
8
|
-
};
|
|
9
|
-
export declare function takeVHSes<TSpec extends SpecType>({ driver, settings, hooks, logger, }: {
|
|
10
|
-
driver: Driver<TSpec>;
|
|
11
|
-
settings: VHSesSettings;
|
|
12
|
-
hooks?: {
|
|
13
|
-
beforeSnapshots?(): void | Promise<void>;
|
|
14
|
-
beforeEachSnapshot?(): void | Promise<void>;
|
|
15
|
-
};
|
|
16
|
-
logger: Logger;
|
|
17
|
-
}): Promise<AndroidSnapshot[] | IOSSnapshot[]>;
|