@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 CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 3.2.0 - 2023/5/31
6
+
7
+ ### Features
8
+ - Drop support of legacy vhs extraction
9
+ ### Bug fixes
10
+ - Fixed issue when logs are not show up
11
+
5
12
  ## 3.1.0 - 2023/5/22
6
13
 
7
14
  ### Features
@@ -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
- if (nmlClient) {
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
- if (nmlClient) {
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
- return null;
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.1.0",
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.55",
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.0",
85
- "@applitools/ec-client": "1.2.31",
86
- "@applitools/logger": "2.0.1",
87
- "@applitools/nml-client": "1.3.54",
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.45",
89
+ "@applitools/screenshoter": "3.7.46",
90
90
  "@applitools/snippets": "2.4.21",
91
- "@applitools/socket": "1.1.0",
92
- "@applitools/spec-driver-webdriver": "1.0.32",
93
- "@applitools/ufg-client": "1.2.16",
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": "^3.0.4",
104
+ "@applitools/bongo": "^4.0.0",
105
105
  "@applitools/sdk-coverage-tests": "^3.0.2",
106
- "@applitools/spec-driver-puppeteer": "^1.1.63",
107
- "@applitools/spec-driver-selenium": "^1.5.46",
108
- "@applitools/spec-driver-webdriverio": "^1.5.1",
109
- "@applitools/test-server": "^1.2.1",
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 | null>) & {
13
- getCachedValues(): Promise<NMLClient | null>[];
14
- setCachedValue(key: any, value: Promise<NMLClient | null>): void;
12
+ }) => Promise<NMLClient>) & {
13
+ getCachedValues(): Promise<NMLClient>[];
14
+ setCachedValue(key: any, value: Promise<NMLClient>): void;
15
15
  clearCache(): void;
16
16
  };
17
17
  export {};
@@ -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 | null>;
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[]>;