@wdio/browserstack-service 8.40.0 → 8.40.3
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/ai-handler.d.ts +23 -0
- package/build/ai-handler.d.ts.map +1 -0
- package/build/ai-handler.js +172 -0
- package/build/constants.d.ts +7 -0
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +8 -0
- package/build/instrumentation/funnelInstrumentation.d.ts +2 -0
- package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -1
- package/build/instrumentation/funnelInstrumentation.js +69 -0
- package/build/launcher.d.ts +3 -3
- package/build/launcher.d.ts.map +1 -1
- package/build/launcher.js +26 -1
- package/build/service.d.ts.map +1 -1
- package/build/service.js +13 -1
- package/build/types.d.ts +3 -0
- package/build/types.d.ts.map +1 -1
- package/build/util.d.ts +10 -1
- package/build/util.d.ts.map +1 -1
- package/build/util.js +65 -2
- package/package.json +8 -7
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Capabilities } from '@wdio/types';
|
|
2
|
+
import type BrowserStackConfig from './config.js';
|
|
3
|
+
import type { Options } from '@wdio/types';
|
|
4
|
+
import type { BrowserstackHealing } from '@browserstack/ai-sdk-node';
|
|
5
|
+
import type { BrowserstackOptions } from './types.js';
|
|
6
|
+
declare class AiHandler {
|
|
7
|
+
authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse;
|
|
8
|
+
wdioBstackVersion: string;
|
|
9
|
+
constructor();
|
|
10
|
+
authenticateUser(user: string, key: string): Promise<BrowserstackHealing.InitErrorResponse | BrowserstackHealing.InitSuccessResponse>;
|
|
11
|
+
updateCaps(authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse, options: BrowserstackOptions, caps: Array<Capabilities.RemoteCapability> | Capabilities.RemoteCapability): Capabilities.RemoteCapability | Capabilities.RemoteCapability[];
|
|
12
|
+
setToken(sessionId: string, sessionToken: string): Promise<void>;
|
|
13
|
+
installFirefoxExtension(browser: WebdriverIO.Browser): Promise<void>;
|
|
14
|
+
handleHealing(orginalFunc: (arg0: string, arg1: string) => any, using: string, value: string, browser: WebdriverIO.Browser, options: BrowserstackOptions): Promise<any>;
|
|
15
|
+
addMultiRemoteCaps(authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse, config: Options.Testrunner, browserStackConfig: BrowserStackConfig, options: BrowserstackOptions, caps: any, browser: string): void;
|
|
16
|
+
handleMultiRemoteSetup(authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse, config: Options.Testrunner, browserStackConfig: BrowserStackConfig, options: BrowserstackOptions, caps: any): void;
|
|
17
|
+
setup(config: Options.Testrunner, browserStackConfig: BrowserStackConfig, options: BrowserstackOptions, caps: any, isMultiremote: boolean): Promise<any>;
|
|
18
|
+
handleSelfHeal(options: BrowserstackOptions, browser: WebdriverIO.Browser): Promise<void>;
|
|
19
|
+
selfHeal(options: BrowserstackOptions, caps: Capabilities.RemoteCapability, browser: WebdriverIO.Browser): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
declare const _default: AiHandler;
|
|
22
|
+
export default _default;
|
|
23
|
+
//# sourceMappingURL=ai-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-handler.d.ts","sourceRoot":"","sources":["../src/ai-handler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,kBAAkB,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAErD,cAAM,SAAS;IACX,UAAU,EAAE,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,iBAAiB,CAAA;IAC3F,iBAAiB,EAAE,MAAM,CAAA;;IAMnB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIhD,UAAU,CACN,UAAU,EAAE,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,iBAAiB,EAC3F,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,YAAY,CAAC,gBAAgB;IAkBxE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAIhD,uBAAuB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO;IAOpD,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB;IAoD9J,kBAAkB,CACd,UAAU,EAAE,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,iBAAiB,EAC3F,MAAM,EAAE,OAAO,CAAC,UAAU,EAC1B,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,MAAM;IAcnB,sBAAsB,CAClB,UAAU,EAAE,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,iBAAiB,EAC3F,MAAM,EAAE,OAAO,CAAC,UAAU,EAC1B,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,GAAG;IASP,KAAK,CACP,MAAM,EAAE,OAAO,CAAC,UAAU,EAC1B,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,GAAG,EACT,aAAa,EAAE,OAAO;IA0BpB,cAAc,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO;IA0BzE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO;CAmBjH;;AAED,wBAA8B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import url from 'node:url';
|
|
4
|
+
import aiSDK from '@browserstack/ai-sdk-node';
|
|
5
|
+
import { BStackLogger } from './bstackLogger.js';
|
|
6
|
+
import { TCG_URL, TCG_INFO, SUPPORTED_BROWSERS_FOR_AI, BSTACK_SERVICE_VERSION, BSTACK_TCG_AUTH_RESULT } from './constants.js';
|
|
7
|
+
import { handleHealingInstrumentation } from './instrumentation/funnelInstrumentation.js';
|
|
8
|
+
import { getBrowserStackUserAndKey, isBrowserstackInfra } from './util.js';
|
|
9
|
+
class AiHandler {
|
|
10
|
+
authResult;
|
|
11
|
+
wdioBstackVersion;
|
|
12
|
+
constructor() {
|
|
13
|
+
this.authResult = JSON.parse(process.env[BSTACK_TCG_AUTH_RESULT] || '{}');
|
|
14
|
+
this.wdioBstackVersion = BSTACK_SERVICE_VERSION;
|
|
15
|
+
}
|
|
16
|
+
async authenticateUser(user, key) {
|
|
17
|
+
return await aiSDK.BrowserstackHealing.init(key, user, TCG_URL, this.wdioBstackVersion);
|
|
18
|
+
}
|
|
19
|
+
updateCaps(authResult, options, caps) {
|
|
20
|
+
const installExtCondition = authResult.isAuthenticated === true && (authResult.defaultLogDataEnabled === true || options.selfHeal === true);
|
|
21
|
+
if (installExtCondition) {
|
|
22
|
+
if (Array.isArray(caps)) {
|
|
23
|
+
const newCaps = aiSDK.BrowserstackHealing.initializeCapabilities(caps[0]);
|
|
24
|
+
caps[0] = newCaps;
|
|
25
|
+
}
|
|
26
|
+
else if (typeof caps === 'object') {
|
|
27
|
+
caps = aiSDK.BrowserstackHealing.initializeCapabilities(caps);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (options.selfHeal === true) {
|
|
31
|
+
const healingWarnMessage = authResult.message;
|
|
32
|
+
BStackLogger.warn(`Healing Auth failed. Disabling healing for this session. Reason: ${healingWarnMessage}`);
|
|
33
|
+
}
|
|
34
|
+
return caps;
|
|
35
|
+
}
|
|
36
|
+
async setToken(sessionId, sessionToken) {
|
|
37
|
+
await aiSDK.BrowserstackHealing.setToken(sessionId, sessionToken, TCG_URL);
|
|
38
|
+
}
|
|
39
|
+
async installFirefoxExtension(browser) {
|
|
40
|
+
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
|
|
41
|
+
const extensionPath = path.resolve(__dirname, aiSDK.BrowserstackHealing.getFirefoxAddonPath());
|
|
42
|
+
const extFile = fs.readFileSync(extensionPath);
|
|
43
|
+
await browser.installAddOn(extFile.toString('base64'), true);
|
|
44
|
+
}
|
|
45
|
+
async handleHealing(orginalFunc, using, value, browser, options) {
|
|
46
|
+
const sessionId = browser.sessionId;
|
|
47
|
+
// a utility function to escape single and double quotes
|
|
48
|
+
const escapeString = (str) => str.replace(/'/g, "\\'").replace(/"/g, '\\"');
|
|
49
|
+
const tcgDetails = escapeString(JSON.stringify({
|
|
50
|
+
region: TCG_INFO.tcgRegion,
|
|
51
|
+
tcgUrls: {
|
|
52
|
+
[TCG_INFO.tcgRegion]: {
|
|
53
|
+
endpoint: TCG_INFO.tcgUrl.split('://')[1]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}));
|
|
57
|
+
const locatorType = escapeString(using);
|
|
58
|
+
const locatorValue = escapeString(value);
|
|
59
|
+
this.authResult = this.authResult;
|
|
60
|
+
try {
|
|
61
|
+
const result = await orginalFunc(using, value);
|
|
62
|
+
if (!result.error) {
|
|
63
|
+
const script = await aiSDK.BrowserstackHealing.logData(locatorType, locatorValue, undefined, undefined, this.authResult.groupId, sessionId, undefined, tcgDetails);
|
|
64
|
+
if (script) {
|
|
65
|
+
await browser.execute(script);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
if (options.selfHeal === true && this.authResult.isHealingEnabled) {
|
|
70
|
+
BStackLogger.info('findElement failed, trying to heal');
|
|
71
|
+
const script = await aiSDK.BrowserstackHealing.healFailure(locatorType, locatorValue, undefined, undefined, this.authResult.userId, this.authResult.groupId, sessionId, undefined, undefined, this.authResult.isGroupAIEnabled, tcgDetails);
|
|
72
|
+
if (script) {
|
|
73
|
+
await browser.execute(script);
|
|
74
|
+
const tcgData = await aiSDK.BrowserstackHealing.pollResult(TCG_URL, sessionId, this.authResult.sessionToken);
|
|
75
|
+
if (tcgData && tcgData.selector && tcgData.value) {
|
|
76
|
+
const healedResult = await orginalFunc(tcgData.selector, tcgData.value);
|
|
77
|
+
BStackLogger.info('Healing worked, element found: ' + tcgData.selector + ': ' + tcgData.value);
|
|
78
|
+
return healedResult.error ? result : healedResult;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
if (options.selfHeal === true) {
|
|
85
|
+
BStackLogger.warn('Something went wrong while healing. Disabling healing for this command');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
BStackLogger.warn('Error in findElement: ' + err + 'using: ' + using + 'value: ' + value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return await orginalFunc(using, value);
|
|
92
|
+
}
|
|
93
|
+
addMultiRemoteCaps(authResult, config, browserStackConfig, options, caps, browser) {
|
|
94
|
+
if (caps[browser].capabilities &&
|
|
95
|
+
!(isBrowserstackInfra(caps[browser])) &&
|
|
96
|
+
SUPPORTED_BROWSERS_FOR_AI.includes(caps[browser]?.capabilities?.browserName?.toLowerCase())) {
|
|
97
|
+
const innerConfig = getBrowserStackUserAndKey(config, options);
|
|
98
|
+
if (innerConfig?.user && innerConfig.key) {
|
|
99
|
+
handleHealingInstrumentation(authResult, browserStackConfig, options.selfHeal);
|
|
100
|
+
caps[browser].capabilities = this.updateCaps(authResult, options, caps[browser].capabilities);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
handleMultiRemoteSetup(authResult, config, browserStackConfig, options, caps) {
|
|
105
|
+
const browserNames = Object.keys(caps);
|
|
106
|
+
for (let i = 0; i < browserNames.length; i++) {
|
|
107
|
+
const browser = browserNames[i];
|
|
108
|
+
this.addMultiRemoteCaps(authResult, config, browserStackConfig, options, caps, browser);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async setup(config, browserStackConfig, options, caps, isMultiremote) {
|
|
112
|
+
try {
|
|
113
|
+
const innerConfig = getBrowserStackUserAndKey(config, options);
|
|
114
|
+
if (innerConfig?.user && innerConfig.key) {
|
|
115
|
+
const authResult = await this.authenticateUser(innerConfig.user, innerConfig.key);
|
|
116
|
+
process.env[BSTACK_TCG_AUTH_RESULT] = JSON.stringify(authResult);
|
|
117
|
+
if (!isMultiremote && SUPPORTED_BROWSERS_FOR_AI.includes(caps?.browserName?.toLowerCase())) {
|
|
118
|
+
handleHealingInstrumentation(authResult, browserStackConfig, options.selfHeal);
|
|
119
|
+
this.updateCaps(authResult, options, caps);
|
|
120
|
+
}
|
|
121
|
+
else if (isMultiremote) {
|
|
122
|
+
this.handleMultiRemoteSetup(authResult, config, browserStackConfig, options, caps);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
if (options.selfHeal === true) {
|
|
128
|
+
BStackLogger.warn(`Error while initiliazing Browserstack healing Extension ${err}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return caps;
|
|
132
|
+
}
|
|
133
|
+
async handleSelfHeal(options, browser) {
|
|
134
|
+
if (SUPPORTED_BROWSERS_FOR_AI.includes(browser.capabilities?.browserName?.toLowerCase())) {
|
|
135
|
+
const authInfo = this.authResult;
|
|
136
|
+
if (Object.keys(authInfo).length === 0 && options.selfHeal === true) {
|
|
137
|
+
BStackLogger.debug('TCG Auth result is empty');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const { isAuthenticated, sessionToken, defaultLogDataEnabled } = authInfo;
|
|
141
|
+
if (isAuthenticated && (defaultLogDataEnabled === true || options.selfHeal === true)) {
|
|
142
|
+
await this.setToken(browser.sessionId, sessionToken);
|
|
143
|
+
if (browser.capabilities.browserName === 'firefox') {
|
|
144
|
+
await this.installFirefoxExtension(browser);
|
|
145
|
+
}
|
|
146
|
+
browser.overwriteCommand('findElement', async (orginalFunc, using, value) => {
|
|
147
|
+
return await this.handleHealing(orginalFunc, using, value, browser, options);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async selfHeal(options, caps, browser) {
|
|
153
|
+
try {
|
|
154
|
+
const multiRemoteBrowsers = Object.keys(caps).filter(e => Object.keys(browser).includes(e));
|
|
155
|
+
if (multiRemoteBrowsers.length > 0) {
|
|
156
|
+
for (let i = 0; i < multiRemoteBrowsers.length; i++) {
|
|
157
|
+
const remoteBrowser = browser[multiRemoteBrowsers[i]];
|
|
158
|
+
await this.handleSelfHeal(options, remoteBrowser);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
await this.handleSelfHeal(options, browser);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (options.selfHeal === true) {
|
|
167
|
+
BStackLogger.warn(`Error while setting up self-healing: ${err}. Disabling healing for this session.`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export default new AiHandler();
|
package/build/constants.d.ts
CHANGED
|
@@ -28,7 +28,14 @@ export declare const LOG_KIND_USAGE_MAP: {
|
|
|
28
28
|
HTTP: string;
|
|
29
29
|
};
|
|
30
30
|
export declare const FUNNEL_INSTRUMENTATION_URL = "https://api.browserstack.com/sdk/v1/event";
|
|
31
|
+
export declare const SUPPORTED_BROWSERS_FOR_AI: string[];
|
|
32
|
+
export declare const TCG_URL = "https://tcg.browserstack.com";
|
|
33
|
+
export declare const TCG_INFO: {
|
|
34
|
+
tcgRegion: string;
|
|
35
|
+
tcgUrl: string;
|
|
36
|
+
};
|
|
31
37
|
export declare const TESTOPS_JWT_ENV = "BS_TESTOPS_JWT";
|
|
38
|
+
export declare const BSTACK_TCG_AUTH_RESULT = "BSTACK_TCG_AUTH_RESULT";
|
|
32
39
|
export declare const TESTOPS_SCREENSHOT_ENV = "BS_TESTOPS_ALLOW_SCREENSHOTS";
|
|
33
40
|
export declare const TESTOPS_BUILD_ID_ENV = "BS_TESTOPS_BUILD_HASHED_ID";
|
|
34
41
|
export declare const PERF_MEASUREMENT_ENV = "BROWSERSTACK_O11Y_PERF_MEASUREMENT";
|
package/build/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKpD,eAAO,MAAM,mBAAmB,qHAStB,CAAA;AAEV,eAAO,MAAM,mBAAmB,UAI/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAKvD,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,OAAO,OAAoC,CAAA;AAEvE,eAAO,MAAM,aAAa,qDAAqD,CAAA;AAC/E,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAC5D,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,iBAAiB,UAAgH,CAAA;AAC9I,eAAO,MAAM,wCAAwC,OAAO,CAAA;AAC5D,eAAO,MAAM,yCAAyC,MAAM,CAAA;AAC5D,eAAO,MAAM,sBAAsB,KAAuB,CAAA;AAE1D,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AACjF,eAAO,MAAM,wBAAwB,UAA6D,CAAA;AAElG,eAAO,MAAM,SAAS,iCAAiC,CAAA;AACvD,eAAO,MAAM,mBAAmB,kDAAkD,CAAA;AAClF,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAE/C,eAAO,MAAM,qCAAqC,UAQjD,CAAA;AAED,eAAO,MAAM,aAAa,UAAwD,CAAA;AAElF,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAA;AAED,eAAO,MAAM,0BAA0B,8CAA8C,CAAA;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKpD,eAAO,MAAM,mBAAmB,qHAStB,CAAA;AAEV,eAAO,MAAM,mBAAmB,UAI/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAKvD,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,OAAO,OAAoC,CAAA;AAEvE,eAAO,MAAM,aAAa,qDAAqD,CAAA;AAC/E,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAC5D,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,iBAAiB,UAAgH,CAAA;AAC9I,eAAO,MAAM,wCAAwC,OAAO,CAAA;AAC5D,eAAO,MAAM,yCAAyC,MAAM,CAAA;AAC5D,eAAO,MAAM,sBAAsB,KAAuB,CAAA;AAE1D,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AACjF,eAAO,MAAM,wBAAwB,UAA6D,CAAA;AAElG,eAAO,MAAM,SAAS,iCAAiC,CAAA;AACvD,eAAO,MAAM,mBAAmB,kDAAkD,CAAA;AAClF,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAE/C,eAAO,MAAM,qCAAqC,UAQjD,CAAA;AAED,eAAO,MAAM,aAAa,UAAwD,CAAA;AAElF,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAA;AAED,eAAO,MAAM,0BAA0B,8CAA8C,CAAA;AAErF,eAAO,MAAM,yBAAyB,UAAyC,CAAA;AAE/E,eAAO,MAAM,OAAO,iCAAiC,CAAA;AAErD,eAAO,MAAM,QAAQ;;;CAGpB,CAAA;AAKD,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAG/C,eAAO,MAAM,sBAAsB,2BAA2B,CAAA;AAG9D,eAAO,MAAM,sBAAsB,iCAAiC,CAAA;AAGpE,eAAO,MAAM,oBAAoB,+BAA+B,CAAA;AAGhE,eAAO,MAAM,oBAAoB,uCAAuC,CAAA;AAGxE,eAAO,MAAM,eAAe,6BAA6B,CAAA;AAGzD,eAAO,MAAM,SAAS,uBAAuB,CAAA;AAG7C,eAAO,MAAM,2BAA2B,+BAA+B,CAAA;AAGvE,eAAO,MAAM,+BAA+B,QAAY,CAAA;AAKxD,eAAO,MAAM,uBAAuB,mBAAmB,CAAA"}
|
package/build/constants.js
CHANGED
|
@@ -56,9 +56,17 @@ export const LOG_KIND_USAGE_MAP = {
|
|
|
56
56
|
'HTTP': 'http'
|
|
57
57
|
};
|
|
58
58
|
export const FUNNEL_INSTRUMENTATION_URL = 'https://api.browserstack.com/sdk/v1/event';
|
|
59
|
+
export const SUPPORTED_BROWSERS_FOR_AI = ['chrome', 'microsoftedge', 'firefox'];
|
|
60
|
+
export const TCG_URL = 'https://tcg.browserstack.com';
|
|
61
|
+
export const TCG_INFO = {
|
|
62
|
+
tcgRegion: 'use',
|
|
63
|
+
tcgUrl: TCG_URL,
|
|
64
|
+
};
|
|
59
65
|
// Env variables - Define all the env variable constants over here
|
|
60
66
|
// To store the JWT token returned the session launch
|
|
61
67
|
export const TESTOPS_JWT_ENV = 'BS_TESTOPS_JWT';
|
|
68
|
+
// To store tcg auth result for selfHealing feature:
|
|
69
|
+
export const BSTACK_TCG_AUTH_RESULT = 'BSTACK_TCG_AUTH_RESULT';
|
|
62
70
|
// To store the setting of whether to send screenshots or not
|
|
63
71
|
export const TESTOPS_SCREENSHOT_ENV = 'BS_TESTOPS_ALLOW_SCREENSHOTS';
|
|
64
72
|
// To store build hashed id
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type BrowserStackConfig from '../config.js';
|
|
2
|
+
import type { BrowserstackHealing } from '@browserstack/ai-sdk-node';
|
|
2
3
|
export declare function sendStart(config: BrowserStackConfig): Promise<void>;
|
|
3
4
|
export declare function sendFinish(config: BrowserStackConfig): Promise<void>;
|
|
4
5
|
export declare function saveFunnelData(eventType: string, config: BrowserStackConfig): string;
|
|
5
6
|
export declare function fireFunnelRequest(data: any): Promise<void>;
|
|
7
|
+
export declare function handleHealingInstrumentation(authResult: BrowserstackHealing.InitErrorResponse | BrowserstackHealing.InitSuccessResponse, config: BrowserStackConfig, isSelfHealEnabled: boolean | undefined): void;
|
|
6
8
|
//# sourceMappingURL=funnelInstrumentation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funnelInstrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/funnelInstrumentation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,kBAAkB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"funnelInstrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/funnelInstrumentation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,kBAAkB,MAAM,cAAc,CAAA;AAGlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAoBpE,wBAAsB,SAAS,CAAC,MAAM,EAAE,kBAAkB,iBAIzD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,kBAAkB,iBAE1D;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAOpF;AAGD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhE;AAsJD,wBAAgB,4BAA4B,CACxC,UAAU,EAAE,mBAAmB,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,mBAAmB,EAC3F,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,OAAO,GAAG,SAAS,QA6BzC"}
|
|
@@ -128,3 +128,72 @@ function getReferrer(framework) {
|
|
|
128
128
|
const fullName = framework ? 'WebdriverIO-' + framework : 'WebdriverIO';
|
|
129
129
|
return `${fullName}/${BSTACK_SERVICE_VERSION}`;
|
|
130
130
|
}
|
|
131
|
+
const sendEvent = {
|
|
132
|
+
tcgDown: (config) => fireFunnelTestEvent('SDKTestTcgDownResponse', config),
|
|
133
|
+
invalidTcgAuth: (config) => fireFunnelTestEvent('SDKTestInvalidTcgAuthResponseWithUserImpact', config),
|
|
134
|
+
tcgAuthFailure: (config) => fireFunnelTestEvent('SDKTestTcgAuthFailure', config),
|
|
135
|
+
tcgtInitSuccessful: (config) => fireFunnelTestEvent('SDKTestTcgtInitSuccessful', config),
|
|
136
|
+
initFailed: (config) => fireFunnelTestEvent('SDKTestInitFailedResponse', config),
|
|
137
|
+
};
|
|
138
|
+
function handleUpgradeRequired(isSelfHealEnabled) {
|
|
139
|
+
if (isSelfHealEnabled) {
|
|
140
|
+
BStackLogger.warn('Please upgrade Browserstack Service to the latest version to use the self-healing feature.');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function handleAuthenticationFailure(status, config, isSelfHealEnabled) {
|
|
144
|
+
if (status >= 500) {
|
|
145
|
+
if (isSelfHealEnabled) {
|
|
146
|
+
BStackLogger.warn('Something went wrong. Disabling healing for this session. Please try again later.');
|
|
147
|
+
}
|
|
148
|
+
sendEvent.tcgDown(config);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
if (isSelfHealEnabled) {
|
|
152
|
+
BStackLogger.warn('Authentication Failed. Disabling Healing for this session.');
|
|
153
|
+
}
|
|
154
|
+
sendEvent.tcgAuthFailure(config);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function handleAuthenticationSuccess(isHealingEnabledForUser, userId, config, isSelfHealEnabled) {
|
|
158
|
+
if (!isHealingEnabledForUser && isSelfHealEnabled) {
|
|
159
|
+
BStackLogger.warn('Healing is not enabled for your group, please contact the admin');
|
|
160
|
+
}
|
|
161
|
+
else if (userId && isHealingEnabledForUser) {
|
|
162
|
+
sendEvent.tcgtInitSuccessful(config);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function handleInitializationFailure(status, config, isSelfHealEnabled) {
|
|
166
|
+
if (status >= 400) {
|
|
167
|
+
sendEvent.initFailed(config);
|
|
168
|
+
}
|
|
169
|
+
else if (!status && isSelfHealEnabled) {
|
|
170
|
+
sendEvent.invalidTcgAuth(config);
|
|
171
|
+
}
|
|
172
|
+
if (isSelfHealEnabled) {
|
|
173
|
+
BStackLogger.warn('Authentication Failed. Healing will be disabled for this session.');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
export function handleHealingInstrumentation(authResult, config, isSelfHealEnabled) {
|
|
177
|
+
try {
|
|
178
|
+
const { message, isAuthenticated, status, userId, groupId, isHealingEnabled: isHealingEnabledForUser } = authResult;
|
|
179
|
+
if (message === 'Upgrade required') {
|
|
180
|
+
handleUpgradeRequired(isSelfHealEnabled);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (!isAuthenticated) {
|
|
184
|
+
handleAuthenticationFailure(status, config, isSelfHealEnabled);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (isAuthenticated && userId && groupId) {
|
|
188
|
+
handleAuthenticationSuccess(isHealingEnabledForUser, userId, config, isSelfHealEnabled);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (status >= 400 || !status) {
|
|
192
|
+
handleInitializationFailure(status, config, isSelfHealEnabled);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
BStackLogger.debug('Error in handling healing instrumentation: ' + err);
|
|
198
|
+
}
|
|
199
|
+
}
|
package/build/launcher.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as BrowserstackLocalLauncher from 'browserstack-local';
|
|
2
2
|
import type { Capabilities, Services, Options } from '@wdio/types';
|
|
3
|
-
import type { BrowserstackConfig, App, AppConfig, AppUploadResponse, UserConfig } from './types.js';
|
|
3
|
+
import type { BrowserstackConfig, App, AppConfig, AppUploadResponse, UserConfig, BrowserstackOptions } from './types.js';
|
|
4
4
|
type BrowserstackLocal = BrowserstackLocalLauncher.Local & {
|
|
5
5
|
pid?: number;
|
|
6
6
|
stop(callback: (err?: Error) => void): void;
|
|
@@ -17,9 +17,9 @@ export default class BrowserstackLauncherService implements Services.ServiceInst
|
|
|
17
17
|
private _percy?;
|
|
18
18
|
private _percyBestPlatformCaps?;
|
|
19
19
|
private readonly browserStackConfig;
|
|
20
|
-
constructor(_options: BrowserstackConfig &
|
|
20
|
+
constructor(_options: BrowserstackConfig & BrowserstackOptions, capabilities: Capabilities.RemoteCapability, _config: Options.Testrunner);
|
|
21
21
|
onWorkerStart(cid: any, caps: any): Promise<void>;
|
|
22
|
-
onPrepare(config
|
|
22
|
+
onPrepare(config: Options.Testrunner, capabilities: Capabilities.RemoteCapabilities): Promise<unknown>;
|
|
23
23
|
onComplete(): Promise<unknown>;
|
|
24
24
|
setupPercy(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner, bsConfig: UserConfig): Promise<void>;
|
|
25
25
|
stopPercy(): Promise<void>;
|
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;AAKlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,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;AAKlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAkCxH,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,CAAS;IAC1C,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;IAgHjC,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;IAalC,SAAS,CAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,kBAAkB;IAmLpF,UAAU;IA6EV,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU;IAwB7G,SAAS;IAYT,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;IAiFtH,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IA2F5F,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;CAQtB"}
|
package/build/launcher.js
CHANGED
|
@@ -11,7 +11,7 @@ import * as BrowserstackLocalLauncher from 'browserstack-local';
|
|
|
11
11
|
import PerformanceTester from './performance-tester.js';
|
|
12
12
|
import { startPercy, stopPercy, getBestPlatformForPercySnapshot } from './Percy/PercyHelper.js';
|
|
13
13
|
import { BSTACK_SERVICE_VERSION, NOT_ALLOWED_KEYS_IN_CAPS, PERF_MEASUREMENT_ENV, RERUN_ENV, RERUN_TESTS_ENV, TESTOPS_BUILD_ID_ENV, VALID_APP_EXTENSION } from './constants.js';
|
|
14
|
-
import { launchTestSession, createAccessibilityTestRun, shouldAddServiceVersion, stopBuildUpstream, getCiInfo, isBStackSession, isUndefined, isAccessibilityAutomationSession, stopAccessibilityTestRun, isTrue, getBrowserStackUser, getBrowserStackKey, uploadLogs, ObjectsAreEqual, } from './util.js';
|
|
14
|
+
import { launchTestSession, createAccessibilityTestRun, shouldAddServiceVersion, stopBuildUpstream, getCiInfo, isBStackSession, isUndefined, isAccessibilityAutomationSession, stopAccessibilityTestRun, isTrue, getBrowserStackUser, getBrowserStackKey, uploadLogs, ObjectsAreEqual, isValidCapsForHealing } from './util.js';
|
|
15
15
|
import CrashReporter from './crash-reporter.js';
|
|
16
16
|
import { BStackLogger } from './bstackLogger.js';
|
|
17
17
|
import { PercyLogger } from './Percy/PercyLogger.js';
|
|
@@ -19,6 +19,7 @@ import { FileStream } from './fileStream.js';
|
|
|
19
19
|
import { sendStart, sendFinish } from './instrumentation/funnelInstrumentation.js';
|
|
20
20
|
import BrowserStackConfig from './config.js';
|
|
21
21
|
import { setupExitHandlers } from './exitHandler.js';
|
|
22
|
+
import AiHandler from './ai-handler.js';
|
|
22
23
|
export default class BrowserstackLauncherService {
|
|
23
24
|
_options;
|
|
24
25
|
_config;
|
|
@@ -159,6 +160,30 @@ export default class BrowserstackLauncherService {
|
|
|
159
160
|
async onPrepare(config, capabilities) {
|
|
160
161
|
// // Send Funnel start request
|
|
161
162
|
await sendStart(this.browserStackConfig);
|
|
163
|
+
// Setting up healing for those sessions where we don't add the service version capability as it indicates that the session is not being run on BrowserStack
|
|
164
|
+
if (!shouldAddServiceVersion(this._config, this._options.testObservability, capabilities)) {
|
|
165
|
+
try {
|
|
166
|
+
if (capabilities.browserName) {
|
|
167
|
+
capabilities = await AiHandler.setup(this._config, this.browserStackConfig, this._options, capabilities, false);
|
|
168
|
+
}
|
|
169
|
+
else if (Array.isArray(capabilities)) {
|
|
170
|
+
for (let i = 0; i < capabilities.length; i++) {
|
|
171
|
+
if (capabilities[i].browserName) {
|
|
172
|
+
capabilities[i] = await AiHandler.setup(this._config, this.browserStackConfig, this._options, capabilities[i], false);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (isValidCapsForHealing(capabilities)) {
|
|
177
|
+
// setting up healing in case capabilities.xyz.capabilities.browserName where xyz can be anything:
|
|
178
|
+
capabilities = await AiHandler.setup(this._config, this.browserStackConfig, this._options, capabilities, true);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
if (this._options.selfHeal === true) {
|
|
183
|
+
BStackLogger.warn(`Error while setting up Browserstack healing Extension ${err}. Disabling healing for this session.`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
162
187
|
/**
|
|
163
188
|
* Upload app to BrowserStack if valid file path to app is given.
|
|
164
189
|
* Update app value of capability directly if app_url, custom_id, shareable_id is given
|
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;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/build/service.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import got from 'got';
|
|
2
2
|
import PerformanceTester from './performance-tester.js';
|
|
3
|
-
import { getBrowserDescription, getBrowserCapabilities, isBrowserstackCapability, getParentSuiteName, isBrowserstackSession, patchConsoleLogs } from './util.js';
|
|
3
|
+
import { getBrowserDescription, getBrowserCapabilities, isBrowserstackCapability, getParentSuiteName, isBrowserstackSession, patchConsoleLogs, shouldAddServiceVersion } from './util.js';
|
|
4
4
|
import InsightsHandler from './insights-handler.js';
|
|
5
5
|
import TestReporter from './reporter.js';
|
|
6
6
|
import { DEFAULT_OPTIONS, PERF_MEASUREMENT_ENV } from './constants.js';
|
|
@@ -11,6 +11,7 @@ import PercyHandler from './Percy/Percy-Handler.js';
|
|
|
11
11
|
import Listener from './testOps/listener.js';
|
|
12
12
|
import { saveWorkerData } from './data-store.js';
|
|
13
13
|
import UsageStats from './testOps/usageStats.js';
|
|
14
|
+
import AiHandler from './ai-handler.js';
|
|
14
15
|
export default class BrowserstackService {
|
|
15
16
|
_caps;
|
|
16
17
|
_config;
|
|
@@ -85,6 +86,17 @@ export default class BrowserstackService {
|
|
|
85
86
|
async before(caps, specs, browser) {
|
|
86
87
|
// added to maintain backward compatibility with webdriverIO v5
|
|
87
88
|
this._browser = browser ? browser : globalThis.browser;
|
|
89
|
+
// Healing Support:
|
|
90
|
+
if (!shouldAddServiceVersion(this._config, this._options.testObservability, caps)) {
|
|
91
|
+
try {
|
|
92
|
+
await AiHandler.selfHeal(this._options, caps, this._browser);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (this._options.selfHeal === true) {
|
|
96
|
+
BStackLogger.warn(`Error while setting up self-healing: ${err}. Disabling healing for this session.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
88
100
|
// Ensure capabilities are not null in case of multiremote
|
|
89
101
|
if (this._isAppAutomate()) {
|
|
90
102
|
this._sessionBaseUrl = 'https://api-cloud.browserstack.com/app-automate/sessions';
|
package/build/types.d.ts
CHANGED
|
@@ -31,6 +31,9 @@ export interface TestObservabilityOptions {
|
|
|
31
31
|
user?: string;
|
|
32
32
|
key?: string;
|
|
33
33
|
}
|
|
34
|
+
export interface BrowserstackOptions extends Options.Testrunner {
|
|
35
|
+
selfHeal?: boolean;
|
|
36
|
+
}
|
|
34
37
|
export interface BrowserstackConfig {
|
|
35
38
|
/**
|
|
36
39
|
*`buildIdentifier` is a unique id to differentiate every execution that gets appended to
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/build/util.d.ts
CHANGED
|
@@ -128,7 +128,12 @@ export declare function getHierarchy(fullTitle?: string): string[];
|
|
|
128
128
|
export declare function getHookType(hookName: string): string;
|
|
129
129
|
export declare function isScreenshotCommand(args: BeforeCommandArgs | AfterCommandArgs): boolean | "" | undefined;
|
|
130
130
|
export declare function isBStackSession(config: Options.Testrunner): boolean;
|
|
131
|
-
export declare function
|
|
131
|
+
export declare function isBrowserstackInfra(config: BrowserstackConfig & Options.Testrunner, caps?: Capabilities.BrowserStackCapabilities): boolean;
|
|
132
|
+
export declare function getBrowserStackUserAndKey(config: Options.Testrunner, options: Options.Testrunner): {
|
|
133
|
+
user: string | undefined;
|
|
134
|
+
key: string | undefined;
|
|
135
|
+
} | undefined;
|
|
136
|
+
export declare function shouldAddServiceVersion(config: Options.Testrunner, testObservability?: boolean, caps?: Capabilities.BrowserStackCapabilities): boolean;
|
|
132
137
|
export declare function batchAndPostEvents(eventUrl: string, kind: string, data: UploadType[]): Promise<void>;
|
|
133
138
|
export declare function getObservabilityUser(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner): string | undefined;
|
|
134
139
|
export declare function getObservabilityKey(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner): string | undefined;
|
|
@@ -159,5 +164,9 @@ export declare const ObjectsAreEqual: (object1: any, object2: any) => boolean;
|
|
|
159
164
|
export declare const getPlatformVersion: (...args: any) => any;
|
|
160
165
|
export declare const isObjectEmpty: (objectName: unknown) => unknown;
|
|
161
166
|
export declare const getErrorString: (err: unknown) => string | undefined;
|
|
167
|
+
export declare const hasBrowserName: (cap: Options.Testrunner) => boolean;
|
|
168
|
+
export declare const isValidCapsForHealing: (caps: {
|
|
169
|
+
[key: string]: Options.Testrunner;
|
|
170
|
+
}) => boolean;
|
|
162
171
|
export {};
|
|
163
172
|
//# 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
|
@@ -936,8 +936,58 @@ export function isBStackSession(config) {
|
|
|
936
936
|
}
|
|
937
937
|
return false;
|
|
938
938
|
}
|
|
939
|
-
export function
|
|
940
|
-
|
|
939
|
+
export function isBrowserstackInfra(config, caps) {
|
|
940
|
+
// a utility function to check if the hostname is browserstack
|
|
941
|
+
const isBrowserstack = (str) => {
|
|
942
|
+
return str.includes('browserstack.com');
|
|
943
|
+
};
|
|
944
|
+
if ((config.hostname) && !isBrowserstack(config.hostname)) {
|
|
945
|
+
return false;
|
|
946
|
+
}
|
|
947
|
+
if (caps && typeof caps === 'object') {
|
|
948
|
+
if (Array.isArray(caps)) {
|
|
949
|
+
for (const capability of caps) {
|
|
950
|
+
if ((capability.hostname) && !isBrowserstack(capability.hostname)) {
|
|
951
|
+
return false;
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
else {
|
|
956
|
+
for (const key in caps) {
|
|
957
|
+
const capability = caps[key];
|
|
958
|
+
if ((capability.hostname) && !isBrowserstack(capability.hostname)) {
|
|
959
|
+
return false;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
if (!isBStackSession(config)) {
|
|
965
|
+
return false;
|
|
966
|
+
}
|
|
967
|
+
return true;
|
|
968
|
+
}
|
|
969
|
+
export function getBrowserStackUserAndKey(config, options) {
|
|
970
|
+
// Fallback 1: Env variables
|
|
971
|
+
// Fallback 2: Service variables in wdio.conf.js (that are received inside options object)
|
|
972
|
+
const envOrServiceVariables = {
|
|
973
|
+
user: getBrowserStackUser(options),
|
|
974
|
+
key: getBrowserStackKey(options)
|
|
975
|
+
};
|
|
976
|
+
if (isBStackSession(envOrServiceVariables)) {
|
|
977
|
+
return envOrServiceVariables;
|
|
978
|
+
}
|
|
979
|
+
// Fallback 3: Service variables in testObservabilityOptions object
|
|
980
|
+
// Fallback 4: Service variables in the top level config object
|
|
981
|
+
const o11yVariables = {
|
|
982
|
+
user: getObservabilityUser(options, config),
|
|
983
|
+
key: getObservabilityKey(options, config)
|
|
984
|
+
};
|
|
985
|
+
if (isBStackSession(o11yVariables)) {
|
|
986
|
+
return o11yVariables;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
export function shouldAddServiceVersion(config, testObservability, caps) {
|
|
990
|
+
if ((config.services && config.services.toString().includes('chromedriver') && testObservability !== false) || !isBrowserstackInfra(config, caps)) {
|
|
941
991
|
return false;
|
|
942
992
|
}
|
|
943
993
|
return true;
|
|
@@ -1182,3 +1232,16 @@ export const getErrorString = (err) => {
|
|
|
1182
1232
|
return err.message; // works, `e` narrowed to Error
|
|
1183
1233
|
}
|
|
1184
1234
|
};
|
|
1235
|
+
export const hasBrowserName = (cap) => {
|
|
1236
|
+
if (!cap || !cap.capabilities) {
|
|
1237
|
+
return false;
|
|
1238
|
+
}
|
|
1239
|
+
const browserStackCapabilities = cap.capabilities;
|
|
1240
|
+
return browserStackCapabilities.browserName !== undefined;
|
|
1241
|
+
};
|
|
1242
|
+
export const isValidCapsForHealing = (caps) => {
|
|
1243
|
+
// Get all capability values
|
|
1244
|
+
const capValues = Object.values(caps);
|
|
1245
|
+
// Check if there are any capabilities and if at least one has a browser name
|
|
1246
|
+
return capValues.length > 0 && capValues.some(hasBrowserName);
|
|
1247
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wdio/browserstack-service",
|
|
3
|
-
"version": "8.40.
|
|
3
|
+
"version": "8.40.3",
|
|
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",
|
|
@@ -30,12 +30,13 @@
|
|
|
30
30
|
},
|
|
31
31
|
"typeScriptVersion": "3.8.3",
|
|
32
32
|
"dependencies": {
|
|
33
|
+
"@browserstack/ai-sdk-node": "1.5.8",
|
|
33
34
|
"@percy/appium-app": "^2.0.1",
|
|
34
35
|
"@percy/selenium-webdriver": "^2.0.3",
|
|
35
36
|
"@types/gitconfiglocal": "^2.0.1",
|
|
36
37
|
"@wdio/logger": "8.38.0",
|
|
37
|
-
"@wdio/reporter": "8.
|
|
38
|
-
"@wdio/types": "8.
|
|
38
|
+
"@wdio/reporter": "8.40.3",
|
|
39
|
+
"@wdio/types": "8.40.3",
|
|
39
40
|
"browserstack-local": "^1.5.1",
|
|
40
41
|
"chalk": "^5.3.0",
|
|
41
42
|
"csv-writer": "^1.6.0",
|
|
@@ -44,7 +45,7 @@
|
|
|
44
45
|
"gitconfiglocal": "^2.1.0",
|
|
45
46
|
"got": "^12.6.1",
|
|
46
47
|
"uuid": "^10.0.0",
|
|
47
|
-
"webdriverio": "8.40.
|
|
48
|
+
"webdriverio": "8.40.3",
|
|
48
49
|
"winston-transport": "^4.5.0",
|
|
49
50
|
"yauzl": "^3.0.0"
|
|
50
51
|
},
|
|
@@ -52,11 +53,11 @@
|
|
|
52
53
|
"@wdio/cli": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
|
-
"@types/node": "^
|
|
56
|
-
"@wdio/globals": "8.40.
|
|
56
|
+
"@types/node": "^22.2.0",
|
|
57
|
+
"@wdio/globals": "8.40.3"
|
|
57
58
|
},
|
|
58
59
|
"publishConfig": {
|
|
59
60
|
"access": "public"
|
|
60
61
|
},
|
|
61
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "c25074cf89bf620cfe18909cd7dbdad8de8e722d"
|
|
62
63
|
}
|