@wdio/browserstack-service 8.44.1 → 8.46.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/build/accessibility-handler.d.ts +9 -2
- package/build/accessibility-handler.d.ts.map +1 -1
- package/build/accessibility-handler.js +61 -11
- package/build/config.d.ts +1 -1
- package/build/config.d.ts.map +1 -1
- package/build/config.js +1 -1
- package/build/insights-handler.d.ts +6 -0
- package/build/insights-handler.d.ts.map +1 -1
- package/build/insights-handler.js +28 -0
- package/build/launcher.d.ts.map +1 -1
- package/build/launcher.js +69 -7
- package/build/scripts/accessibility-scripts.d.ts +4 -0
- package/build/scripts/accessibility-scripts.d.ts.map +1 -1
- package/build/scripts/accessibility-scripts.js +6 -1
- package/build/service.d.ts +2 -0
- package/build/service.d.ts.map +1 -1
- package/build/service.js +116 -21
- package/build/testHub/utils.d.ts +3 -0
- package/build/testHub/utils.d.ts.map +1 -1
- package/build/testHub/utils.js +9 -0
- package/build/types.d.ts +7 -0
- package/build/types.d.ts.map +1 -1
- package/build/util.d.ts +7 -3
- package/build/util.d.ts.map +1 -1
- package/build/util.js +70 -21
- package/package.json +4 -4
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Capabilities, Frameworks } from '@wdio/types';
|
|
1
|
+
import type { Capabilities, Frameworks, Options } from '@wdio/types';
|
|
2
|
+
import type { BrowserstackConfig, BrowserstackOptions } from './types.js';
|
|
2
3
|
import type { ITestCaseHookParameter } from './cucumber-types.js';
|
|
3
4
|
declare class _AccessibilityHandler {
|
|
4
5
|
private _browser;
|
|
@@ -11,12 +12,17 @@ declare class _AccessibilityHandler {
|
|
|
11
12
|
private _caps;
|
|
12
13
|
private _suiteFile?;
|
|
13
14
|
private _accessibility?;
|
|
15
|
+
private _turboscale?;
|
|
16
|
+
private _options;
|
|
17
|
+
private _config;
|
|
14
18
|
private _accessibilityOptions?;
|
|
19
|
+
private _autoScanning;
|
|
20
|
+
private _testIdentifier;
|
|
15
21
|
private _testMetadata;
|
|
16
22
|
private static _a11yScanSessionMap;
|
|
17
23
|
private _sessionId;
|
|
18
24
|
private listener;
|
|
19
|
-
constructor(_browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, _capabilities: Capabilities.RemoteCapability, isAppAutomate: boolean, _framework?: string | undefined, _accessibilityAutomation?: (boolean | string) | undefined, _accessibilityOpts?: {
|
|
25
|
+
constructor(_browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, _capabilities: Capabilities.RemoteCapability, _options: BrowserstackConfig & BrowserstackOptions, isAppAutomate: boolean, _config: Options.Testrunner, _framework?: string | undefined, _accessibilityAutomation?: (boolean | string) | undefined, _turboscale?: boolean | string, _accessibilityOpts?: {
|
|
20
26
|
[key: string]: any;
|
|
21
27
|
} | undefined);
|
|
22
28
|
setSuiteFile(filename: string): void;
|
|
@@ -35,6 +41,7 @@ declare class _AccessibilityHandler {
|
|
|
35
41
|
private shouldRunTestHooks;
|
|
36
42
|
private checkIfPageOpened;
|
|
37
43
|
private static shouldPatchExecuteScript;
|
|
44
|
+
private _setAnnotation;
|
|
38
45
|
}
|
|
39
46
|
declare const AccessibilityHandler: typeof _AccessibilityHandler;
|
|
40
47
|
type AccessibilityHandler = _AccessibilityHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility-handler.d.ts","sourceRoot":"","sources":["../src/accessibility-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"accessibility-handler.d.ts","sourceRoot":"","sources":["../src/accessibility-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AA8BjE,cAAM,qBAAqB;IAiBnB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,wBAAwB,CAAC;IAEjC,OAAO,CAAC,kBAAkB,CAAC;IAxB/B,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,qBAAqB,CAAC,CAAyB;IACvD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAA8B;IAChE,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAAyB;gBAG7B,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB,EAC9D,aAAa,EAAE,YAAY,CAAC,gBAAgB,EACpD,QAAQ,EAAG,kBAAkB,GAAG,mBAAmB,EAC3C,aAAa,EAAE,OAAO,EAC9B,OAAO,EAAG,OAAO,CAAC,UAAU,EACpB,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,wBAAwB,CAAC,GAAE,OAAO,GAAG,MAAM,aAAA,EACnD,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,EACtB,kBAAkB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KAAE,YAAA;IAsBxD,YAAY,CAAC,QAAQ,EAAE,MAAM;IAI7B,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IA6BzF,MAAM,CAAE,SAAS,EAAE,MAAM;IA4EzB,UAAU,CAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IAoCjE,SAAS,CAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IAoCtE;;MAEE;IACI,cAAc,CAAE,KAAK,EAAE,sBAAsB;IAmC7C,aAAa,CAAE,KAAK,EAAE,sBAAsB;YAsCpC,cAAc;YAcd,iBAAiB;IAgB/B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,kBAAkB;YAOZ,iBAAiB;IAkB/B,OAAO,CAAC,MAAM,CAAC,wBAAwB;YAWzB,cAAc;CAW/B;AAGD,QAAA,MAAM,oBAAoB,EAAE,OAAO,qBAAoE,CAAA;AACvG,KAAK,oBAAoB,GAAG,qBAAqB,CAAA;AAEjD,eAAe,oBAAoB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import util from 'node:util';
|
|
2
2
|
import Listener from './testOps/listener.js';
|
|
3
|
-
import { getA11yResultsSummary, getAppA11yResultsSummary, getA11yResults, performA11yScan, getUniqueIdentifier, getUniqueIdentifierForCucumber, isAccessibilityAutomationSession, isAppAccessibilityAutomationSession, isBrowserstackSession, o11yClassErrorHandler, shouldScanTestForAccessibility, validateCapsWithA11y, isTrue, validateCapsWithAppA11y, getAppA11yResults } from './util.js';
|
|
3
|
+
import { getA11yResultsSummary, getAppA11yResultsSummary, getA11yResults, performA11yScan, getUniqueIdentifier, getUniqueIdentifierForCucumber, isAccessibilityAutomationSession, isAppAccessibilityAutomationSession, isBrowserstackSession, o11yClassErrorHandler, shouldScanTestForAccessibility, validateCapsWithA11y, shouldAddServiceVersion, validateCapsWithNonBstackA11y, isTrue, validateCapsWithAppA11y, getAppA11yResults, isFalse } from './util.js';
|
|
4
4
|
import accessibilityScripts from './scripts/accessibility-scripts.js';
|
|
5
5
|
import PerformanceTester from './instrumentation/performance/performance-tester.js';
|
|
6
6
|
import * as PERFORMANCE_SDK_EVENTS from './instrumentation/performance/constants.js';
|
|
@@ -16,12 +16,17 @@ class _AccessibilityHandler {
|
|
|
16
16
|
_caps;
|
|
17
17
|
_suiteFile;
|
|
18
18
|
_accessibility;
|
|
19
|
+
_turboscale;
|
|
20
|
+
_options;
|
|
21
|
+
_config;
|
|
19
22
|
_accessibilityOptions;
|
|
23
|
+
_autoScanning = true;
|
|
24
|
+
_testIdentifier = null;
|
|
20
25
|
_testMetadata = {};
|
|
21
26
|
static _a11yScanSessionMap = {};
|
|
22
27
|
_sessionId = null;
|
|
23
28
|
listener = Listener.getInstance();
|
|
24
|
-
constructor(_browser, _capabilities, isAppAutomate, _framework, _accessibilityAutomation, _accessibilityOpts) {
|
|
29
|
+
constructor(_browser, _capabilities, _options, isAppAutomate, _config, _framework, _accessibilityAutomation, _turboscale, _accessibilityOpts) {
|
|
25
30
|
this._browser = _browser;
|
|
26
31
|
this._capabilities = _capabilities;
|
|
27
32
|
this.isAppAutomate = isAppAutomate;
|
|
@@ -40,6 +45,10 @@ class _AccessibilityHandler {
|
|
|
40
45
|
this._caps = _capabilities;
|
|
41
46
|
this._accessibility = isTrue(_accessibilityAutomation);
|
|
42
47
|
this._accessibilityOptions = _accessibilityOpts;
|
|
48
|
+
this._autoScanning = !isFalse(this._accessibilityOptions?.autoScanning);
|
|
49
|
+
this._options = _options;
|
|
50
|
+
this._config = _config;
|
|
51
|
+
this._turboscale = isTrue(_turboscale);
|
|
43
52
|
}
|
|
44
53
|
setSuiteFile(filename) {
|
|
45
54
|
this._suiteFile = filename;
|
|
@@ -82,7 +91,13 @@ class _AccessibilityHandler {
|
|
|
82
91
|
async before(sessionId) {
|
|
83
92
|
this._sessionId = sessionId;
|
|
84
93
|
this._accessibility = isTrue(this._getCapabilityValue(this._caps, 'accessibility', 'browserstack.accessibility'));
|
|
85
|
-
|
|
94
|
+
//checks for running ALLY on non-bstack infra
|
|
95
|
+
if (isAccessibilityAutomationSession(this._accessibility) && (this._turboscale || !shouldAddServiceVersion(this._config, this._options.testObservability))) {
|
|
96
|
+
if (validateCapsWithNonBstackA11y(this._platformA11yMeta.browser_name, this._platformA11yMeta?.browser_version)) {
|
|
97
|
+
this._accessibility = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
86
101
|
if (isAccessibilityAutomationSession(this._accessibility) && !this.isAppAutomate) {
|
|
87
102
|
const deviceName = this._getCapabilityValue(this._caps, 'deviceName', 'device');
|
|
88
103
|
const chromeOptions = this._getCapabilityValue(this._caps, 'goog:chromeOptions', '');
|
|
@@ -105,7 +120,27 @@ class _AccessibilityHandler {
|
|
|
105
120
|
return await getA11yResults(this.isAppAutomate, this._browser, isBrowserstackSession(this._browser), this._accessibility);
|
|
106
121
|
};
|
|
107
122
|
this._browser.performScan = async () => {
|
|
108
|
-
|
|
123
|
+
const results = await performA11yScan(this.isAppAutomate, this._browser, isBrowserstackSession(this._browser), this._accessibility);
|
|
124
|
+
if (results) {
|
|
125
|
+
this._testMetadata[this._testIdentifier] = {
|
|
126
|
+
scanTestForAccessibility: true,
|
|
127
|
+
accessibilityScanStarted: true
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
await this._setAnnotation('Accessibility scanning was triggered manually');
|
|
131
|
+
return results;
|
|
132
|
+
};
|
|
133
|
+
this._browser.startA11yScanning = async () => {
|
|
134
|
+
AccessibilityHandler._a11yScanSessionMap[sessionId] = true;
|
|
135
|
+
this._testMetadata[this._testIdentifier] = {
|
|
136
|
+
scanTestForAccessibility: true,
|
|
137
|
+
accessibilityScanStarted: true
|
|
138
|
+
};
|
|
139
|
+
await this._setAnnotation('Accessibility scanning has started');
|
|
140
|
+
};
|
|
141
|
+
this._browser.stopA11yScanning = async () => {
|
|
142
|
+
AccessibilityHandler._a11yScanSessionMap[sessionId] = false;
|
|
143
|
+
await this._setAnnotation('Accessibility scanning has stopped');
|
|
109
144
|
};
|
|
110
145
|
if (!this._accessibility) {
|
|
111
146
|
return;
|
|
@@ -128,8 +163,9 @@ class _AccessibilityHandler {
|
|
|
128
163
|
Listener.setTestRunAccessibilityVar(false);
|
|
129
164
|
return;
|
|
130
165
|
}
|
|
131
|
-
const shouldScanTest = shouldScanTestForAccessibility(suiteTitle, test.title, this._accessibilityOptions);
|
|
166
|
+
const shouldScanTest = this._autoScanning && shouldScanTestForAccessibility(suiteTitle, test.title, this._accessibilityOptions);
|
|
132
167
|
const testIdentifier = this.getIdentifier(test);
|
|
168
|
+
this._testIdentifier = testIdentifier;
|
|
133
169
|
if (this._sessionId) {
|
|
134
170
|
/* For case with multiple tests under one browser, before hook of 2nd test should change this map value */
|
|
135
171
|
AccessibilityHandler._a11yScanSessionMap[this._sessionId] = shouldScanTest;
|
|
@@ -185,13 +221,14 @@ class _AccessibilityHandler {
|
|
|
185
221
|
const gherkinDocument = world.gherkinDocument;
|
|
186
222
|
const featureData = gherkinDocument.feature;
|
|
187
223
|
const uniqueId = getUniqueIdentifierForCucumber(world);
|
|
224
|
+
this._testIdentifier = uniqueId;
|
|
188
225
|
if (!this.shouldRunTestHooks(this._browser, this._accessibility)) {
|
|
189
226
|
/* This is to be used when test events are sent */
|
|
190
227
|
Listener.setTestRunAccessibilityVar(false);
|
|
191
228
|
return;
|
|
192
229
|
}
|
|
193
230
|
try {
|
|
194
|
-
const shouldScanScenario = shouldScanTestForAccessibility(featureData?.name, pickleData.name, this._accessibilityOptions, world, true);
|
|
231
|
+
const shouldScanScenario = this._autoScanning && shouldScanTestForAccessibility(featureData?.name, pickleData.name, this._accessibilityOptions, world, true);
|
|
195
232
|
this._testMetadata[uniqueId] = {
|
|
196
233
|
scanTestForAccessibility: shouldScanScenario,
|
|
197
234
|
accessibilityScanStarted: true
|
|
@@ -252,10 +289,12 @@ class _AccessibilityHandler {
|
|
|
252
289
|
return origFunction(...args);
|
|
253
290
|
}
|
|
254
291
|
async sendTestStopEvent(browser, dataForExtension) {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
await
|
|
258
|
-
|
|
292
|
+
if (AccessibilityHandler._a11yScanSessionMap[this._sessionId]) {
|
|
293
|
+
BStackLogger.debug('Performing scan before saving results');
|
|
294
|
+
await PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.A11Y_EVENTS.PERFORM_SCAN, async () => {
|
|
295
|
+
await performA11yScan(this.isAppAutomate, browser, true, true);
|
|
296
|
+
}, { command: 'afterTest' })();
|
|
297
|
+
}
|
|
259
298
|
if (isAppAccessibilityAutomationSession(this._accessibility, this.isAppAutomate)) {
|
|
260
299
|
return;
|
|
261
300
|
}
|
|
@@ -274,7 +313,7 @@ class _AccessibilityHandler {
|
|
|
274
313
|
if (!browser) {
|
|
275
314
|
return false;
|
|
276
315
|
}
|
|
277
|
-
return
|
|
316
|
+
return isAccessibilityAutomationSession(isAccessibility);
|
|
278
317
|
}
|
|
279
318
|
async checkIfPageOpened(browser, testIdentifier, shouldScanTest) {
|
|
280
319
|
let pageOpen = false;
|
|
@@ -299,6 +338,17 @@ class _AccessibilityHandler {
|
|
|
299
338
|
return (script.toLowerCase().indexOf('browserstack_executor') !== -1 ||
|
|
300
339
|
script.toLowerCase().indexOf('browserstack_accessibility_automation_script') !== -1);
|
|
301
340
|
}
|
|
341
|
+
async _setAnnotation(message) {
|
|
342
|
+
if (this._accessibility && isBrowserstackSession(this._browser)) {
|
|
343
|
+
await this._browser.execute(`browserstack_executor: ${JSON.stringify({
|
|
344
|
+
action: 'annotate',
|
|
345
|
+
arguments: {
|
|
346
|
+
data: message,
|
|
347
|
+
level: 'info'
|
|
348
|
+
}
|
|
349
|
+
})}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
302
352
|
}
|
|
303
353
|
// https://github.com/microsoft/TypeScript/issues/6543
|
|
304
354
|
const AccessibilityHandler = o11yClassErrorHandler(_AccessibilityHandler);
|
package/build/config.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ declare class BrowserStackConfig {
|
|
|
11
11
|
testObservability: TestOpsConfig;
|
|
12
12
|
percy: boolean;
|
|
13
13
|
percyCaptureMode?: string;
|
|
14
|
-
accessibility: boolean;
|
|
14
|
+
accessibility: boolean | null;
|
|
15
15
|
app?: string | AppConfig;
|
|
16
16
|
private static _instance;
|
|
17
17
|
appAutomate: boolean;
|
package/build/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,aAAa,MAAM,4BAA4B,CAAA;AAKtD,cAAM,kBAAkB;IACpB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,kBAAkB;IAO/G,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,aAAa,CAAA;IAChC,KAAK,EAAE,OAAO,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,aAAa,MAAM,4BAA4B,CAAA;AAKtD,cAAM,kBAAkB;IACpB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,kBAAkB;IAO/G,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,aAAa,CAAA;IAChC,KAAK,EAAE,OAAO,CAAA;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoB;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,OAAO,CAAQ;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,kBAAkB,UAAQ;IAEjC,OAAO;IAeP,cAAc;IAId,aAAa,CAAC,GAAG,EAAE,MAAM;CAI5B;AAED,eAAe,kBAAkB,CAAA"}
|
package/build/config.js
CHANGED
|
@@ -33,7 +33,7 @@ class BrowserStackConfig {
|
|
|
33
33
|
this.accessKey = config.key;
|
|
34
34
|
this.testObservability = new TestOpsConfig(options.testObservability !== false, !isUndefined(options.testObservability));
|
|
35
35
|
this.percy = options.percy || false;
|
|
36
|
-
this.accessibility = options.accessibility
|
|
36
|
+
this.accessibility = options.accessibility !== undefined ? options.accessibility : null;
|
|
37
37
|
this.app = options.app;
|
|
38
38
|
this.appAutomate = !isUndefined(options.app);
|
|
39
39
|
this.automate = !this.appAutomate;
|
|
@@ -17,6 +17,7 @@ declare class _InsightsHandler {
|
|
|
17
17
|
private _currentHook;
|
|
18
18
|
private _cucumberData;
|
|
19
19
|
private _userCaps?;
|
|
20
|
+
private _options?;
|
|
20
21
|
private listener;
|
|
21
22
|
currentTestId: string | undefined;
|
|
22
23
|
cbtQueue: Array<CBTData>;
|
|
@@ -50,6 +51,11 @@ declare class _InsightsHandler {
|
|
|
50
51
|
*/
|
|
51
52
|
appendTestItemLog: (stdLog: StdLog) => Promise<void>;
|
|
52
53
|
browserCommand(commandType: string, args: BeforeCommandArgs | AfterCommandArgs, test?: Frameworks.Test | ITestCaseHookParameter): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if any test steps failed (excluding hook failures)
|
|
56
|
+
* This is used when ignoreHooksStatus is true to determine test status based only on test steps
|
|
57
|
+
*/
|
|
58
|
+
hasTestStepFailures(world: ITestCaseHookParameter): boolean;
|
|
53
59
|
private attachHookData;
|
|
54
60
|
private setHooksFromSuite;
|
|
55
61
|
private getHierarchy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGzE,OAAO,KAAK,EAAiB,OAAO,EAAE,QAAQ,EAAsB,YAAY,EAAE,kBAAkB,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAGjK,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAiBpD,OAAO,KAAK,EACR,QAAQ,EACR,QAAQ,EAER,cAAc,EACd,MAAM,EACN,OAAO,EACV,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C,cAAM,gBAAgB;
|
|
1
|
+
{"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ class _InsightsHandler {
|
|
|
22
22
|
steps: []
|
|
23
23
|
};
|
|
24
24
|
_userCaps = {};
|
|
25
|
+
_options;
|
|
25
26
|
listener = Listener.getInstance();
|
|
26
27
|
currentTestId;
|
|
27
28
|
cbtQueue = [];
|
|
@@ -31,6 +32,7 @@ class _InsightsHandler {
|
|
|
31
32
|
const caps = this._browser.capabilities;
|
|
32
33
|
const sessionId = this._browser.sessionId;
|
|
33
34
|
this._userCaps = _userCaps;
|
|
35
|
+
this._options = _options;
|
|
34
36
|
this._platformMeta = {
|
|
35
37
|
browserName: caps.browserName,
|
|
36
38
|
browserVersion: caps?.browserVersion,
|
|
@@ -483,6 +485,22 @@ class _InsightsHandler {
|
|
|
483
485
|
/*
|
|
484
486
|
* private methods
|
|
485
487
|
*/
|
|
488
|
+
/**
|
|
489
|
+
* Check if any test steps failed (excluding hook failures)
|
|
490
|
+
* This is used when ignoreHooksStatus is true to determine test status based only on test steps
|
|
491
|
+
*/
|
|
492
|
+
hasTestStepFailures(world) {
|
|
493
|
+
if (!world?.pickle) {
|
|
494
|
+
return false;
|
|
495
|
+
}
|
|
496
|
+
const uniqueId = getUniqueIdentifierForCucumber(world);
|
|
497
|
+
const testMetaData = this._tests[uniqueId];
|
|
498
|
+
if (!testMetaData?.steps) {
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
// Check if any step failed
|
|
502
|
+
return testMetaData.steps.some(step => step.result === 'FAILED');
|
|
503
|
+
}
|
|
486
504
|
attachHookData(context, hookId) {
|
|
487
505
|
if (context.currentTest && context.currentTest.parent) {
|
|
488
506
|
const parentTest = `${context.currentTest.parent.title} - ${context.currentTest.title}`;
|
|
@@ -690,6 +708,16 @@ class _InsightsHandler {
|
|
|
690
708
|
if (result !== 'passed' && result !== 'failed') {
|
|
691
709
|
result = 'skipped'; // mark UNKNOWN/UNDEFINED/AMBIGUOUS/PENDING as skipped
|
|
692
710
|
}
|
|
711
|
+
// Handle ignoreHooksStatus: when enabled and scenario failed, check if it's due to hook failures only
|
|
712
|
+
const ignoreHooksStatus = this._options?.testObservabilityOptions?.ignoreHooksStatus === true;
|
|
713
|
+
if (ignoreHooksStatus && result === 'failed' && world) {
|
|
714
|
+
// Check if any test steps failed (excluding hook failures)
|
|
715
|
+
const hasTestStepFailures = this.hasTestStepFailures(world);
|
|
716
|
+
if (!hasTestStepFailures) {
|
|
717
|
+
// Only hooks failed, override result to passed for Test Observability
|
|
718
|
+
result = 'passed';
|
|
719
|
+
}
|
|
720
|
+
}
|
|
693
721
|
testData.finished_at = (new Date()).toISOString();
|
|
694
722
|
testData.result = result;
|
|
695
723
|
testData.duration_in_ms = world.result.duration.seconds * 1000 + world.result.duration.nanos / 1000000; // send duration in ms
|
package/build/launcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,yBAAyB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAIlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,yBAAyB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAIlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AA0CxH,KAAK,iBAAiB,GAAG,yBAAyB,CAAC,KAAK,GAAG;IACvD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAA;CAC9C,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,2BAA4B,YAAW,QAAQ,CAAC,eAAe;IAY5E,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,OAAO;IAbnB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAQ;IACjC,OAAO,CAAC,wBAAwB,CAAC,CAAuB;IACxD,OAAO,CAAC,MAAM,CAAC,CAAO;IACtB,OAAO,CAAC,sBAAsB,CAAC,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;gBAG3C,QAAQ,EAAE,kBAAkB,GAAG,mBAAmB,EAC1D,YAAY,EAAE,YAAY,CAAC,gBAAgB,EACnC,OAAO,EAAE,OAAO,CAAC,UAAU;IAiHjC,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;IAclC,SAAS,CAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,kBAAkB;IAmMpF,UAAU;IAyEV,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU;IA0B7G,SAAS;IAaT,UAAU,CAAC,GAAG,EAAC,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuBrD;;;OAGG;IACG,YAAY,CAAE,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyB1D,kBAAkB;IAOxB,qBAAqB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IA8GtH,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IA+H5F,8BAA8B;IAgB9B,sBAAsB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB;IAyCrE;;;OAGG;IACH,oBAAoB;IA6BpB,sBAAsB,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,EAAC,MAAM,EAAE,eAAe,CAAC,EAAC,MAAM;IASnF,mBAAmB;CAStB"}
|
package/build/launcher.js
CHANGED
|
@@ -16,7 +16,7 @@ import { SevereServiceError } from 'webdriverio';
|
|
|
16
16
|
import * as BrowserstackLocalLauncher from 'browserstack-local';
|
|
17
17
|
import { startPercy, stopPercy, getBestPlatformForPercySnapshot } from './Percy/PercyHelper.js';
|
|
18
18
|
import { BSTACK_SERVICE_VERSION, NOT_ALLOWED_KEYS_IN_CAPS, PERF_MEASUREMENT_ENV, RERUN_ENV, RERUN_TESTS_ENV, BROWSERSTACK_TESTHUB_UUID, VALID_APP_EXTENSION, BROWSERSTACK_PERCY, BROWSERSTACK_OBSERVABILITY } from './constants.js';
|
|
19
|
-
import { launchTestSession, shouldAddServiceVersion, stopBuildUpstream, getCiInfo, isBStackSession, isUndefined, isAccessibilityAutomationSession, isTrue, getBrowserStackUser, getBrowserStackKey, uploadLogs, ObjectsAreEqual, isValidCapsForHealing } from './util.js';
|
|
19
|
+
import { launchTestSession, shouldAddServiceVersion, stopBuildUpstream, getCiInfo, isBStackSession, isUndefined, isAccessibilityAutomationSession, isTrue, getBrowserStackUser, getBrowserStackKey, uploadLogs, ObjectsAreEqual, isValidCapsForHealing, getBooleanValueFromString, validateCapsWithNonBstackA11y, mergeChromeOptions } from './util.js';
|
|
20
20
|
import { getProductMap } from './testHub/utils.js';
|
|
21
21
|
import CrashReporter from './crash-reporter.js';
|
|
22
22
|
import { BStackLogger } from './bstackLogger.js';
|
|
@@ -29,6 +29,7 @@ import AiHandler from './ai-handler.js';
|
|
|
29
29
|
import TestOpsConfig from './testOps/testOpsConfig.js';
|
|
30
30
|
import PerformanceTester from './instrumentation/performance/performance-tester.js';
|
|
31
31
|
import * as PERFORMANCE_SDK_EVENTS from './instrumentation/performance/constants.js';
|
|
32
|
+
import accessibilityScripts from './scripts/accessibility-scripts.js';
|
|
32
33
|
export default class BrowserstackLauncherService {
|
|
33
34
|
_options;
|
|
34
35
|
_config;
|
|
@@ -37,7 +38,7 @@ export default class BrowserstackLauncherService {
|
|
|
37
38
|
_projectName;
|
|
38
39
|
_buildTag;
|
|
39
40
|
_buildIdentifier;
|
|
40
|
-
_accessibilityAutomation;
|
|
41
|
+
_accessibilityAutomation = null;
|
|
41
42
|
_percy;
|
|
42
43
|
_percyBestPlatformCaps;
|
|
43
44
|
browserStackConfig;
|
|
@@ -104,7 +105,6 @@ export default class BrowserstackLauncherService {
|
|
|
104
105
|
caps.capabilities['bstack:options'] = { wdioService: BSTACK_SERVICE_VERSION };
|
|
105
106
|
if (!isUndefined(caps.capabilities['browserstack.accessibility'])) {
|
|
106
107
|
this._accessibilityAutomation ||= isTrue(caps.capabilities['browserstack.accessibility']);
|
|
107
|
-
this.browserStackConfig.accessibility = this._accessibilityAutomation;
|
|
108
108
|
}
|
|
109
109
|
else if (isTrue(this._options.accessibility)) {
|
|
110
110
|
caps.capabilities['bstack:options'] = { wdioService: BSTACK_SERVICE_VERSION, accessibility: (isTrue(this._options.accessibility)) };
|
|
@@ -135,7 +135,9 @@ export default class BrowserstackLauncherService {
|
|
|
135
135
|
this.browserStackConfig.buildIdentifier = this._buildIdentifier;
|
|
136
136
|
this.browserStackConfig.buildName = this._buildName;
|
|
137
137
|
PerformanceTester.startMonitoring('performance-report-launcher.csv');
|
|
138
|
-
|
|
138
|
+
if (!isUndefined(this._options.accessibility)) {
|
|
139
|
+
this._accessibilityAutomation ||= isTrue(this._options.accessibility);
|
|
140
|
+
}
|
|
139
141
|
this._options.accessibility = this._accessibilityAutomation;
|
|
140
142
|
// by default observability will be true unless specified as false
|
|
141
143
|
this._options.testObservability = this._options.testObservability !== false;
|
|
@@ -239,16 +241,32 @@ export default class BrowserstackLauncherService {
|
|
|
239
241
|
// remove accessibilityOptions from the capabilities if present
|
|
240
242
|
this._updateObjectTypeCaps(capabilities, 'accessibilityOptions');
|
|
241
243
|
const shouldSetupPercy = this._options.percy || (isUndefined(this._options.percy) && this._options.app);
|
|
242
|
-
|
|
244
|
+
let buildStartResponse = null;
|
|
243
245
|
if (this._options.testObservability || this._accessibilityAutomation || shouldSetupPercy) {
|
|
244
246
|
BStackLogger.debug('Sending launch start event');
|
|
245
|
-
await launchTestSession(this._options, this._config, {
|
|
247
|
+
buildStartResponse = await launchTestSession(this._options, this._config, {
|
|
246
248
|
projectName: this._projectName,
|
|
247
249
|
buildName: this._buildName,
|
|
248
250
|
buildTag: this._buildTag,
|
|
249
251
|
bstackServiceVersion: BSTACK_SERVICE_VERSION,
|
|
250
252
|
buildIdentifier: this._buildIdentifier
|
|
251
|
-
}, this.browserStackConfig);
|
|
253
|
+
}, this.browserStackConfig, this._accessibilityAutomation);
|
|
254
|
+
//added checks for Accessibility running on non-bstack infra
|
|
255
|
+
if (isAccessibilityAutomationSession(this._accessibilityAutomation) && (process.env.BROWSERSTACK_TURBOSCALE || !shouldAddServiceVersion(this._config, this._options.testObservability))) {
|
|
256
|
+
const overrideOptions = accessibilityScripts.ChromeExtension;
|
|
257
|
+
this._updateObjectTypeCaps(capabilities, 'goog:chromeOptions', overrideOptions);
|
|
258
|
+
}
|
|
259
|
+
if (buildStartResponse?.accessibility) {
|
|
260
|
+
if (this._accessibilityAutomation === null) {
|
|
261
|
+
this.browserStackConfig.accessibility = buildStartResponse.accessibility.success;
|
|
262
|
+
this._accessibilityAutomation = buildStartResponse.accessibility.success;
|
|
263
|
+
this._options.accessibility = buildStartResponse.accessibility.success;
|
|
264
|
+
if (buildStartResponse.accessibility.success === true) {
|
|
265
|
+
this._updateCaps(capabilities, 'accessibility', 'true');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
this.browserStackConfig.accessibility = this._accessibilityAutomation;
|
|
252
270
|
if (this._accessibilityAutomation && this._options.accessibilityOptions) {
|
|
253
271
|
const filteredOpts = Object.keys(this._options.accessibilityOptions)
|
|
254
272
|
.filter(key => !NOT_ALLOWED_KEYS_IN_CAPS.includes(key))
|
|
@@ -484,6 +502,19 @@ export default class BrowserstackLauncherService {
|
|
|
484
502
|
return c;
|
|
485
503
|
})
|
|
486
504
|
.forEach((capability) => {
|
|
505
|
+
if (validateCapsWithNonBstackA11y(capability.browserName, capability.browserVersion)) {
|
|
506
|
+
if (capType === 'goog:chromeOptions' && value) {
|
|
507
|
+
const chromeOptions = capability['goog:chromeOptions'];
|
|
508
|
+
if (chromeOptions) {
|
|
509
|
+
const finalChromeOptions = mergeChromeOptions(chromeOptions, value);
|
|
510
|
+
capability['goog:chromeOptions'] = finalChromeOptions;
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
capability['goog:chromeOptions'] = value;
|
|
514
|
+
}
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
487
518
|
if (!capability['bstack:options']) {
|
|
488
519
|
const extensionCaps = Object.keys(capability).filter((cap) => cap.includes(':'));
|
|
489
520
|
if (extensionCaps.length) {
|
|
@@ -522,6 +553,19 @@ export default class BrowserstackLauncherService {
|
|
|
522
553
|
}
|
|
523
554
|
else if (typeof capabilities === 'object') {
|
|
524
555
|
Object.entries(capabilities).forEach(([, caps]) => {
|
|
556
|
+
if (validateCapsWithNonBstackA11y(caps.capabilities.browserName, caps.capabilities.browserVersion)) {
|
|
557
|
+
if (capType === 'goog:chromeOptions' && value) {
|
|
558
|
+
const chromeOptions = caps.capabilities['goog:chromeOptions'];
|
|
559
|
+
if (chromeOptions) {
|
|
560
|
+
const finalChromeOptions = mergeChromeOptions(chromeOptions, value);
|
|
561
|
+
caps.capabilities['goog:chromeOptions'] = finalChromeOptions;
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
caps.capabilities['goog:chromeOptions'] = value;
|
|
565
|
+
}
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
525
569
|
if (!caps.capabilities['bstack:options']) {
|
|
526
570
|
const extensionCaps = Object.keys(caps.capabilities).filter((cap) => cap.includes(':'));
|
|
527
571
|
if (extensionCaps.length) {
|
|
@@ -591,6 +635,9 @@ export default class BrowserstackLauncherService {
|
|
|
591
635
|
else if (capType === 'buildProductMap' && getProductMap(this.browserStackConfig)) {
|
|
592
636
|
capability['bstack:options'] = { buildProductMap: getProductMap(this.browserStackConfig) };
|
|
593
637
|
}
|
|
638
|
+
else if (capType === 'accessibility') {
|
|
639
|
+
capability['bstack:options'] = { accessibility: getBooleanValueFromString(value) };
|
|
640
|
+
}
|
|
594
641
|
}
|
|
595
642
|
else if (capType === 'local') {
|
|
596
643
|
capability['browserstack.local'] = true;
|
|
@@ -615,6 +662,9 @@ export default class BrowserstackLauncherService {
|
|
|
615
662
|
else if (capType === 'buildProductMap') {
|
|
616
663
|
capability['browserstack.buildProductMap'] = getProductMap(this.browserStackConfig);
|
|
617
664
|
}
|
|
665
|
+
else if (capType === 'accessibility') {
|
|
666
|
+
capability['browserstack.accessibility'] = getBooleanValueFromString(value);
|
|
667
|
+
}
|
|
618
668
|
}
|
|
619
669
|
else if (capType === 'local') {
|
|
620
670
|
capability['bstack:options'].local = true;
|
|
@@ -639,6 +689,9 @@ export default class BrowserstackLauncherService {
|
|
|
639
689
|
else if (capType === 'buildProductMap') {
|
|
640
690
|
capability['bstack:options'].buildProductMap = getProductMap(this.browserStackConfig);
|
|
641
691
|
}
|
|
692
|
+
else if (capType === 'accessibility') {
|
|
693
|
+
capability['bstack:options'].accessibility = getBooleanValueFromString(value);
|
|
694
|
+
}
|
|
642
695
|
});
|
|
643
696
|
}
|
|
644
697
|
else if (typeof capabilities === 'object') {
|
|
@@ -661,6 +714,9 @@ export default class BrowserstackLauncherService {
|
|
|
661
714
|
else if (capType === 'buildProductMap') {
|
|
662
715
|
caps.capabilities['bstack:options'] = { buildProductMap: getProductMap(this.browserStackConfig) };
|
|
663
716
|
}
|
|
717
|
+
else if (capType === 'accessibility') {
|
|
718
|
+
caps.capabilities['bstack:options'] = { accessibility: getBooleanValueFromString(value) };
|
|
719
|
+
}
|
|
664
720
|
}
|
|
665
721
|
else if (capType === 'local') {
|
|
666
722
|
caps.capabilities['browserstack.local'] = true;
|
|
@@ -685,6 +741,9 @@ export default class BrowserstackLauncherService {
|
|
|
685
741
|
else if (capType === 'buildProductMap') {
|
|
686
742
|
caps.capabilities['browserstack.buildProductMap'] = getProductMap(this.browserStackConfig);
|
|
687
743
|
}
|
|
744
|
+
else if (capType === 'accessibility') {
|
|
745
|
+
caps.capabilities['browserstack.accessibility'] = getBooleanValueFromString(value);
|
|
746
|
+
}
|
|
688
747
|
}
|
|
689
748
|
else if (capType === 'local') {
|
|
690
749
|
caps.capabilities['bstack:options'].local = true;
|
|
@@ -709,6 +768,9 @@ export default class BrowserstackLauncherService {
|
|
|
709
768
|
else if (capType === 'buildProductMap') {
|
|
710
769
|
caps.capabilities['bstack:options'].buildProductMap = getProductMap(this.browserStackConfig);
|
|
711
770
|
}
|
|
771
|
+
else if (capType === 'accessibility') {
|
|
772
|
+
caps.capabilities['bstack:options'].accessibility = getBooleanValueFromString(value);
|
|
773
|
+
}
|
|
712
774
|
});
|
|
713
775
|
}
|
|
714
776
|
else {
|
|
@@ -5,6 +5,9 @@ declare class AccessibilityScripts {
|
|
|
5
5
|
getResultsSummary: string | null;
|
|
6
6
|
saveTestResults: string | null;
|
|
7
7
|
commandsToWrap: Array<any> | null;
|
|
8
|
+
ChromeExtension: {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
8
11
|
browserstackFolderPath: string;
|
|
9
12
|
commandsPath: string;
|
|
10
13
|
private constructor();
|
|
@@ -14,6 +17,7 @@ declare class AccessibilityScripts {
|
|
|
14
17
|
update(data: {
|
|
15
18
|
commands: any[];
|
|
16
19
|
scripts: Record<string, any>;
|
|
20
|
+
nonBStackInfraA11yChromeOptions: {};
|
|
17
21
|
}): void;
|
|
18
22
|
store(): void;
|
|
19
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility-scripts.d.ts","sourceRoot":"","sources":["../../src/scripts/accessibility-scripts.ts"],"names":[],"mappings":"AAIA,cAAM,oBAAoB;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAEpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAO;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAO;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAO;IACvC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAO;IACrC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAO;
|
|
1
|
+
{"version":3,"file":"accessibility-scripts.d.ts","sourceRoot":"","sources":["../../src/scripts/accessibility-scripts.ts"],"names":[],"mappings":"AAIA,cAAM,oBAAoB;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAEpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAO;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAO;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAO;IACvC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAO;IACrC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAO;IACxC,eAAe,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAK;IAEhD,sBAAsB,SAAK;IAC3B,YAAY,SAAK;IAGxB,OAAO;WAKO,mBAAmB;IAQ1B,cAAc,IAAI,MAAM;IAuBxB,oBAAoB;IAapB,MAAM,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,+BAA+B,EAAE,EAAE,CAAA;KAAE;IAenG,KAAK;CAgBf;;AAED,wBAAyD"}
|
|
@@ -8,6 +8,7 @@ class AccessibilityScripts {
|
|
|
8
8
|
getResultsSummary = null;
|
|
9
9
|
saveTestResults = null;
|
|
10
10
|
commandsToWrap = null;
|
|
11
|
+
ChromeExtension = {};
|
|
11
12
|
browserstackFolderPath = '';
|
|
12
13
|
commandsPath = '';
|
|
13
14
|
// don't allow to create instances from it other than through `checkAndGetInstance`
|
|
@@ -66,6 +67,9 @@ class AccessibilityScripts {
|
|
|
66
67
|
if (data.commands && data.commands.length) {
|
|
67
68
|
this.commandsToWrap = data.commands;
|
|
68
69
|
}
|
|
70
|
+
if (data.nonBStackInfraA11yChromeOptions) {
|
|
71
|
+
this.ChromeExtension = data.nonBStackInfraA11yChromeOptions;
|
|
72
|
+
}
|
|
69
73
|
}
|
|
70
74
|
store() {
|
|
71
75
|
if (!fs.existsSync(this.browserstackFolderPath)) {
|
|
@@ -78,7 +82,8 @@ class AccessibilityScripts {
|
|
|
78
82
|
getResults: this.getResults,
|
|
79
83
|
getResultsSummary: this.getResultsSummary,
|
|
80
84
|
saveResults: this.saveTestResults,
|
|
81
|
-
}
|
|
85
|
+
},
|
|
86
|
+
nonBStackInfraA11yChromeOptions: this.ChromeExtension,
|
|
82
87
|
}));
|
|
83
88
|
}
|
|
84
89
|
}
|
package/build/service.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export default class BrowserstackService implements Services.ServiceInstance {
|
|
|
6
6
|
private _config;
|
|
7
7
|
private _sessionBaseUrl;
|
|
8
8
|
private _failReasons;
|
|
9
|
+
private _hookFailReasons;
|
|
10
|
+
private _pureTestFailReasons;
|
|
9
11
|
private _scenariosThatRan;
|
|
10
12
|
private _failureStatuses;
|
|
11
13
|
private _browser?;
|
package/build/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAY9E,OAAO,KAAK,EAAE,kBAAkB,EAAuB,iBAAiB,EAA8C,MAAM,YAAY,CAAA;AACxI,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAgBhG,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,QAAQ,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAY9E,OAAO,KAAK,EAAE,kBAAkB,EAAuB,iBAAiB,EAA8C,MAAM,YAAY,CAAA;AACxI,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAgBhG,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,QAAQ,CAAC,eAAe;IAyBpE,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IAzBnB,OAAO,CAAC,eAAe,CAAmD;IAC1E,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,oBAAoB,CAAe;IAC3C,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,gBAAgB,CAA4D;IACpF,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAAA;IACtB,OAAO,CAAC,YAAY,CAAC,CAA0C;IAC/D,OAAO,CAAC,gBAAgB,CAAC,CAAiB;IAC1C,OAAO,CAAC,cAAc,CAAA;IACtB,OAAO,CAAC,qBAAqB,CAAC,CAAsB;IACpD,OAAO,CAAC,MAAM,CAAA;IACd,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,WAAW,CAAA;gBAGf,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EACxC,KAAK,EAAE,YAAY,CAAC,gBAAgB,EACpC,OAAO,EAAE,OAAO,CAAC,UAAU;IAiCvC,WAAW,CAAE,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,GAAG,YAAY,CAAC,mBAAmB,KAAK,IAAI;IAW5F,aAAa,CAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC;IAiBzD,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO;IAoH/F;;;;;;OAMG;IAEG,WAAW,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IAWpC,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,GAAC,YAAY,EAAE,OAAO,EAAE,GAAG;IAQ5D,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU;IAe/F,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IAsBjC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU;IAgB/E,KAAK,CAAE,MAAM,EAAE,MAAM;IAsF3B;;OAEG;IAGG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAOjD;;;OAGG;IAEG,cAAc,CAAE,KAAK,EAAE,sBAAsB;IAS7C,aAAa,CAAE,KAAK,EAAE,sBAAsB;IAwC5C,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM;IAMzD,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY;IAKzF,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAkDzD,cAAc,IAAI,OAAO;IAMzB,UAAU,CAAE,WAAW,EAAE,GAAG;IAU5B,kBAAkB,CAAE,MAAM,EAAE,iBAAiB;IAqB7C,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG;IAqBrC,gBAAgB;YAiCR,eAAe;IA4B7B,OAAO,CAAC,cAAc;YAIR,eAAe;IAsB7B,OAAO,CAAC,cAAc;CAKzB"}
|
package/build/service.js
CHANGED
|
@@ -25,6 +25,8 @@ export default class BrowserstackService {
|
|
|
25
25
|
_config;
|
|
26
26
|
_sessionBaseUrl = 'https://api.browserstack.com/automate/sessions';
|
|
27
27
|
_failReasons = [];
|
|
28
|
+
_hookFailReasons = [];
|
|
29
|
+
_pureTestFailReasons = [];
|
|
28
30
|
_scenariosThatRan = [];
|
|
29
31
|
_failureStatuses = ['failed', 'ambiguous', 'undefined', 'unknown'];
|
|
30
32
|
_browser;
|
|
@@ -119,15 +121,13 @@ export default class BrowserstackService {
|
|
|
119
121
|
if (this._browser) {
|
|
120
122
|
try {
|
|
121
123
|
const sessionId = this._browser.sessionId;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
BStackLogger.error(`[Accessibility Test Run] Error in service class before function: ${err}`);
|
|
130
|
-
}
|
|
124
|
+
try {
|
|
125
|
+
this._accessibilityHandler = new AccessibilityHandler(this._browser, this._caps, this._options, this._isAppAutomate(), this._config, this._config.framework, this._accessibility, this._turboScale, this._options.accessibilityOptions);
|
|
126
|
+
await this._accessibilityHandler.before(sessionId);
|
|
127
|
+
Listener.setAccessibilityOptions(this._options.accessibilityOptions);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
BStackLogger.error(`[Accessibility Test Run] Error in service class before function: ${err}`);
|
|
131
131
|
}
|
|
132
132
|
if (shouldProcessEventForTesthub('')) {
|
|
133
133
|
patchConsoleLogs();
|
|
@@ -188,6 +188,15 @@ export default class BrowserstackService {
|
|
|
188
188
|
await this._insightsHandler?.beforeHook(test, context);
|
|
189
189
|
}
|
|
190
190
|
async afterHook(test, context, result) {
|
|
191
|
+
// Track hook failures separately
|
|
192
|
+
if (result && !result.passed) {
|
|
193
|
+
const hookError = (result.error && result.error.message) || 'Hook failed';
|
|
194
|
+
this._hookFailReasons.push(hookError);
|
|
195
|
+
// Still add to main failReasons for backward compatibility if ignoreHooksStatus is not enabled
|
|
196
|
+
if (!this._options.testObservabilityOptions?.ignoreHooksStatus) {
|
|
197
|
+
this._failReasons.push(hookError);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
191
200
|
await this._insightsHandler?.afterHook(test, result);
|
|
192
201
|
}
|
|
193
202
|
async beforeTest(test) {
|
|
@@ -213,7 +222,10 @@ export default class BrowserstackService {
|
|
|
213
222
|
this._specsRan = true;
|
|
214
223
|
const { error, passed } = results;
|
|
215
224
|
if (!passed) {
|
|
216
|
-
|
|
225
|
+
const testError = (error && error.message) || 'Unknown Error';
|
|
226
|
+
this._failReasons.push(testError);
|
|
227
|
+
// Track this as a pure test failure (not hook-related)
|
|
228
|
+
this._pureTestFailReasons.push(testError);
|
|
217
229
|
}
|
|
218
230
|
await this._accessibilityHandler?.afterTest(this._suiteTitle, test);
|
|
219
231
|
await this._insightsHandler?.afterTest(test, results);
|
|
@@ -228,12 +240,57 @@ export default class BrowserstackService {
|
|
|
228
240
|
}
|
|
229
241
|
await PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.AUTOMATE_EVENTS.SESSION_STATUS, async () => {
|
|
230
242
|
if (setSessionStatus) {
|
|
231
|
-
const
|
|
243
|
+
const ignoreHooksStatus = this._options.testObservabilityOptions?.ignoreHooksStatus === true;
|
|
244
|
+
let sessionStatus;
|
|
245
|
+
let failureReason;
|
|
246
|
+
if (result === 0 && this._specsRan) {
|
|
247
|
+
// Test runner reported success and tests ran
|
|
248
|
+
if (ignoreHooksStatus) {
|
|
249
|
+
// Only consider pure test failures, ignore hook failures
|
|
250
|
+
const hasPureTestFailures = this._pureTestFailReasons.length > 0;
|
|
251
|
+
sessionStatus = hasPureTestFailures ? 'failed' : 'passed';
|
|
252
|
+
failureReason = hasPureTestFailures ? this._pureTestFailReasons.join('\n') : undefined;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Default behavior: consider all failures including hooks
|
|
256
|
+
const hasReasons = this._failReasons.length > 0;
|
|
257
|
+
sessionStatus = hasReasons ? 'failed' : 'passed';
|
|
258
|
+
failureReason = hasReasons ? this._failReasons.join('\n') : undefined;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else if (ignoreHooksStatus && this._specsRan) {
|
|
262
|
+
// Test runner reported failure but ignoreHooksStatus is enabled
|
|
263
|
+
// Check if we only have hook failures and no pure test failures
|
|
264
|
+
const hasPureTestFailures = this._pureTestFailReasons.length > 0;
|
|
265
|
+
const hasOnlyHookFailures = this._failReasons.length === 0 && this._hookFailReasons.length > 0;
|
|
266
|
+
if (hasOnlyHookFailures && !hasPureTestFailures) {
|
|
267
|
+
// Only hook failures exist - mark as passed when ignoreHooksStatus is true
|
|
268
|
+
sessionStatus = 'passed';
|
|
269
|
+
failureReason = undefined;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// Pure test failures exist - mark as failed
|
|
273
|
+
sessionStatus = 'failed';
|
|
274
|
+
failureReason = hasPureTestFailures ? this._pureTestFailReasons.join('\n') : undefined;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// Default behavior: mark as failed (test runner reported failure or no tests ran)
|
|
279
|
+
sessionStatus = 'failed';
|
|
280
|
+
if (ignoreHooksStatus && this._pureTestFailReasons.length > 0) {
|
|
281
|
+
failureReason = this._pureTestFailReasons.join('\n');
|
|
282
|
+
}
|
|
283
|
+
else if (this._failReasons.length > 0) {
|
|
284
|
+
failureReason = this._failReasons.join('\n');
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
failureReason = undefined;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
232
290
|
await this._updateJob({
|
|
233
|
-
status:
|
|
291
|
+
status: sessionStatus,
|
|
234
292
|
...(setSessionName ? { name: this._fullTitle } : {}),
|
|
235
|
-
...(
|
|
236
|
-
{} : hasReasons ? { reason: this._failReasons.join('\n') } : {})
|
|
293
|
+
...(failureReason ? { reason: failureReason } : {})
|
|
237
294
|
});
|
|
238
295
|
}
|
|
239
296
|
})();
|
|
@@ -249,6 +306,13 @@ export default class BrowserstackService {
|
|
|
249
306
|
'uploadPending', 'teardown', 'browserCommand'
|
|
250
307
|
]);
|
|
251
308
|
}
|
|
309
|
+
// Override process exit when we have only hook failures and ignoreHooksStatus is true
|
|
310
|
+
const ignoreHooksStatus = this._options.testObservabilityOptions?.ignoreHooksStatus === true;
|
|
311
|
+
const hasOnlyHookFailures = this._failReasons.length === 0 && this._hookFailReasons.length > 0;
|
|
312
|
+
const shouldOverrideResult = ignoreHooksStatus && this._specsRan && hasOnlyHookFailures;
|
|
313
|
+
if (shouldOverrideResult && result !== 0) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
252
316
|
}
|
|
253
317
|
/**
|
|
254
318
|
* For CucumberJS
|
|
@@ -281,7 +345,23 @@ export default class BrowserstackService {
|
|
|
281
345
|
(status === 'pending'
|
|
282
346
|
? `Some steps/hooks are pending for scenario "${world.pickle.name}"`
|
|
283
347
|
: 'Unknown Error'));
|
|
284
|
-
|
|
348
|
+
// For Cucumber with ignoreHooksStatus, check if failure is due to test steps or hooks
|
|
349
|
+
const ignoreHooksStatus = this._options.testObservabilityOptions?.ignoreHooksStatus === true;
|
|
350
|
+
if (ignoreHooksStatus && this._insightsHandler) {
|
|
351
|
+
// Check if any test steps failed (excluding hook failures)
|
|
352
|
+
const hasTestStepFailures = this._insightsHandler.hasTestStepFailures(world);
|
|
353
|
+
if (hasTestStepFailures) {
|
|
354
|
+
// Test steps failed - this is a pure test failure, add to both arrays
|
|
355
|
+
this._failReasons.push(exception);
|
|
356
|
+
this._pureTestFailReasons.push(exception);
|
|
357
|
+
}
|
|
358
|
+
// If no test steps failed, this is likely a hook-only failure - don't add to main failure arrays
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
// Default behavior: treat all scenario failures as test failures
|
|
362
|
+
this._failReasons.push(exception);
|
|
363
|
+
this._pureTestFailReasons.push(exception);
|
|
364
|
+
}
|
|
285
365
|
}
|
|
286
366
|
await this._accessibilityHandler?.afterScenario(world);
|
|
287
367
|
await this._insightsHandler?.afterScenario(world);
|
|
@@ -299,20 +379,33 @@ export default class BrowserstackService {
|
|
|
299
379
|
return Promise.resolve();
|
|
300
380
|
}
|
|
301
381
|
const { setSessionName, setSessionStatus } = this._options;
|
|
302
|
-
const
|
|
303
|
-
|
|
382
|
+
const ignoreHooksStatus = this._options.testObservabilityOptions?.ignoreHooksStatus === true;
|
|
383
|
+
let sessionStatus;
|
|
384
|
+
let failureReason;
|
|
385
|
+
if (ignoreHooksStatus) {
|
|
386
|
+
// Only consider pure test failures, ignore hook failures
|
|
387
|
+
const hasPureTestFailures = this._pureTestFailReasons.length > 0;
|
|
388
|
+
sessionStatus = hasPureTestFailures ? 'failed' : 'passed';
|
|
389
|
+
failureReason = hasPureTestFailures ? this._pureTestFailReasons.join('\n') : undefined;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
// Default behavior: consider all failures including hooks
|
|
393
|
+
const hasReasons = this._failReasons.length > 0;
|
|
394
|
+
sessionStatus = hasReasons ? 'failed' : 'passed';
|
|
395
|
+
failureReason = hasReasons ? this._failReasons.join('\n') : undefined;
|
|
396
|
+
}
|
|
304
397
|
if (!this._browser.isMultiremote) {
|
|
305
|
-
BStackLogger.info(`Update (reloaded) job with sessionId ${oldSessionId}, ${
|
|
398
|
+
BStackLogger.info(`Update (reloaded) job with sessionId ${oldSessionId}, ${sessionStatus}`);
|
|
306
399
|
}
|
|
307
400
|
else {
|
|
308
401
|
const browserName = this._browser.instances.filter((browserName) => this._browser && this._browser.getInstance(browserName).sessionId === newSessionId)[0];
|
|
309
|
-
BStackLogger.info(`Update (reloaded) multiremote job for browser "${browserName}" and sessionId ${oldSessionId}, ${
|
|
402
|
+
BStackLogger.info(`Update (reloaded) multiremote job for browser "${browserName}" and sessionId ${oldSessionId}, ${sessionStatus}`);
|
|
310
403
|
}
|
|
311
404
|
if (setSessionStatus) {
|
|
312
405
|
await this._update(oldSessionId, {
|
|
313
|
-
status,
|
|
406
|
+
status: sessionStatus,
|
|
314
407
|
...(setSessionName ? { name: this._fullTitle } : {}),
|
|
315
|
-
...(
|
|
408
|
+
...(failureReason ? { reason: failureReason } : {})
|
|
316
409
|
});
|
|
317
410
|
}
|
|
318
411
|
BStackLogger.warn(`Session Reloaded: Old Session Id: ${oldSessionId}, New Session Id: ${newSessionId}`);
|
|
@@ -321,6 +414,8 @@ export default class BrowserstackService {
|
|
|
321
414
|
delete this._fullTitle;
|
|
322
415
|
delete this._suiteFile;
|
|
323
416
|
this._failReasons = [];
|
|
417
|
+
this._hookFailReasons = [];
|
|
418
|
+
this._pureTestFailReasons = [];
|
|
324
419
|
await this._printSessionURL();
|
|
325
420
|
}
|
|
326
421
|
_isAppAutomate() {
|
package/build/testHub/utils.d.ts
CHANGED
|
@@ -4,4 +4,7 @@ export declare const shouldProcessEventForTesthub: (eventType: string) => boolea
|
|
|
4
4
|
export declare const handleErrorForObservability: (error: any) => void;
|
|
5
5
|
export declare const handleErrorForAccessibility: (error: any) => void;
|
|
6
6
|
export declare const logBuildError: (error: any, product?: string) => void;
|
|
7
|
+
export declare const getProductMapForBuildStartCall: (config: BrowserStackConfig, accessibilityAutomation: boolean | null) => {
|
|
8
|
+
[key: string]: boolean | null;
|
|
9
|
+
};
|
|
7
10
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/testHub/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,kBAAkB,MAAM,cAAc,CAAA;AAIlD,eAAO,MAAM,aAAa,WAAY,kBAAkB,KAAG,GAQ1D,CAAA;AAED,eAAO,MAAM,4BAA4B,cAAe,MAAM,KAAG,OAWhE,CAAA;AAED,eAAO,MAAM,2BAA2B,UAAW,GAAG,KAAG,IAGxD,CAAA;AAED,eAAO,MAAM,2BAA2B,UAAW,GAAG,KAAG,IAGxD,CAAA;AAED,eAAO,MAAM,aAAa,UAAW,GAAG,YAAW,MAAM,KAAQ,IAyBhE,CAAA"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/testHub/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,kBAAkB,MAAM,cAAc,CAAA;AAIlD,eAAO,MAAM,aAAa,WAAY,kBAAkB,KAAG,GAQ1D,CAAA;AAED,eAAO,MAAM,4BAA4B,cAAe,MAAM,KAAG,OAWhE,CAAA;AAED,eAAO,MAAM,2BAA2B,UAAW,GAAG,KAAG,IAGxD,CAAA;AAED,eAAO,MAAM,2BAA2B,UAAW,GAAG,KAAG,IAGxD,CAAA;AAED,eAAO,MAAM,aAAa,UAAW,GAAG,YAAW,MAAM,KAAQ,IAyBhE,CAAA;AAED,eAAO,MAAM,8BAA8B,WAAY,kBAAkB,2BAA2B,OAAO,GAAG,IAAI,KAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;CAQnJ,CAAA"}
|
package/build/testHub/utils.js
CHANGED
|
@@ -55,3 +55,12 @@ export const logBuildError = (error, product = '') => {
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
|
+
export const getProductMapForBuildStartCall = (config, accessibilityAutomation) => {
|
|
59
|
+
return {
|
|
60
|
+
observability: config.testObservability.enabled,
|
|
61
|
+
accessibility: accessibilityAutomation,
|
|
62
|
+
percy: config.percy,
|
|
63
|
+
automate: config.automate,
|
|
64
|
+
app_automate: config.appAutomate
|
|
65
|
+
};
|
|
66
|
+
};
|
package/build/types.d.ts
CHANGED
|
@@ -30,6 +30,13 @@ export interface TestObservabilityOptions {
|
|
|
30
30
|
buildTag?: string[];
|
|
31
31
|
user?: string;
|
|
32
32
|
key?: string;
|
|
33
|
+
/**
|
|
34
|
+
* When set to true, hook failures will not influence the test status.
|
|
35
|
+
* Tests will be marked as "passed" if all test steps pass, even if hooks fail.
|
|
36
|
+
* When set to false or not set (default), hook failures will mark tests as "failed".
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
ignoreHooksStatus?: boolean;
|
|
33
40
|
}
|
|
34
41
|
export interface BrowserstackOptions extends Options.Testrunner {
|
|
35
42
|
selfHeal?: boolean;
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,KAAK,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9D,MAAM,WAAW,eAAe;IAE5B,kBAAkB,EAAE;QAEhB,WAAW,EAAE,MAAM,CAAA;KACtB,CAAA;CACJ;AAED,MAAM,WAAW,yBAAyB;IACtC,GAAG,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE1F,MAAM,MAAM,SAAS,GAAG;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,GAAG;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/build/util.d.ts
CHANGED
|
@@ -68,7 +68,7 @@ interface DataElement {
|
|
|
68
68
|
[key: string]: any;
|
|
69
69
|
}
|
|
70
70
|
export declare const jsonifyAccessibilityArray: (dataArray: DataElement[], keyName: keyof DataElement, valueName: keyof DataElement) => Record<string, any>;
|
|
71
|
-
export declare const processAccessibilityResponse: (response: LaunchResponse) => void;
|
|
71
|
+
export declare const processAccessibilityResponse: (response: LaunchResponse, options: BrowserstackConfig & Options.Testrunner) => void;
|
|
72
72
|
export declare const processLaunchBuildResponse: (response: LaunchResponse, options: BrowserstackConfig & Options.Testrunner) => void;
|
|
73
73
|
export declare const launchTestSession: (...args: any[]) => any;
|
|
74
74
|
export declare const validateCapsWithAppA11y: (platformMeta?: {
|
|
@@ -77,13 +77,14 @@ export declare const validateCapsWithAppA11y: (platformMeta?: {
|
|
|
77
77
|
export declare const validateCapsWithA11y: (deviceName?: any, platformMeta?: {
|
|
78
78
|
[key: string]: any;
|
|
79
79
|
}, chromeOptions?: any) => boolean;
|
|
80
|
+
export declare const validateCapsWithNonBstackA11y: (browserName?: string | undefined, browserVersion?: string | undefined) => boolean;
|
|
80
81
|
export declare const shouldScanTestForAccessibility: (suiteTitle: string | undefined, testTitle: string, accessibilityOptions?: {
|
|
81
82
|
[key: string]: any;
|
|
82
83
|
}, world?: {
|
|
83
84
|
[key: string]: any;
|
|
84
85
|
}, isCucumber?: boolean) => boolean;
|
|
85
|
-
export declare const isAccessibilityAutomationSession: (accessibilityFlag?: boolean | string) => boolean | "" | undefined;
|
|
86
|
-
export declare const isAppAccessibilityAutomationSession: (accessibilityFlag?: boolean | string, isAppAutomate?: boolean) => boolean | "" | undefined;
|
|
86
|
+
export declare const isAccessibilityAutomationSession: (accessibilityFlag?: boolean | string | null) => boolean | "" | null | undefined;
|
|
87
|
+
export declare const isAppAccessibilityAutomationSession: (accessibilityFlag?: boolean | string, isAppAutomate?: boolean) => boolean | "" | null | undefined;
|
|
87
88
|
export declare const formatString: (template: (string | null), ...values: (string | null)[]) => string;
|
|
88
89
|
export declare const _getParamsForAppAccessibility: (commandName?: string) => {
|
|
89
90
|
thTestRunUuid: any;
|
|
@@ -192,5 +193,8 @@ type PollingResult = {
|
|
|
192
193
|
message?: string;
|
|
193
194
|
};
|
|
194
195
|
export declare function pollApi(url: string, params: Record<string, any>, headers: Record<string, string>, upperLimit: number, startTime?: number): Promise<PollingResult>;
|
|
196
|
+
export declare function getBooleanValueFromString(value: string | undefined): boolean;
|
|
197
|
+
export declare function mergeDeep(target: Record<string, any>, ...sources: any[]): Record<string, any>;
|
|
198
|
+
export declare function mergeChromeOptions(base: Capabilities.ChromeOptions, override: Partial<Capabilities.ChromeOptions>): Capabilities.ChromeOptions;
|
|
195
199
|
export {};
|
|
196
200
|
//# sourceMappingURL=util.d.ts.map
|
package/build/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/build/util.js
CHANGED
|
@@ -14,7 +14,7 @@ import { performance } from 'node:perf_hooks';
|
|
|
14
14
|
import logPatcher from './logPatcher.js';
|
|
15
15
|
import PerformanceTester from './instrumentation/performance/performance-tester.js';
|
|
16
16
|
import * as PERFORMANCE_SDK_EVENTS from './instrumentation/performance/constants.js';
|
|
17
|
-
import {
|
|
17
|
+
import { logBuildError, handleErrorForObservability, handleErrorForAccessibility, getProductMapForBuildStartCall } from './testHub/utils.js';
|
|
18
18
|
import { BROWSER_DESCRIPTION, DATA_ENDPOINT, UPLOAD_LOGS_ADDRESS, UPLOAD_LOGS_ENDPOINT, consoleHolder, BSTACK_A11Y_POLLING_TIMEOUT, TESTOPS_SCREENSHOT_ENV, BROWSERSTACK_TESTHUB_UUID, PERF_MEASUREMENT_ENV, RERUN_ENV, TESTOPS_BUILD_COMPLETED_ENV, BROWSERSTACK_TESTHUB_JWT, BROWSERSTACK_OBSERVABILITY, BROWSERSTACK_ACCESSIBILITY, MAX_GIT_META_DATA_SIZE_IN_BYTES, GIT_META_DATA_TRUNCATED, APP_ALLY_ENDPOINT, APP_ALLY_ISSUES_SUMMARY_ENDPOINT, APP_ALLY_ISSUES_ENDPOINT } from './constants.js';
|
|
19
19
|
import CrashReporter from './crash-reporter.js';
|
|
20
20
|
import { BStackLogger } from './bstackLogger.js';
|
|
@@ -226,9 +226,11 @@ export const jsonifyAccessibilityArray = (dataArray, keyName, valueName) => {
|
|
|
226
226
|
});
|
|
227
227
|
return result;
|
|
228
228
|
};
|
|
229
|
-
export const processAccessibilityResponse = (response) => {
|
|
229
|
+
export const processAccessibilityResponse = (response, options) => {
|
|
230
230
|
if (!response.accessibility) {
|
|
231
|
-
|
|
231
|
+
if (options.accessibility === true) {
|
|
232
|
+
handleErrorForAccessibility(null);
|
|
233
|
+
}
|
|
232
234
|
return;
|
|
233
235
|
}
|
|
234
236
|
if (!response.accessibility.success) {
|
|
@@ -237,9 +239,11 @@ export const processAccessibilityResponse = (response) => {
|
|
|
237
239
|
}
|
|
238
240
|
if (response.accessibility.options) {
|
|
239
241
|
const { accessibilityToken, pollingTimeout, scannerVersion } = jsonifyAccessibilityArray(response.accessibility.options.capabilities, 'name', 'value');
|
|
242
|
+
const result = jsonifyAccessibilityArray(response.accessibility.options.capabilities, 'name', 'value');
|
|
240
243
|
const scriptsJson = {
|
|
241
244
|
'scripts': jsonifyAccessibilityArray(response.accessibility.options.scripts, 'name', 'command'),
|
|
242
|
-
'commands': response.accessibility.options.commandsToWrap.commands
|
|
245
|
+
'commands': response.accessibility.options.commandsToWrap.commands,
|
|
246
|
+
'nonBStackInfraA11yChromeOptions': result['goog:chromeOptions']
|
|
243
247
|
};
|
|
244
248
|
if (scannerVersion) {
|
|
245
249
|
process.env.BSTACK_A11Y_SCANNER_VERSION = scannerVersion;
|
|
@@ -262,11 +266,9 @@ export const processLaunchBuildResponse = (response, options) => {
|
|
|
262
266
|
if (options.testObservability) {
|
|
263
267
|
processTestObservabilityResponse(response);
|
|
264
268
|
}
|
|
265
|
-
|
|
266
|
-
processAccessibilityResponse(response);
|
|
267
|
-
}
|
|
269
|
+
processAccessibilityResponse(response, options);
|
|
268
270
|
};
|
|
269
|
-
export const launchTestSession = PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.TESTHUB_EVENTS.START, o11yErrorHandler(async function launchTestSession(options, config, bsConfig, bStackConfig) {
|
|
271
|
+
export const launchTestSession = PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.TESTHUB_EVENTS.START, o11yErrorHandler(async function launchTestSession(options, config, bsConfig, bStackConfig, accessibilityAutomation) {
|
|
270
272
|
const launchBuildUsage = UsageStats.getInstance().launchBuildUsage;
|
|
271
273
|
launchBuildUsage.triggered();
|
|
272
274
|
const data = {
|
|
@@ -301,9 +303,13 @@ export const launchTestSession = PerformanceTester.measureWrapper(PERFORMANCE_SD
|
|
|
301
303
|
version: bsConfig.bstackServiceVersion
|
|
302
304
|
}
|
|
303
305
|
},
|
|
304
|
-
product_map:
|
|
306
|
+
product_map: getProductMapForBuildStartCall(bStackConfig, accessibilityAutomation),
|
|
305
307
|
config: {}
|
|
306
308
|
};
|
|
309
|
+
if (accessibilityAutomation && (isTurboScale(options) || data.browserstackAutomation === false)) {
|
|
310
|
+
data.accessibility.settings ??= {};
|
|
311
|
+
data.accessibility.settings.includeEncodedExtension = true;
|
|
312
|
+
}
|
|
307
313
|
try {
|
|
308
314
|
if (Object.keys(CrashReporter.userConfigForReporting).length === 0) {
|
|
309
315
|
CrashReporter.userConfigForReporting = process.env.USER_CONFIG_FOR_REPORTING !== undefined ? JSON.parse(process.env.USER_CONFIG_FOR_REPORTING) : {};
|
|
@@ -321,6 +327,7 @@ export const launchTestSession = PerformanceTester.measureWrapper(PERFORMANCE_SD
|
|
|
321
327
|
password: getObservabilityKey(options, config),
|
|
322
328
|
json: data
|
|
323
329
|
}).json();
|
|
330
|
+
delete data?.accessibility?.settings?.includeEncodedExtension;
|
|
324
331
|
BStackLogger.debug(`[Start_Build] Success response: ${JSON.stringify(response)}`);
|
|
325
332
|
process.env[TESTOPS_BUILD_COMPLETED_ENV] = 'true';
|
|
326
333
|
if (response.jwt) {
|
|
@@ -333,13 +340,14 @@ export const launchTestSession = PerformanceTester.measureWrapper(PERFORMANCE_SD
|
|
|
333
340
|
}
|
|
334
341
|
processLaunchBuildResponse(response, options);
|
|
335
342
|
launchBuildUsage.success();
|
|
343
|
+
return response;
|
|
336
344
|
}
|
|
337
345
|
catch (error) {
|
|
338
346
|
if (!error.success) {
|
|
339
347
|
launchBuildUsage.failed(error);
|
|
340
348
|
logBuildError(error);
|
|
341
|
-
return;
|
|
342
349
|
}
|
|
350
|
+
return null;
|
|
343
351
|
}
|
|
344
352
|
}));
|
|
345
353
|
export const validateCapsWithAppA11y = (platformMeta) => {
|
|
@@ -381,6 +389,17 @@ export const validateCapsWithA11y = (deviceName, platformMeta, chromeOptions) =>
|
|
|
381
389
|
}
|
|
382
390
|
return false;
|
|
383
391
|
};
|
|
392
|
+
export const validateCapsWithNonBstackA11y = (browserName, browserVersion) => {
|
|
393
|
+
if (browserName?.toLowerCase() !== 'chrome') {
|
|
394
|
+
BStackLogger.warn('Accessibility Automation will run only on Chrome browsers.');
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
if (!isUndefined(browserVersion) && !(browserVersion === 'latest' || parseFloat(browserVersion + '') > 100)) {
|
|
398
|
+
BStackLogger.warn('Accessibility Automation will run only on Chrome browser version greater than 100.');
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
return true;
|
|
402
|
+
};
|
|
384
403
|
export const shouldScanTestForAccessibility = (suiteTitle, testTitle, accessibilityOptions, world, isCucumber) => {
|
|
385
404
|
try {
|
|
386
405
|
const includeTags = Array.isArray(accessibilityOptions?.includeTagsInTestingScope) ? accessibilityOptions?.includeTagsInTestingScope : [];
|
|
@@ -438,10 +457,6 @@ export const _getParamsForAppAccessibility = (commandName) => {
|
|
|
438
457
|
};
|
|
439
458
|
export const performA11yScan = async (isAppAutomate, browser, isBrowserStackSession, isAccessibility, commandName) => {
|
|
440
459
|
return await PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.A11Y_EVENTS.PERFORM_SCAN, async () => {
|
|
441
|
-
if (!isBrowserStackSession) {
|
|
442
|
-
BStackLogger.warn('Not a BrowserStack Automate session, cannot perform Accessibility scan.');
|
|
443
|
-
return; // since we are running only on Automate as of now
|
|
444
|
-
}
|
|
445
460
|
if (!isAccessibilityAutomationSession(isAccessibility)) {
|
|
446
461
|
BStackLogger.warn('Not an Accessibility Automation session, cannot perform Accessibility scan.');
|
|
447
462
|
return;
|
|
@@ -463,10 +478,6 @@ export const performA11yScan = async (isAppAutomate, browser, isBrowserStackSess
|
|
|
463
478
|
}, { command: commandName })();
|
|
464
479
|
};
|
|
465
480
|
export const getA11yResults = PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.A11Y_EVENTS.GET_RESULTS, async (isAppAutomate, browser, isBrowserStackSession, isAccessibility) => {
|
|
466
|
-
if (!isBrowserStackSession) {
|
|
467
|
-
BStackLogger.warn('Not a BrowserStack Automate session, cannot retrieve Accessibility results.');
|
|
468
|
-
return []; // since we are running only on Automate as of now
|
|
469
|
-
}
|
|
470
481
|
if (!isAccessibilityAutomationSession(isAccessibility)) {
|
|
471
482
|
BStackLogger.warn('Not an Accessibility Automation session, cannot retrieve Accessibility results.');
|
|
472
483
|
return [];
|
|
@@ -535,9 +546,6 @@ const getAppA11yResultResponse = async (apiUrl, isAppAutomate, browser, isBrowse
|
|
|
535
546
|
return apiRespone;
|
|
536
547
|
};
|
|
537
548
|
export const getA11yResultsSummary = PerformanceTester.measureWrapper(PERFORMANCE_SDK_EVENTS.A11Y_EVENTS.GET_RESULTS_SUMMARY, async (isAppAutomate, browser, isBrowserStackSession, isAccessibility) => {
|
|
538
|
-
if (!isBrowserStackSession) {
|
|
539
|
-
return {}; // since we are running only on Automate as of now
|
|
540
|
-
}
|
|
541
549
|
if (!isAccessibilityAutomationSession(isAccessibility)) {
|
|
542
550
|
BStackLogger.warn('Not an Accessibility Automation session, cannot retrieve Accessibility results summary.');
|
|
543
551
|
return {};
|
|
@@ -1369,3 +1377,44 @@ export async function pollApi(url, params, headers, upperLimit, startTime = Date
|
|
|
1369
1377
|
}
|
|
1370
1378
|
}
|
|
1371
1379
|
}
|
|
1380
|
+
export function getBooleanValueFromString(value) {
|
|
1381
|
+
if (!value) {
|
|
1382
|
+
return false;
|
|
1383
|
+
}
|
|
1384
|
+
return ['true'].includes(value.trim().toLowerCase());
|
|
1385
|
+
}
|
|
1386
|
+
export function mergeDeep(target, ...sources) {
|
|
1387
|
+
if (!sources.length) {
|
|
1388
|
+
return target;
|
|
1389
|
+
}
|
|
1390
|
+
const source = sources.shift();
|
|
1391
|
+
if (isObject(target) && isObject(source)) {
|
|
1392
|
+
for (const key in source) {
|
|
1393
|
+
const sourceValue = source[key];
|
|
1394
|
+
const targetValue = target[key];
|
|
1395
|
+
if (isObject(sourceValue)) {
|
|
1396
|
+
if (!targetValue || !isObject(targetValue)) {
|
|
1397
|
+
target[key] = {};
|
|
1398
|
+
}
|
|
1399
|
+
mergeDeep(target[key], sourceValue);
|
|
1400
|
+
}
|
|
1401
|
+
else {
|
|
1402
|
+
target[key] = sourceValue;
|
|
1403
|
+
}
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
return mergeDeep(target, ...sources);
|
|
1407
|
+
}
|
|
1408
|
+
export function mergeChromeOptions(base, override) {
|
|
1409
|
+
const merged = { ...base };
|
|
1410
|
+
if (override.args) {
|
|
1411
|
+
merged.args = [...(base.args || []), ...override.args];
|
|
1412
|
+
}
|
|
1413
|
+
if (override.extensions) {
|
|
1414
|
+
merged.extensions = [...(base.extensions || []), ...override.extensions];
|
|
1415
|
+
}
|
|
1416
|
+
if (override.prefs) {
|
|
1417
|
+
merged.prefs = mergeDeep({ ...(base.prefs || {}) }, override.prefs);
|
|
1418
|
+
}
|
|
1419
|
+
return merged;
|
|
1420
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wdio/browserstack-service",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.46.0",
|
|
4
4
|
"description": "WebdriverIO service for better Browserstack integration",
|
|
5
5
|
"author": "Adam Bjerstedt <abjerstedt@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-browserstack-service",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"gitconfiglocal": "^2.1.0",
|
|
46
46
|
"got": "^12.6.1",
|
|
47
47
|
"uuid": "^10.0.0",
|
|
48
|
-
"webdriverio": "8.
|
|
48
|
+
"webdriverio": "8.46.0",
|
|
49
49
|
"winston-transport": "^4.5.0",
|
|
50
50
|
"yauzl": "^3.0.0"
|
|
51
51
|
},
|
|
@@ -54,10 +54,10 @@
|
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^22.2.0",
|
|
57
|
-
"@wdio/globals": "8.
|
|
57
|
+
"@wdio/globals": "8.46.0"
|
|
58
58
|
},
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "8f557271fbf5579061cd4bb2151871b0832cf811"
|
|
63
63
|
}
|