@wdio/browserstack-service 7.38.0 → 7.39.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/Percy/Percy.d.ts +4 -0
- package/build/Percy/Percy.d.ts.map +1 -1
- package/build/Percy/Percy.js +25 -1
- package/build/ai-handler.d.ts +24 -0
- package/build/ai-handler.d.ts.map +1 -0
- package/build/ai-handler.js +175 -0
- package/build/config.d.ts +3 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +1 -0
- package/build/constants.d.ts +7 -0
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +9 -1
- package/build/insights-handler.d.ts +3 -2
- package/build/insights-handler.d.ts.map +1 -1
- package/build/insights-handler.js +9 -3
- package/build/instrumentation/funnelInstrumentation.d.ts +2 -0
- package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -1
- package/build/instrumentation/funnelInstrumentation.js +87 -1
- package/build/launcher.d.ts +4 -3
- package/build/launcher.d.ts.map +1 -1
- package/build/launcher.js +49 -3
- package/build/service.d.ts +1 -0
- package/build/service.d.ts.map +1 -1
- package/build/service.js +19 -3
- package/build/types.d.ts +3 -0
- package/build/types.d.ts.map +1 -1
- package/build/util.d.ts +12 -1
- package/build/util.d.ts.map +1 -1
- package/build/util.js +79 -4
- package/package.json +3 -2
package/build/Percy/Percy.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ declare class Percy {
|
|
|
10
10
|
_isApp: boolean;
|
|
11
11
|
_projectName: string | undefined;
|
|
12
12
|
isProcessRunning: boolean;
|
|
13
|
+
percyCaptureMode?: string;
|
|
14
|
+
buildId: number | null;
|
|
15
|
+
percyAutoEnabled: boolean;
|
|
16
|
+
percy: boolean;
|
|
13
17
|
constructor(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner, bsConfig: UserConfig);
|
|
14
18
|
private getBinaryPath;
|
|
15
19
|
private sleep;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Percy.d.ts","sourceRoot":"","sources":["../../src/Percy/Percy.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI1C,cAAM,KAAK;IACP,QAAQ,EAAE,MAAM,CAAiC;IACjD,QAAQ,EAAE,MAAM,CAA8D;IAE9E,WAAW,EAAE,MAAM,GAAG,GAAG,CAAO;IAChC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAA;IACjD,OAAO,EAAE,OAAO,CAAC,UAAU,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAO;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,YAAY,EAAE,MAAM,GAAG,SAAS,CAAY;IAE5C,gBAAgB,UAAQ;
|
|
1
|
+
{"version":3,"file":"Percy.d.ts","sourceRoot":"","sources":["../../src/Percy/Percy.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI1C,cAAM,KAAK;IACP,QAAQ,EAAE,MAAM,CAAiC;IACjD,QAAQ,EAAE,MAAM,CAA8D;IAE9E,WAAW,EAAE,MAAM,GAAG,GAAG,CAAO;IAChC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAA;IACjD,OAAO,EAAE,OAAO,CAAC,UAAU,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAO;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,YAAY,EAAE,MAAM,GAAG,SAAS,CAAY;IAE5C,gBAAgB,UAAQ;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAO;IAC7B,gBAAgB,UAAQ;IACxB,KAAK,EAAE,OAAO,CAAA;gBAEF,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU;YAShG,aAAa;YAQb,KAAK;IAIb,WAAW;IAaX,KAAK;IA2CL,IAAI;IAWV,SAAS;IAIH,eAAe;IAoCf,iBAAiB;CA8B1B;AAED,eAAe,KAAK,CAAA"}
|
package/build/Percy/Percy.js
CHANGED
|
@@ -13,16 +13,21 @@ const PercyBinary_1 = __importDefault(require("./PercyBinary"));
|
|
|
13
13
|
const logDir = 'logs';
|
|
14
14
|
class Percy {
|
|
15
15
|
constructor(options, config, bsConfig) {
|
|
16
|
+
var _a;
|
|
16
17
|
this._logfile = node_path_1.default.join(logDir, 'percy.log');
|
|
17
18
|
this._address = process.env.PERCY_SERVER_ADDRESS || 'http://127.0.0.1:5338';
|
|
18
19
|
this._binaryPath = null;
|
|
19
20
|
this._proc = null;
|
|
20
21
|
this._projectName = undefined;
|
|
21
22
|
this.isProcessRunning = false;
|
|
23
|
+
this.buildId = null;
|
|
24
|
+
this.percyAutoEnabled = false;
|
|
22
25
|
this._options = options;
|
|
23
26
|
this._config = config;
|
|
24
27
|
this._isApp = Boolean(options.app);
|
|
25
28
|
this._projectName = bsConfig.projectName;
|
|
29
|
+
this.percyCaptureMode = options.percyCaptureMode;
|
|
30
|
+
this.percy = (_a = options.percy) !== null && _a !== void 0 ? _a : false;
|
|
26
31
|
}
|
|
27
32
|
async getBinaryPath() {
|
|
28
33
|
if (!this._binaryPath) {
|
|
@@ -38,6 +43,8 @@ class Percy {
|
|
|
38
43
|
try {
|
|
39
44
|
const resp = await (0, util_1.nodeRequest)('GET', 'percy/healthcheck', null, this._address);
|
|
40
45
|
if (resp) {
|
|
46
|
+
// @ts-ignore
|
|
47
|
+
this.buildId = resp.build.id;
|
|
41
48
|
return true;
|
|
42
49
|
}
|
|
43
50
|
}
|
|
@@ -92,11 +99,28 @@ class Percy {
|
|
|
92
99
|
const projectName = this._projectName;
|
|
93
100
|
try {
|
|
94
101
|
const type = this._isApp ? 'app' : 'automate';
|
|
95
|
-
const
|
|
102
|
+
const params = new URLSearchParams();
|
|
103
|
+
if (projectName) {
|
|
104
|
+
params.set('name', projectName);
|
|
105
|
+
}
|
|
106
|
+
if (type) {
|
|
107
|
+
params.set('type', type);
|
|
108
|
+
}
|
|
109
|
+
if (this._options.percyCaptureMode) {
|
|
110
|
+
params.set('percy_capture_mode', this._options.percyCaptureMode);
|
|
111
|
+
}
|
|
112
|
+
params.set('percy', String(this._options.percy));
|
|
113
|
+
const query = `api/app_percy/get_project_token?${params.toString()}`;
|
|
114
|
+
const response = await (0, util_1.nodeRequest)('GET', query, {
|
|
96
115
|
username: (0, util_1.getBrowserStackUser)(this._config),
|
|
97
116
|
password: (0, util_1.getBrowserStackKey)(this._config)
|
|
98
117
|
}, 'https://api.browserstack.com');
|
|
99
118
|
PercyLogger_1.PercyLogger.debug('Percy fetch token success : ' + response.token);
|
|
119
|
+
if (!this._options.percy && response.success) {
|
|
120
|
+
this.percyAutoEnabled = response.success;
|
|
121
|
+
}
|
|
122
|
+
this.percyCaptureMode = response.percy_capture_mode;
|
|
123
|
+
this.percy = response.success;
|
|
100
124
|
return response.token;
|
|
101
125
|
}
|
|
102
126
|
catch (err) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Capabilities } from '@wdio/types';
|
|
2
|
+
import type BrowserStackConfig from './config';
|
|
3
|
+
import type { Options } from '@wdio/types';
|
|
4
|
+
import type { BrowserstackHealing } from '@browserstack/ai-sdk-node';
|
|
5
|
+
import { Browser, MultiRemoteBrowser } from 'webdriverio';
|
|
6
|
+
import type { BrowserstackOptions } from './types';
|
|
7
|
+
declare class AiHandler {
|
|
8
|
+
authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse;
|
|
9
|
+
wdioBstackVersion: string;
|
|
10
|
+
constructor();
|
|
11
|
+
authenticateUser(user: string, key: string): Promise<BrowserstackHealing.InitErrorResponse | BrowserstackHealing.InitSuccessResponse>;
|
|
12
|
+
updateCaps(authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse, options: BrowserstackOptions, caps: Array<Capabilities.RemoteCapability> | Capabilities.RemoteCapability): Capabilities.RemoteCapability | Capabilities.RemoteCapability[];
|
|
13
|
+
setToken(sessionId: string, sessionToken: string): Promise<void>;
|
|
14
|
+
installFirefoxExtension(browser: Browser<'async'> | MultiRemoteBrowser<'async'>): Promise<void>;
|
|
15
|
+
handleHealing(orginalFunc: (arg0: string, arg1: string) => any, using: string, value: string, browser: Browser<'async'> | MultiRemoteBrowser<'async'>, options: BrowserstackOptions): Promise<any>;
|
|
16
|
+
addMultiRemoteCaps(authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse, config: Options.Testrunner, browserStackConfig: BrowserStackConfig, options: BrowserstackOptions, caps: any, browser: string): void;
|
|
17
|
+
handleMultiRemoteSetup(authResult: BrowserstackHealing.InitSuccessResponse | BrowserstackHealing.InitErrorResponse, config: Options.Testrunner, browserStackConfig: BrowserStackConfig, options: BrowserstackOptions, caps: any): void;
|
|
18
|
+
setup(config: Options.Testrunner, browserStackConfig: BrowserStackConfig, options: BrowserstackOptions, caps: any, isMultiremote: boolean): Promise<any>;
|
|
19
|
+
handleSelfHeal(options: BrowserstackOptions, browser: Browser<'async'> | MultiRemoteBrowser<'async'>): Promise<void>;
|
|
20
|
+
selfHeal(options: BrowserstackOptions, caps: Capabilities.RemoteCapability, browser: Browser<'async'> | MultiRemoteBrowser<'async'>): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
declare const _default: AiHandler;
|
|
23
|
+
export default _default;
|
|
24
|
+
//# 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":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,kBAAkB,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,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,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC;IAM/E,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,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,mBAAmB;IAoDzL,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,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC;IA0BpG,QAAQ,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC;CAmB5I;;AAED,wBAA8B"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
7
|
+
const ai_sdk_node_1 = __importDefault(require("@browserstack/ai-sdk-node"));
|
|
8
|
+
const bstackLogger_1 = require("./bstackLogger");
|
|
9
|
+
const constants_1 = require("./constants");
|
|
10
|
+
const funnelInstrumentation_1 = require("./instrumentation/funnelInstrumentation");
|
|
11
|
+
const util_1 = require("./util");
|
|
12
|
+
class AiHandler {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.authResult = JSON.parse(process.env[constants_1.BSTACK_TCG_AUTH_RESULT] || '{}');
|
|
15
|
+
this.wdioBstackVersion = constants_1.BSTACK_SERVICE_VERSION;
|
|
16
|
+
}
|
|
17
|
+
async authenticateUser(user, key) {
|
|
18
|
+
return await ai_sdk_node_1.default.BrowserstackHealing.init(key, user, constants_1.TCG_URL, this.wdioBstackVersion);
|
|
19
|
+
}
|
|
20
|
+
updateCaps(authResult, options, caps) {
|
|
21
|
+
const installExtCondition = authResult.isAuthenticated === true && (authResult.defaultLogDataEnabled === true || options.selfHeal === true);
|
|
22
|
+
if (installExtCondition) {
|
|
23
|
+
if (Array.isArray(caps)) {
|
|
24
|
+
const newCaps = ai_sdk_node_1.default.BrowserstackHealing.initializeCapabilities(caps[0]);
|
|
25
|
+
caps[0] = newCaps;
|
|
26
|
+
}
|
|
27
|
+
else if (typeof caps === 'object') {
|
|
28
|
+
caps = ai_sdk_node_1.default.BrowserstackHealing.initializeCapabilities(caps);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (options.selfHeal === true) {
|
|
32
|
+
const healingWarnMessage = authResult.message;
|
|
33
|
+
bstackLogger_1.BStackLogger.warn(`Healing Auth failed. Disabling healing for this session. Reason: ${healingWarnMessage}`);
|
|
34
|
+
}
|
|
35
|
+
return caps;
|
|
36
|
+
}
|
|
37
|
+
async setToken(sessionId, sessionToken) {
|
|
38
|
+
await ai_sdk_node_1.default.BrowserstackHealing.setToken(sessionId, sessionToken, constants_1.TCG_URL);
|
|
39
|
+
}
|
|
40
|
+
async installFirefoxExtension(browser) {
|
|
41
|
+
const extensionPath = ai_sdk_node_1.default.BrowserstackHealing.getFirefoxAddonPath();
|
|
42
|
+
const extFile = node_fs_1.default.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: constants_1.TCG_INFO.tcgRegion,
|
|
51
|
+
tcgUrls: {
|
|
52
|
+
[constants_1.TCG_INFO.tcgRegion]: {
|
|
53
|
+
endpoint: constants_1.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 ai_sdk_node_1.default.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_1.BStackLogger.info('findElement failed, trying to heal');
|
|
71
|
+
const script = await ai_sdk_node_1.default.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 ai_sdk_node_1.default.BrowserstackHealing.pollResult(constants_1.TCG_URL, sessionId, this.authResult.sessionToken);
|
|
75
|
+
if (tcgData && tcgData.selector && tcgData.value) {
|
|
76
|
+
const healedResult = await orginalFunc(tcgData.selector, tcgData.value);
|
|
77
|
+
bstackLogger_1.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_1.BStackLogger.warn('Something went wrong while healing. Disabling healing for this command');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
bstackLogger_1.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
|
+
var _a, _b, _c;
|
|
95
|
+
if (caps[browser].capabilities &&
|
|
96
|
+
!((0, util_1.isBrowserstackInfra)(caps[browser])) &&
|
|
97
|
+
constants_1.SUPPORTED_BROWSERS_FOR_AI.includes((_c = (_b = (_a = caps[browser]) === null || _a === void 0 ? void 0 : _a.capabilities) === null || _b === void 0 ? void 0 : _b.browserName) === null || _c === void 0 ? void 0 : _c.toLowerCase())) {
|
|
98
|
+
const innerConfig = (0, util_1.getBrowserStackUserAndKey)(config, options);
|
|
99
|
+
if ((innerConfig === null || innerConfig === void 0 ? void 0 : innerConfig.user) && innerConfig.key) {
|
|
100
|
+
(0, funnelInstrumentation_1.handleHealingInstrumentation)(authResult, browserStackConfig, options.selfHeal);
|
|
101
|
+
caps[browser].capabilities = this.updateCaps(authResult, options, caps[browser].capabilities);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
handleMultiRemoteSetup(authResult, config, browserStackConfig, options, caps) {
|
|
106
|
+
const browserNames = Object.keys(caps);
|
|
107
|
+
for (let i = 0; i < browserNames.length; i++) {
|
|
108
|
+
const browser = browserNames[i];
|
|
109
|
+
this.addMultiRemoteCaps(authResult, config, browserStackConfig, options, caps, browser);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async setup(config, browserStackConfig, options, caps, isMultiremote) {
|
|
113
|
+
var _a;
|
|
114
|
+
try {
|
|
115
|
+
const innerConfig = (0, util_1.getBrowserStackUserAndKey)(config, options);
|
|
116
|
+
if ((innerConfig === null || innerConfig === void 0 ? void 0 : innerConfig.user) && innerConfig.key) {
|
|
117
|
+
const authResult = await this.authenticateUser(innerConfig.user, innerConfig.key);
|
|
118
|
+
process.env[constants_1.BSTACK_TCG_AUTH_RESULT] = JSON.stringify(authResult);
|
|
119
|
+
if (!isMultiremote && constants_1.SUPPORTED_BROWSERS_FOR_AI.includes((_a = caps === null || caps === void 0 ? void 0 : caps.browserName) === null || _a === void 0 ? void 0 : _a.toLowerCase())) {
|
|
120
|
+
(0, funnelInstrumentation_1.handleHealingInstrumentation)(authResult, browserStackConfig, options.selfHeal);
|
|
121
|
+
this.updateCaps(authResult, options, caps);
|
|
122
|
+
}
|
|
123
|
+
else if (isMultiremote) {
|
|
124
|
+
this.handleMultiRemoteSetup(authResult, config, browserStackConfig, options, caps);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (options.selfHeal === true) {
|
|
130
|
+
bstackLogger_1.BStackLogger.warn(`Error while initiliazing Browserstack healing Extension ${err}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return caps;
|
|
134
|
+
}
|
|
135
|
+
async handleSelfHeal(options, browser) {
|
|
136
|
+
var _a, _b;
|
|
137
|
+
if (constants_1.SUPPORTED_BROWSERS_FOR_AI.includes((_b = (_a = browser.capabilities) === null || _a === void 0 ? void 0 : _a.browserName) === null || _b === void 0 ? void 0 : _b.toLowerCase())) {
|
|
138
|
+
const authInfo = this.authResult;
|
|
139
|
+
if (Object.keys(authInfo).length === 0 && options.selfHeal === true) {
|
|
140
|
+
bstackLogger_1.BStackLogger.debug('TCG Auth result is empty');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const { isAuthenticated, sessionToken, defaultLogDataEnabled } = authInfo;
|
|
144
|
+
if (isAuthenticated && (defaultLogDataEnabled === true || options.selfHeal === true)) {
|
|
145
|
+
await this.setToken(browser.sessionId, sessionToken);
|
|
146
|
+
if (browser.capabilities.browserName === 'firefox') {
|
|
147
|
+
await this.installFirefoxExtension(browser);
|
|
148
|
+
}
|
|
149
|
+
browser.overwriteCommand('findElement', async (orginalFunc, using, value) => {
|
|
150
|
+
return await this.handleHealing(orginalFunc, using, value, browser, options);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async selfHeal(options, caps, browser) {
|
|
156
|
+
try {
|
|
157
|
+
const multiRemoteBrowsers = Object.keys(caps).filter(e => Object.keys(browser).includes(e));
|
|
158
|
+
if (multiRemoteBrowsers.length > 0) {
|
|
159
|
+
for (let i = 0; i < multiRemoteBrowsers.length; i++) {
|
|
160
|
+
const remoteBrowser = browser[multiRemoteBrowsers[i]];
|
|
161
|
+
await this.handleSelfHeal(options, remoteBrowser);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
await this.handleSelfHeal(options, browser);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
if (options.selfHeal === true) {
|
|
170
|
+
bstackLogger_1.BStackLogger.warn(`Error while setting up self-healing: ${err}. Disabling healing for this session.`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.default = new AiHandler();
|
package/build/config.d.ts
CHANGED
|
@@ -10,11 +10,14 @@ declare class BrowserStackConfig {
|
|
|
10
10
|
buildIdentifier?: string;
|
|
11
11
|
testObservability: TestOpsConfig;
|
|
12
12
|
percy: boolean;
|
|
13
|
+
percyCaptureMode?: string;
|
|
13
14
|
accessibility: boolean;
|
|
14
15
|
app?: string | AppConfig;
|
|
15
16
|
private static _instance;
|
|
16
17
|
appAutomate: boolean;
|
|
17
18
|
automate: boolean;
|
|
19
|
+
percyBuildId?: number | null;
|
|
20
|
+
isPercyAutoEnabled: boolean;
|
|
18
21
|
funnelDataSent: boolean;
|
|
19
22
|
constructor(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner);
|
|
20
23
|
sentFunnelData(): void;
|
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,SAAS,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,aAAa,MAAM,yBAAyB,CAAA;AAGnD,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,aAAa,EAAE,OAAO,CAAA;IACtB,GAAG,CAAC,EAAE,MAAM,GAAC,SAAS,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoB;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,OAAO,CAAQ;gBAE1B,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU;IAaxF,cAAc;CAIjB;AAED,eAAe,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,aAAa,MAAM,yBAAyB,CAAA;AAGnD,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;IACtB,GAAG,CAAC,EAAE,MAAM,GAAC,SAAS,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoB;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,kBAAkB,UAAQ;IAC1B,cAAc,EAAE,OAAO,CAAQ;gBAE1B,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU;IAaxF,cAAc;CAIjB;AAED,eAAe,kBAAkB,CAAA"}
|
package/build/config.js
CHANGED
package/build/constants.d.ts
CHANGED
|
@@ -27,7 +27,14 @@ export declare const LOG_KIND_USAGE_MAP: {
|
|
|
27
27
|
HTTP: string;
|
|
28
28
|
};
|
|
29
29
|
export declare const FUNNEL_INSTRUMENTATION_URL = "https://api.browserstack.com/sdk/v1/event";
|
|
30
|
+
export declare const SUPPORTED_BROWSERS_FOR_AI: string[];
|
|
31
|
+
export declare const TCG_URL = "https://tcg.browserstack.com";
|
|
32
|
+
export declare const TCG_INFO: {
|
|
33
|
+
tcgRegion: string;
|
|
34
|
+
tcgUrl: string;
|
|
35
|
+
};
|
|
30
36
|
export declare const TESTOPS_JWT_ENV = "BS_TESTOPS_JWT";
|
|
37
|
+
export declare const BSTACK_TCG_AUTH_RESULT = "BSTACK_TCG_AUTH_RESULT";
|
|
31
38
|
export declare const TESTOPS_SCREENSHOT_ENV = "BS_TESTOPS_ALLOW_SCREENSHOTS";
|
|
32
39
|
export declare const TESTOPS_BUILD_ID_ENV = "BS_TESTOPS_BUILD_HASHED_ID";
|
|
33
40
|
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,SAAS,CAAA;AAGjD,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;AACvE,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;AAE5D,eAAO,MAAM,sBAAsB,QAAuB,CAAA;AAE1D,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AACjF,eAAO,MAAM,wBAAwB,UAA6D,CAAA;AAElG,eAAO,MAAM,SAAS,iCAAiC,CAAA;AACvD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOzC,CAAA;AAED,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,SAAS,CAAA;AAGjD,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;AACvE,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;AAE5D,eAAO,MAAM,sBAAsB,QAAuB,CAAA;AAE1D,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AACjF,eAAO,MAAM,wBAAwB,UAA6D,CAAA;AAElG,eAAO,MAAM,SAAS,iCAAiC,CAAA;AACvD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOzC,CAAA;AAED,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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GIT_META_DATA_TRUNCATED = exports.MAX_GIT_META_DATA_SIZE_IN_BYTES = exports.TESTOPS_BUILD_COMPLETED_ENV = exports.RERUN_ENV = exports.RERUN_TESTS_ENV = exports.PERF_MEASUREMENT_ENV = exports.TESTOPS_BUILD_ID_ENV = exports.TESTOPS_SCREENSHOT_ENV = exports.TESTOPS_JWT_ENV = exports.FUNNEL_INSTRUMENTATION_URL = exports.LOG_KIND_USAGE_MAP = exports.CAPTURE_MODES = exports.PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS = exports.PERCY_LOGS_FILE = exports.COLORS = exports.LOGS_FILE = exports.NOT_ALLOWED_KEYS_IN_CAPS = exports.ACCESSIBILITY_API_URL = exports.BSTACK_SERVICE_VERSION = exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = exports.BATCH_EVENT_TYPES = exports.DATA_BATCH_INTERVAL = exports.DATA_BATCH_SIZE = exports.DATA_SCREENSHOT_ENDPOINT = exports.DATA_BATCH_ENDPOINT = exports.DATA_EVENT_ENDPOINT = exports.DATA_ENDPOINT = exports.consoleHolder = exports.DEFAULT_OPTIONS = exports.VALID_APP_EXTENSION = exports.BROWSER_DESCRIPTION = void 0;
|
|
3
|
+
exports.GIT_META_DATA_TRUNCATED = exports.MAX_GIT_META_DATA_SIZE_IN_BYTES = exports.TESTOPS_BUILD_COMPLETED_ENV = exports.RERUN_ENV = exports.RERUN_TESTS_ENV = exports.PERF_MEASUREMENT_ENV = exports.TESTOPS_BUILD_ID_ENV = exports.TESTOPS_SCREENSHOT_ENV = exports.BSTACK_TCG_AUTH_RESULT = exports.TESTOPS_JWT_ENV = exports.TCG_INFO = exports.TCG_URL = exports.SUPPORTED_BROWSERS_FOR_AI = exports.FUNNEL_INSTRUMENTATION_URL = exports.LOG_KIND_USAGE_MAP = exports.CAPTURE_MODES = exports.PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS = exports.PERCY_LOGS_FILE = exports.COLORS = exports.LOGS_FILE = exports.NOT_ALLOWED_KEYS_IN_CAPS = exports.ACCESSIBILITY_API_URL = exports.BSTACK_SERVICE_VERSION = exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = exports.BATCH_EVENT_TYPES = exports.DATA_BATCH_INTERVAL = exports.DATA_BATCH_SIZE = exports.DATA_SCREENSHOT_ENDPOINT = exports.DATA_BATCH_ENDPOINT = exports.DATA_EVENT_ENDPOINT = exports.DATA_ENDPOINT = exports.consoleHolder = exports.DEFAULT_OPTIONS = exports.VALID_APP_EXTENSION = exports.BROWSER_DESCRIPTION = void 0;
|
|
4
4
|
const package_json_1 = require("../package.json");
|
|
5
5
|
exports.BROWSER_DESCRIPTION = [
|
|
6
6
|
'device',
|
|
@@ -63,9 +63,17 @@ exports.LOG_KIND_USAGE_MAP = {
|
|
|
63
63
|
'HTTP': 'http'
|
|
64
64
|
};
|
|
65
65
|
exports.FUNNEL_INSTRUMENTATION_URL = 'https://api.browserstack.com/sdk/v1/event';
|
|
66
|
+
exports.SUPPORTED_BROWSERS_FOR_AI = ['chrome', 'microsoftedge', 'firefox'];
|
|
67
|
+
exports.TCG_URL = 'https://tcg.browserstack.com';
|
|
68
|
+
exports.TCG_INFO = {
|
|
69
|
+
tcgRegion: 'use',
|
|
70
|
+
tcgUrl: exports.TCG_URL,
|
|
71
|
+
};
|
|
66
72
|
// Env variables - Define all the env variable constants over here
|
|
67
73
|
// To store the JWT token returned the session launch
|
|
68
74
|
exports.TESTOPS_JWT_ENV = 'BS_TESTOPS_JWT';
|
|
75
|
+
// To store tcg auth result for selfHealing feature:
|
|
76
|
+
exports.BSTACK_TCG_AUTH_RESULT = 'BSTACK_TCG_AUTH_RESULT';
|
|
69
77
|
// To store the setting of whether to send screenshots or not
|
|
70
78
|
exports.TESTOPS_SCREENSHOT_ENV = 'BS_TESTOPS_ALLOW_SCREENSHOTS';
|
|
71
79
|
// To store build hashed id
|
|
@@ -2,7 +2,7 @@ import type { Capabilities, Frameworks } from '@wdio/types';
|
|
|
2
2
|
import type { Browser, MultiRemoteBrowser } from 'webdriverio';
|
|
3
3
|
import type { BeforeCommandArgs, AfterCommandArgs } from '@wdio/reporter';
|
|
4
4
|
import type { Feature, Scenario, CucumberHook, CucumberHookParams, Pickle, ITestCaseHookParameter } from './cucumber-types';
|
|
5
|
-
import type { TestData, TestMeta, CurrentRunInfo, StdLog } from './types';
|
|
5
|
+
import type { TestData, TestMeta, CurrentRunInfo, StdLog, BrowserstackConfig, BrowserstackOptions } from './types';
|
|
6
6
|
declare class _InsightsHandler {
|
|
7
7
|
private _browser;
|
|
8
8
|
private _framework?;
|
|
@@ -16,7 +16,8 @@ declare class _InsightsHandler {
|
|
|
16
16
|
private _cucumberData;
|
|
17
17
|
private _userCaps?;
|
|
18
18
|
private listener;
|
|
19
|
-
constructor(_browser: Browser<'async'> | MultiRemoteBrowser<'async'>, browserCaps?: Capabilities.Capabilities,
|
|
19
|
+
constructor(_browser: Browser<'async'> | MultiRemoteBrowser<'async'>, browserCaps?: Capabilities.Capabilities, sessionId?: string, _framework?: string | undefined, _userCaps?: Capabilities.RemoteCapability, _options?: BrowserstackConfig & BrowserstackOptions);
|
|
20
|
+
_isAppAutomate(): boolean;
|
|
20
21
|
registerListeners(): void;
|
|
21
22
|
before(): Promise<void>;
|
|
22
23
|
beforeHook(test: Frameworks.Test | CucumberHook | undefined, context: any): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAIzE,OAAO,KAAK,EAAiB,OAAO,EAAE,QAAQ,EAAsB,YAAY,EAAE,kBAAkB,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ const listener_1 = __importDefault(require("./testOps/listener"));
|
|
|
12
12
|
const constants_1 = require("./constants");
|
|
13
13
|
const log = (0, logger_1.default)('@wdio/browserstack-service');
|
|
14
14
|
class _InsightsHandler {
|
|
15
|
-
constructor(_browser, browserCaps,
|
|
15
|
+
constructor(_browser, browserCaps, sessionId, _framework, _userCaps, _options) {
|
|
16
16
|
this._browser = _browser;
|
|
17
17
|
this._framework = _framework;
|
|
18
18
|
this._tests = {};
|
|
@@ -43,17 +43,23 @@ class _InsightsHandler {
|
|
|
43
43
|
log.debug(`Exception in uploading log data to Observability with error : ${error}`);
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
|
+
this._userCaps = _userCaps;
|
|
46
47
|
this._platformMeta = {
|
|
47
48
|
browserName: browserCaps === null || browserCaps === void 0 ? void 0 : browserCaps.browserName,
|
|
48
49
|
browserVersion: browserCaps === null || browserCaps === void 0 ? void 0 : browserCaps.browserVersion,
|
|
49
50
|
platformName: browserCaps === null || browserCaps === void 0 ? void 0 : browserCaps.platformName,
|
|
50
51
|
caps: browserCaps,
|
|
51
52
|
sessionId: sessionId,
|
|
52
|
-
product:
|
|
53
|
+
product: (0, util_1.getObservabilityProduct)(_options, this._isAppAutomate())
|
|
53
54
|
};
|
|
54
|
-
this._userCaps = _userCaps;
|
|
55
55
|
this.registerListeners();
|
|
56
56
|
}
|
|
57
|
+
_isAppAutomate() {
|
|
58
|
+
var _a, _b, _c, _d;
|
|
59
|
+
const browserDesiredCapabilities = ((_b = (_a = this._browser) === null || _a === void 0 ? void 0 : _a.capabilities) !== null && _b !== void 0 ? _b : {});
|
|
60
|
+
const desiredCapabilities = ((_c = this._userCaps) !== null && _c !== void 0 ? _c : {});
|
|
61
|
+
return !!browserDesiredCapabilities['appium:app'] || !!desiredCapabilities['appium:app'] || !!browserDesiredCapabilities.app || !!desiredCapabilities.app || !!((_d = desiredCapabilities['appium:options']) === null || _d === void 0 ? void 0 : _d.app);
|
|
62
|
+
}
|
|
57
63
|
registerListeners() {
|
|
58
64
|
if (!(this._framework === 'mocha' || this._framework === 'cucumber')) {
|
|
59
65
|
return;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type BrowserStackConfig from '../config';
|
|
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":"AAOA,OAAO,KAAK,kBAAkB,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"funnelInstrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/funnelInstrumentation.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,kBAAkB,MAAM,WAAW,CAAA;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAoBpE,wBAAsB,SAAS,CAAC,MAAM,EAAE,kBAAkB,iBAEzD;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;AA0JD,wBAAgB,4BAA4B,CACxC,UAAU,EAAE,mBAAmB,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,mBAAmB,EAC3F,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,OAAO,GAAG,SAAS,QAiCzC"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.fireFunnelRequest = exports.saveFunnelData = exports.sendFinish = exports.sendStart = void 0;
|
|
6
|
+
exports.handleHealingInstrumentation = exports.fireFunnelRequest = exports.saveFunnelData = exports.sendFinish = exports.sendStart = void 0;
|
|
7
7
|
const node_os_1 = __importDefault(require("node:os"));
|
|
8
8
|
const node_util_1 = __importDefault(require("node:util"));
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
@@ -103,6 +103,8 @@ function buildEventData(eventType, config) {
|
|
|
103
103
|
};
|
|
104
104
|
if (eventType === 'SDKTestSuccessful') {
|
|
105
105
|
const workerData = (0, data_store_1.getDataFromWorkers)();
|
|
106
|
+
eventProperties.isPercyAutoEnabled = config.isPercyAutoEnabled;
|
|
107
|
+
eventProperties.percyBuildId = config.percyBuildId;
|
|
106
108
|
eventProperties.productUsage = getProductUsage(workerData);
|
|
107
109
|
}
|
|
108
110
|
return {
|
|
@@ -125,3 +127,87 @@ function getReferrer(framework) {
|
|
|
125
127
|
const fullName = framework ? 'WebdriverIO-' + framework : 'WebdriverIO';
|
|
126
128
|
return `${fullName}/${constants_1.BSTACK_SERVICE_VERSION}`;
|
|
127
129
|
}
|
|
130
|
+
const sendEvent = {
|
|
131
|
+
tcgDown: (config) => fireFunnelTestEvent('SDKTestTcgDownResponse', config),
|
|
132
|
+
invalidTcgAuth: (config) => fireFunnelTestEvent('SDKTestInvalidTcgAuthResponseWithUserImpact', config),
|
|
133
|
+
tcgAuthFailure: (config) => fireFunnelTestEvent('SDKTestTcgAuthFailure', config),
|
|
134
|
+
tcgtInitSuccessful: (config) => fireFunnelTestEvent('SDKTestTcgtInitSuccessful', config),
|
|
135
|
+
initFailed: (config) => fireFunnelTestEvent('SDKTestInitFailedResponse', config),
|
|
136
|
+
tcgProxyFailure: (config) => fireFunnelTestEvent('SDKTestTcgProxyFailure', config),
|
|
137
|
+
};
|
|
138
|
+
function isProxyError(authResult) {
|
|
139
|
+
return authResult.status === 502;
|
|
140
|
+
}
|
|
141
|
+
function handleProxyError(config, isSelfHealEnabled) {
|
|
142
|
+
sendEvent.tcgProxyFailure(config);
|
|
143
|
+
if (isSelfHealEnabled) {
|
|
144
|
+
bstackLogger_1.BStackLogger.warn('Proxy Error. Disabling Healing for this session.');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function handleUpgradeRequired(isSelfHealEnabled) {
|
|
148
|
+
if (isSelfHealEnabled) {
|
|
149
|
+
bstackLogger_1.BStackLogger.warn('Please upgrade Browserstack Service to the latest version to use the self-healing feature.');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function handleAuthenticationFailure(status, config, isSelfHealEnabled) {
|
|
153
|
+
if (status >= 500) {
|
|
154
|
+
if (isSelfHealEnabled) {
|
|
155
|
+
bstackLogger_1.BStackLogger.warn('Something went wrong. Disabling healing for this session. Please try again later.');
|
|
156
|
+
}
|
|
157
|
+
sendEvent.tcgDown(config);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
if (isSelfHealEnabled) {
|
|
161
|
+
bstackLogger_1.BStackLogger.warn('Authentication Failed. Disabling Healing for this session.');
|
|
162
|
+
}
|
|
163
|
+
sendEvent.tcgAuthFailure(config);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function handleAuthenticationSuccess(isHealingEnabledForUser, userId, config, isSelfHealEnabled) {
|
|
167
|
+
if (!isHealingEnabledForUser && isSelfHealEnabled) {
|
|
168
|
+
bstackLogger_1.BStackLogger.warn('Healing is not enabled for your group, please contact the admin');
|
|
169
|
+
}
|
|
170
|
+
else if (userId && isHealingEnabledForUser) {
|
|
171
|
+
sendEvent.tcgtInitSuccessful(config);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function handleInitializationFailure(status, config, isSelfHealEnabled) {
|
|
175
|
+
if (status >= 400) {
|
|
176
|
+
sendEvent.initFailed(config);
|
|
177
|
+
}
|
|
178
|
+
else if (!status && isSelfHealEnabled) {
|
|
179
|
+
sendEvent.invalidTcgAuth(config);
|
|
180
|
+
}
|
|
181
|
+
if (isSelfHealEnabled) {
|
|
182
|
+
bstackLogger_1.BStackLogger.warn('Authentication Failed. Healing will be disabled for this session.');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function handleHealingInstrumentation(authResult, config, isSelfHealEnabled) {
|
|
186
|
+
try {
|
|
187
|
+
if (isProxyError(authResult)) {
|
|
188
|
+
handleProxyError(config, isSelfHealEnabled);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const { message, isAuthenticated, status, userId, groupId, isHealingEnabled: isHealingEnabledForUser } = authResult;
|
|
192
|
+
if (message === 'Upgrade required') {
|
|
193
|
+
handleUpgradeRequired(isSelfHealEnabled);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (!isAuthenticated) {
|
|
197
|
+
handleAuthenticationFailure(status, config, isSelfHealEnabled);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (isAuthenticated && userId && groupId) {
|
|
201
|
+
handleAuthenticationSuccess(isHealingEnabledForUser, userId, config, isSelfHealEnabled);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (status >= 400 || !status) {
|
|
205
|
+
handleInitializationFailure(status, config, isSelfHealEnabled);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
bstackLogger_1.BStackLogger.debug('Error in handling healing instrumentation: ' + err);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.handleHealingInstrumentation = handleHealingInstrumentation;
|
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 { App, AppConfig, AppUploadResponse, BrowserstackConfig, UserConfig } from './types';
|
|
3
|
+
import type { App, AppConfig, AppUploadResponse, BrowserstackConfig, BrowserstackOptions, UserConfig } from './types';
|
|
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>;
|
|
@@ -34,6 +34,7 @@ export default class BrowserstackLauncherService implements Services.ServiceInst
|
|
|
34
34
|
}): void;
|
|
35
35
|
_updateCaps(capabilities?: Capabilities.RemoteCapabilities, capType?: string, value?: string): void;
|
|
36
36
|
_handleBuildIdentifier(capabilities?: Capabilities.RemoteCapabilities): void;
|
|
37
|
+
_updateBrowserStackPercyConfig(): void;
|
|
37
38
|
/**
|
|
38
39
|
* @return {string} if buildName doesn't exist in json file, it will return 1
|
|
39
40
|
* else returns corresponding value in json file (e.g. { "wdio-build": { "identifier" : 2 } } => 2 in this case)
|
package/build/launcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,yBAAyB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMlE,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,yBAAyB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMlE,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAiCrH,KAAK,iBAAiB,GAAG,yBAAyB,CAAC,KAAK,GAAG;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC/C,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;IA4GjC,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;IAalC,SAAS,CAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,kBAAkB;IAqLpF,UAAU;IAoEV,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU;IAuB7G,SAAS;IAYT,UAAU,CAAC,GAAG,EAAC,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqBrD;;;OAGG;IACG,YAAY,CAAE,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBhE,qBAAqB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KAAE;IAiFvH,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAC,MAAM;IAoF3F,sBAAsB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB;IAyCrE,8BAA8B;IAgB9B;;;OAGG;IACH,oBAAoB;IA6BpB,sBAAsB,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,EAAC,MAAM,EAAE,eAAe,CAAC,EAAC,MAAM;CAQtF"}
|
package/build/launcher.js
CHANGED
|
@@ -47,6 +47,8 @@ const PercyLogger_1 = require("./Percy/PercyLogger");
|
|
|
47
47
|
const exitHandler_1 = require("./exitHandler");
|
|
48
48
|
const config_1 = __importDefault(require("./config"));
|
|
49
49
|
const funnelInstrumentation_1 = require("./instrumentation/funnelInstrumentation");
|
|
50
|
+
const ai_handler_1 = __importDefault(require("./ai-handler"));
|
|
51
|
+
const bstackLogger_1 = require("./bstackLogger");
|
|
50
52
|
const log = (0, logger_1.default)('@wdio/browserstack-service');
|
|
51
53
|
class BrowserstackLauncherService {
|
|
52
54
|
constructor(_options, capabilities, _config) {
|
|
@@ -59,7 +61,7 @@ class BrowserstackLauncherService {
|
|
|
59
61
|
this.browserStackConfig = config_1.default.getInstance(_options, _config);
|
|
60
62
|
if (Array.isArray(capabilities)) {
|
|
61
63
|
capabilities.forEach((capability) => {
|
|
62
|
-
var _a, _b;
|
|
64
|
+
var _a, _b, _c;
|
|
63
65
|
if (!capability['bstack:options']) {
|
|
64
66
|
if ((0, util_2.isBStackSession)(this._config)) {
|
|
65
67
|
const extensionCaps = Object.keys(capability).filter((cap) => cap.includes(':'));
|
|
@@ -78,6 +80,8 @@ class BrowserstackLauncherService {
|
|
|
78
80
|
}
|
|
79
81
|
this._buildIdentifier = (_a = capability['browserstack.buildIdentifier']) === null || _a === void 0 ? void 0 : _a.toString();
|
|
80
82
|
this._buildName = (_b = capability['build']) === null || _b === void 0 ? void 0 : _b.toString();
|
|
83
|
+
// @ts-ignore
|
|
84
|
+
this._projectName = (_c = capability['project']) === null || _c === void 0 ? void 0 : _c.toString();
|
|
81
85
|
}
|
|
82
86
|
else {
|
|
83
87
|
capability['bstack:options'].wdioService = package_json_1.version;
|
|
@@ -113,6 +117,10 @@ class BrowserstackLauncherService {
|
|
|
113
117
|
}
|
|
114
118
|
}
|
|
115
119
|
this._buildIdentifier = caps.capabilities['browserstack.buildIdentifier'];
|
|
120
|
+
// @ts-ignore
|
|
121
|
+
this._buildName = caps.capabilities['build'];
|
|
122
|
+
// @ts-ignore
|
|
123
|
+
this._projectName = caps.capabilities['project'];
|
|
116
124
|
}
|
|
117
125
|
else {
|
|
118
126
|
const bstackOptions = caps.capabilities['bstack:options'];
|
|
@@ -167,6 +175,30 @@ class BrowserstackLauncherService {
|
|
|
167
175
|
async onPrepare(config, capabilities) {
|
|
168
176
|
// // Send Funnel start request
|
|
169
177
|
await (0, funnelInstrumentation_1.sendStart)(this.browserStackConfig);
|
|
178
|
+
// 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
|
|
179
|
+
if (!(0, util_2.shouldAddServiceVersion)(this._config, this._options.testObservability, capabilities)) {
|
|
180
|
+
try {
|
|
181
|
+
if (capabilities.browserName) {
|
|
182
|
+
capabilities = await ai_handler_1.default.setup(this._config, this.browserStackConfig, this._options, capabilities, false);
|
|
183
|
+
}
|
|
184
|
+
else if (Array.isArray(capabilities)) {
|
|
185
|
+
for (let i = 0; i < capabilities.length; i++) {
|
|
186
|
+
if (capabilities[i].browserName) {
|
|
187
|
+
capabilities[i] = await ai_handler_1.default.setup(this._config, this.browserStackConfig, this._options, capabilities[i], false);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else if ((0, util_2.isValidCapsForHealing)(capabilities)) {
|
|
192
|
+
// setting up healing in case capabilities.xyz.capabilities.browserName where xyz can be anything:
|
|
193
|
+
capabilities = await ai_handler_1.default.setup(this._config, this.browserStackConfig, this._options, capabilities, true);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
if (this._options.selfHeal === true) {
|
|
198
|
+
bstackLogger_1.BStackLogger.warn(`Error while setting up Browserstack healing Extension ${err}. Disabling healing for this session.`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
170
202
|
/**
|
|
171
203
|
* Upload app to BrowserStack if valid file path to app is given.
|
|
172
204
|
* Update app value of capability directly if app_url, custom_id, shareable_id is given
|
|
@@ -253,13 +285,15 @@ class BrowserstackLauncherService {
|
|
|
253
285
|
buildIdentifier: this._buildIdentifier
|
|
254
286
|
});
|
|
255
287
|
}
|
|
256
|
-
|
|
288
|
+
const shouldSetupPercy = this._options.percy || ((0, util_2.isUndefined)(this._options.percy) && this._options.app);
|
|
289
|
+
if (shouldSetupPercy) {
|
|
257
290
|
try {
|
|
258
291
|
const bestPlatformPercyCaps = (0, PercyHelper_1.getBestPlatformForPercySnapshot)(capabilities);
|
|
259
292
|
this._percyBestPlatformCaps = bestPlatformPercyCaps;
|
|
260
293
|
await this.setupPercy(this._options, this._config, {
|
|
261
294
|
projectName: this._projectName
|
|
262
295
|
});
|
|
296
|
+
this._updateBrowserStackPercyConfig();
|
|
263
297
|
}
|
|
264
298
|
catch (err) {
|
|
265
299
|
PercyLogger_1.PercyLogger.error(`Error while setting up Percy ${err}`);
|
|
@@ -330,8 +364,8 @@ class BrowserstackLauncherService {
|
|
|
330
364
|
}
|
|
331
365
|
if (this._options.percy) {
|
|
332
366
|
await this.stopPercy();
|
|
367
|
+
PercyLogger_1.PercyLogger.clearLogger();
|
|
333
368
|
}
|
|
334
|
-
PercyLogger_1.PercyLogger.clearLogger();
|
|
335
369
|
await (0, funnelInstrumentation_1.sendFinish)(this.browserStackConfig);
|
|
336
370
|
if (!this.browserstackLocal || !this.browserstackLocal.isRunning()) {
|
|
337
371
|
return;
|
|
@@ -679,6 +713,18 @@ class BrowserstackLauncherService {
|
|
|
679
713
|
}
|
|
680
714
|
}
|
|
681
715
|
}
|
|
716
|
+
_updateBrowserStackPercyConfig() {
|
|
717
|
+
const { percyAutoEnabled = false, percyCaptureMode, buildId, percy } = this._percy || {};
|
|
718
|
+
// Setting to browserStackConfig for populating data in funnel instrumentaion
|
|
719
|
+
this.browserStackConfig.percyCaptureMode = percyCaptureMode;
|
|
720
|
+
this.browserStackConfig.percyBuildId = buildId;
|
|
721
|
+
this.browserStackConfig.isPercyAutoEnabled = percyAutoEnabled;
|
|
722
|
+
// To handle stop percy build
|
|
723
|
+
this._options.percy = percy;
|
|
724
|
+
// To pass data to workers
|
|
725
|
+
process.env.BROWSERSTACK_PERCY = String(percy);
|
|
726
|
+
process.env.BROWSERSTACK_PERCY_CAPTURE_MODE = percyCaptureMode;
|
|
727
|
+
}
|
|
682
728
|
/**
|
|
683
729
|
* @return {string} if buildName doesn't exist in json file, it will return 1
|
|
684
730
|
* else returns corresponding value in json file (e.g. { "wdio-build": { "identifier" : 2 } } => 2 in this case)
|
package/build/service.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export default class BrowserstackService implements Services.ServiceInstance {
|
|
|
17
17
|
private _observability;
|
|
18
18
|
private _currentTest?;
|
|
19
19
|
private _insightsHandler?;
|
|
20
|
+
private _percyCaptureMode;
|
|
20
21
|
private _accessibility;
|
|
21
22
|
private _accessibilityHandler?;
|
|
22
23
|
private _turboScale;
|
package/build/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/build/service.js
CHANGED
|
@@ -16,6 +16,8 @@ const Percy_Handler_1 = __importDefault(require("./Percy/Percy-Handler"));
|
|
|
16
16
|
const listener_1 = __importDefault(require("./testOps/listener"));
|
|
17
17
|
const data_store_1 = require("./data-store");
|
|
18
18
|
const usageStats_1 = __importDefault(require("./testOps/usageStats"));
|
|
19
|
+
const ai_handler_1 = __importDefault(require("./ai-handler"));
|
|
20
|
+
const bstackLogger_1 = require("./bstackLogger");
|
|
19
21
|
const log = (0, logger_1.default)('@wdio/browserstack-service');
|
|
20
22
|
class BrowserstackService {
|
|
21
23
|
constructor(options, _caps, _config) {
|
|
@@ -27,12 +29,14 @@ class BrowserstackService {
|
|
|
27
29
|
this._scenariosThatRan = [];
|
|
28
30
|
this._failureStatuses = ['failed', 'ambiguous', 'undefined', 'unknown'];
|
|
29
31
|
this._specsRan = false;
|
|
32
|
+
this._percyCaptureMode = undefined;
|
|
30
33
|
this._options = { ...constants_1.DEFAULT_OPTIONS, ...options };
|
|
31
34
|
// added to maintain backward compatibility with webdriverIO v5
|
|
32
35
|
this._config || (this._config = this._options);
|
|
33
36
|
this._observability = this._options.testObservability;
|
|
34
37
|
this._accessibility = this._options.accessibility;
|
|
35
|
-
this._percy =
|
|
38
|
+
this._percy = process.env.BROWSERSTACK_PERCY === 'true';
|
|
39
|
+
this._percyCaptureMode = process.env.BROWSERSTACK_PERCY_CAPTURE_MODE;
|
|
36
40
|
this._turboScale = this._options.turboScale;
|
|
37
41
|
if (this._observability) {
|
|
38
42
|
(_a = this._config.reporters) === null || _a === void 0 ? void 0 : _a.push(reporter_1.default);
|
|
@@ -43,6 +47,7 @@ class BrowserstackService {
|
|
|
43
47
|
if (process.env.BROWSERSTACK_TURBOSCALE) {
|
|
44
48
|
this._turboScale = process.env.BROWSERSTACK_TURBOSCALE === 'true';
|
|
45
49
|
}
|
|
50
|
+
process.env.BROWSERSTACK_TURBOSCALE_INTERNAL = String(this._turboScale);
|
|
46
51
|
// Cucumber specific
|
|
47
52
|
const strict = Boolean(this._config.cucumberOpts && this._config.cucumberOpts.strict);
|
|
48
53
|
// See https://github.com/cucumber/cucumber-js/blob/master/src/runtime/index.ts#L136
|
|
@@ -77,6 +82,17 @@ class BrowserstackService {
|
|
|
77
82
|
async before(caps, specs, browser) {
|
|
78
83
|
// added to maintain backward compatibility with webdriverIO v5
|
|
79
84
|
this._browser = browser ? browser : global.browser;
|
|
85
|
+
// Healing Support:
|
|
86
|
+
if (!(0, util_1.shouldAddServiceVersion)(this._config, this._options.testObservability, caps)) {
|
|
87
|
+
try {
|
|
88
|
+
await ai_handler_1.default.selfHeal(this._options, caps, this._browser);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
if (this._options.selfHeal === true) {
|
|
92
|
+
bstackLogger_1.BStackLogger.warn(`Error while setting up self-healing: ${err}. Disabling healing for this session.`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
80
96
|
// Ensure capabilities are not null in case of multiremote
|
|
81
97
|
if (this._isAppAutomate()) {
|
|
82
98
|
this._sessionBaseUrl = 'https://api-cloud.browserstack.com/app-automate/sessions';
|
|
@@ -87,13 +103,13 @@ class BrowserstackService {
|
|
|
87
103
|
this._scenariosThatRan = [];
|
|
88
104
|
if (this._browser) {
|
|
89
105
|
if (this._percy) {
|
|
90
|
-
this._percyHandler = new Percy_Handler_1.default(this.
|
|
106
|
+
this._percyHandler = new Percy_Handler_1.default(this._percyCaptureMode, this._browser, this._caps, this._isAppAutomate(), this._config.framework);
|
|
91
107
|
this._percyHandler.before();
|
|
92
108
|
}
|
|
93
109
|
try {
|
|
94
110
|
if (this._observability) {
|
|
95
111
|
(0, util_1.patchConsoleLogs)();
|
|
96
|
-
this._insightsHandler = new insights_handler_1.default(this._browser, this._browser.capabilities, this.
|
|
112
|
+
this._insightsHandler = new insights_handler_1.default(this._browser, this._browser.capabilities, this._browser.sessionId, this._config.framework, this._caps, this._options);
|
|
97
113
|
await this._insightsHandler.before();
|
|
98
114
|
}
|
|
99
115
|
if (this._browser && (0, util_1.isBrowserstackSession)(this._browser)) {
|
package/build/types.d.ts
CHANGED
|
@@ -30,6 +30,9 @@ export interface TestObservabilityOptions {
|
|
|
30
30
|
user?: string;
|
|
31
31
|
key?: string;
|
|
32
32
|
}
|
|
33
|
+
export interface BrowserstackOptions extends Options.Testrunner {
|
|
34
|
+
selfHeal?: boolean;
|
|
35
|
+
}
|
|
33
36
|
export interface BrowserstackConfig {
|
|
34
37
|
/**
|
|
35
38
|
*`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":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEpE,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;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/build/util.d.ts
CHANGED
|
@@ -109,7 +109,12 @@ export declare function getHierarchy(fullTitle?: string): string[];
|
|
|
109
109
|
export declare function getHookType(hookName: string): string;
|
|
110
110
|
export declare function isScreenshotCommand(args: BeforeCommandArgs & AfterCommandArgs): boolean | "" | undefined;
|
|
111
111
|
export declare function isBStackSession(config: Options.Testrunner): boolean;
|
|
112
|
-
export declare function
|
|
112
|
+
export declare function isBrowserstackInfra(config: BrowserstackConfig & Options.Testrunner, caps?: Capabilities.BrowserStackCapabilities): boolean;
|
|
113
|
+
export declare function getBrowserStackUserAndKey(config: Options.Testrunner, options: Options.Testrunner): {
|
|
114
|
+
user: string | undefined;
|
|
115
|
+
key: string | undefined;
|
|
116
|
+
};
|
|
117
|
+
export declare function shouldAddServiceVersion(config: Options.Testrunner, testObservability?: boolean, caps?: Capabilities.BrowserStackCapabilities): boolean;
|
|
113
118
|
export declare function batchAndPostEvents(eventUrl: string, kind: string, data: UploadType[]): Promise<void>;
|
|
114
119
|
export declare function getObservabilityUser(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner): string | undefined;
|
|
115
120
|
export declare function getObservabilityKey(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner): string | undefined;
|
|
@@ -156,5 +161,11 @@ export declare const getErrorString: (err: unknown) => string | undefined;
|
|
|
156
161
|
export declare function truncateString(field: string, truncateSizeInBytes: number): string;
|
|
157
162
|
export declare function getSizeOfJsonObjectInBytes(jsonData: GitMetaData): number;
|
|
158
163
|
export declare function checkAndTruncateVCSInfo(gitMetaData: GitMetaData): GitMetaData;
|
|
164
|
+
export declare const hasBrowserName: (cap: WebdriverIO.Config) => boolean;
|
|
165
|
+
export declare const isValidCapsForHealing: (caps: {
|
|
166
|
+
[key: string]: Options.Testrunner;
|
|
167
|
+
}) => boolean;
|
|
168
|
+
export declare function isTurboScale(options: (BrowserstackConfig & Options.Testrunner) | undefined): boolean;
|
|
169
|
+
export declare function getObservabilityProduct(options: (BrowserstackConfig & Options.Testrunner) | undefined, isAppAutomate: boolean | undefined): string;
|
|
159
170
|
export {};
|
|
160
171
|
//# 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":";;AAEA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAIpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAIjC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAG9D,OAAO,EAAc,UAAU,EAAkB,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAuBpF,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;CASlC,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,mBAAmB,UAa1E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,6BASzJ;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,YAAY,WAWvE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAUpF;AAaD,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,aACX,GAAG,SAYhC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,aACf,GAAG,SAehC;AAOD,KAAK,SAAS,GAAG;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;CAAE,CAAC;AAC/C,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CA8B3E;AAED,eAAO,MAAM,iBAAiB,YAvDA,GAAG,QAuI/B,CAAA;AAEF,eAAO,MAAM,iBAAiB,YAzIA,GAAG,QAyL/B,CAAA;AAEF,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4NxB;AAED,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,mBAyBjI;AAED,wBAAsB,cAAc,gBA0BnC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAYrF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAEpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,MAAM,CAahG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,OAAO,CAKvG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,wBA8BhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWnD;AAGD,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,YAG9C;AAED,wBAAgB,WAAW,CAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,wBAAgB,mBAAmB,CAAE,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,4BAE9E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,WAKzD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAEA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAIpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAIjC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAG9D,OAAO,EAAc,UAAU,EAAkB,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAuBpF,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;CASlC,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,mBAAmB,UAa1E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,gBAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,6BASzJ;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,YAAY,WAWvE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAUpF;AAaD,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,aACX,GAAG,SAYhC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,aACf,GAAG,SAehC;AAOD,KAAK,SAAS,GAAG;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;CAAE,CAAC;AAC/C,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CA8B3E;AAED,eAAO,MAAM,iBAAiB,YAvDA,GAAG,QAuI/B,CAAA;AAEF,eAAO,MAAM,iBAAiB,YAzIA,GAAG,QAyL/B,CAAA;AAEF,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4NxB;AAED,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,mBAyBjI;AAED,wBAAsB,cAAc,gBA0BnC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAYrF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAEpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,MAAM,CAahG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,OAAO,CAKvG;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,wBA8BhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWnD;AAGD,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,YAG9C;AAED,wBAAgB,WAAW,CAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,wBAAgB,mBAAmB,CAAE,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,4BAE9E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,WAKzD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,wBAAwB,GAAG,OAAO,CAiC1I;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU;;;EAoBhG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,wBAAwB,GAAG,OAAO,CAKtJ;AAED,wBAAsB,kBAAkB,CAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,iBAyB3F;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,sBAQhH;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,sBAQ/G;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM,sBAQnH;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,UAQ/G;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAW7H;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,WAUrE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAC,KAAK;;;;;;EAUnD;AAED,wBAAgB,gBAAgB,SAiB/B;AAED,eAAO,MAAM,KAAK,mCAAkE,CAAA;AAEpF,eAAO,MAAM,oBAAoB,gBAAiB,GAAG;;+BAA0D,GAAG,YA0BjH,CAAA;AAED,eAAO,MAAM,8BAA8B,eAAgB,MAAM,GAAG,SAAS,aAAa,MAAM;;qCAc/F,CAAA;AAED,eAAO,MAAM,gCAAgC,uBAAwB,OAAO,GAAG,MAAM,6BAQpF,CAAA;AAED,eAAO,MAAM,0BAA0B,YA30BT,GAAG,QAu6B/B,CAAA;AAEF,eAAO,MAAM,eAAe,YAAmB,GAAG,0BAA0B,OAAO,oBAAoB,OAAO,GAAG,MAAM,gBAAgB,MAAM;;cAmB5I,CAAA;AAED,eAAO,MAAM,cAAc,YAAmB,GAAG,0BAA0B,OAAO,oBAAoB,OAAO,GAAG,MAAM;;IAoBrH,CAAA;AAED,eAAO,MAAM,qBAAqB,YAAmB,GAAG,0BAA0B,OAAO,oBAAoB,OAAO,GAAG,MAAM;;EAmB5H,CAAA;AAED,eAAO,MAAM,wBAAwB,YAz+BP,GAAG,QAshC/B,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,sBAK7D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,sBAK5D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,WAErC;AAED,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,WAEjC;AAED,eAAO,MAAM,QAAQ,WAAY,GAAG,YAEnC,CAAA;AAED,eAAO,MAAM,eAAe,YAAa,GAAG,WAAW,GAAG,YAezD,CAAA;AAED,eAAO,MAAM,kBAAkB,YApjCD,GAAG,QAmkC/B,CAAA;AACF,eAAO,MAAM,aAAa,eAAgB,OAAO,YAMhD,CAAA;AAED,eAAO,MAAM,cAAc,QAAS,OAAO,uBAS1C,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAejF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CASxE;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAW7E;AAED,eAAO,MAAM,cAAc,QAAS,YAAY,MAAM,KAAG,OAMxD,CAAA;AAED,eAAO,MAAM,qBAAqB;;MAAkD,OAOnF,CAAA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,CAAC,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,OAAO,CAEpG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,CAAC,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAIlJ"}
|
package/build/util.js
CHANGED
|
@@ -26,8 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.
|
|
30
|
-
exports.checkAndTruncateVCSInfo = exports.getSizeOfJsonObjectInBytes = exports.truncateString = exports.getErrorString = exports.isObjectEmpty = void 0;
|
|
29
|
+
exports.isObject = exports.isTrue = exports.isUndefined = exports.getBrowserStackKey = exports.getBrowserStackUser = exports.stopAccessibilityTestRun = exports.getA11yResultsSummary = exports.getA11yResults = exports.performA11yScan = exports.createAccessibilityTestRun = exports.isAccessibilityAutomationSession = exports.shouldScanTestForAccessibility = exports.validateCapsWithA11y = exports.sleep = exports.patchConsoleLogs = exports.getFailureObject = exports.frameworkSupportsHook = exports.getObservabilityBuildTags = exports.getObservabilityBuild = exports.getObservabilityProject = exports.getObservabilityKey = exports.getObservabilityUser = exports.batchAndPostEvents = exports.shouldAddServiceVersion = exports.getBrowserStackUserAndKey = exports.isBrowserstackInfra = exports.isBStackSession = exports.isScreenshotCommand = exports.getHookType = exports.getHierarchy = exports.getLogTag = exports.removeAnsiColors = exports.getScenarioExamples = exports.isBrowserstackSession = exports.getCloudProvider = exports.getUniqueIdentifierForCucumber = exports.getUniqueIdentifier = exports.getGitMetaData = exports.nodeRequest = exports.getCiInfo = exports.stopBuildUpstream = exports.launchTestSession = exports.o11yClassErrorHandler = exports.o11yErrorHandler = exports.errorHandler = exports.getParentSuiteName = exports.isBrowserstackCapability = exports.getBrowserCapabilities = exports.getBrowserDescription = exports.DEFAULT_REQUEST_CONFIG = void 0;
|
|
30
|
+
exports.getObservabilityProduct = exports.isTurboScale = exports.isValidCapsForHealing = exports.hasBrowserName = exports.checkAndTruncateVCSInfo = exports.getSizeOfJsonObjectInBytes = exports.truncateString = exports.getErrorString = exports.isObjectEmpty = exports.getPlatformVersion = exports.ObjectsAreEqual = void 0;
|
|
31
31
|
const os_1 = require("os");
|
|
32
32
|
const util_1 = require("util");
|
|
33
33
|
const http_1 = __importDefault(require("http"));
|
|
@@ -731,8 +731,58 @@ function isBStackSession(config) {
|
|
|
731
731
|
return false;
|
|
732
732
|
}
|
|
733
733
|
exports.isBStackSession = isBStackSession;
|
|
734
|
-
function
|
|
735
|
-
|
|
734
|
+
function isBrowserstackInfra(config, caps) {
|
|
735
|
+
// a utility function to check if the hostname is browserstack
|
|
736
|
+
const isBrowserstack = (str) => {
|
|
737
|
+
return str.includes('browserstack.com');
|
|
738
|
+
};
|
|
739
|
+
if ((config.hostname) && !isBrowserstack(config.hostname)) {
|
|
740
|
+
return false;
|
|
741
|
+
}
|
|
742
|
+
if (caps && typeof caps === 'object') {
|
|
743
|
+
if (Array.isArray(caps)) {
|
|
744
|
+
for (const capability of caps) {
|
|
745
|
+
if ((capability.hostname) && !isBrowserstack(capability.hostname)) {
|
|
746
|
+
return false;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
for (const key in caps) {
|
|
752
|
+
const capability = caps[key];
|
|
753
|
+
if ((capability.hostname) && !isBrowserstack(capability.hostname)) {
|
|
754
|
+
return false;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
if (!isBStackSession(config)) {
|
|
760
|
+
return false;
|
|
761
|
+
}
|
|
762
|
+
return true;
|
|
763
|
+
}
|
|
764
|
+
exports.isBrowserstackInfra = isBrowserstackInfra;
|
|
765
|
+
function getBrowserStackUserAndKey(config, options) {
|
|
766
|
+
// Fallback 1: Env variables
|
|
767
|
+
// Fallback 2: Service variables in wdio.conf.js (that are received inside options object)
|
|
768
|
+
const envOrServiceVariables = {
|
|
769
|
+
user: getBrowserStackUser(options),
|
|
770
|
+
key: getBrowserStackKey(options)
|
|
771
|
+
};
|
|
772
|
+
if (envOrServiceVariables.user && envOrServiceVariables.key) {
|
|
773
|
+
return envOrServiceVariables;
|
|
774
|
+
}
|
|
775
|
+
// Fallback 3: Service variables in testObservabilityOptions object
|
|
776
|
+
// Fallback 4: Service variables in the top level config object
|
|
777
|
+
const o11yVariables = {
|
|
778
|
+
user: getObservabilityUser(options, config),
|
|
779
|
+
key: getObservabilityKey(options, config)
|
|
780
|
+
};
|
|
781
|
+
return o11yVariables;
|
|
782
|
+
}
|
|
783
|
+
exports.getBrowserStackUserAndKey = getBrowserStackUserAndKey;
|
|
784
|
+
function shouldAddServiceVersion(config, testObservability, caps) {
|
|
785
|
+
if ((config.services && config.services.toString().includes('chromedriver') && testObservability !== false) || !isBrowserstackInfra(config, caps)) {
|
|
736
786
|
return false;
|
|
737
787
|
}
|
|
738
788
|
return true;
|
|
@@ -1205,3 +1255,28 @@ function checkAndTruncateVCSInfo(gitMetaData) {
|
|
|
1205
1255
|
return gitMetaData;
|
|
1206
1256
|
}
|
|
1207
1257
|
exports.checkAndTruncateVCSInfo = checkAndTruncateVCSInfo;
|
|
1258
|
+
const hasBrowserName = (cap) => {
|
|
1259
|
+
if (!cap || !cap.capabilities) {
|
|
1260
|
+
return false;
|
|
1261
|
+
}
|
|
1262
|
+
const browserStackCapabilities = cap.capabilities;
|
|
1263
|
+
return browserStackCapabilities.browserName !== undefined;
|
|
1264
|
+
};
|
|
1265
|
+
exports.hasBrowserName = hasBrowserName;
|
|
1266
|
+
const isValidCapsForHealing = (caps) => {
|
|
1267
|
+
// Get all capability values
|
|
1268
|
+
const capValues = Object.values(caps);
|
|
1269
|
+
// Check if there are any capabilities and if at least one has a browser name
|
|
1270
|
+
return capValues.length > 0 && capValues.some(exports.hasBrowserName);
|
|
1271
|
+
};
|
|
1272
|
+
exports.isValidCapsForHealing = isValidCapsForHealing;
|
|
1273
|
+
function isTurboScale(options) {
|
|
1274
|
+
return Boolean(options === null || options === void 0 ? void 0 : options.turboScale);
|
|
1275
|
+
}
|
|
1276
|
+
exports.isTurboScale = isTurboScale;
|
|
1277
|
+
function getObservabilityProduct(options, isAppAutomate) {
|
|
1278
|
+
return isAppAutomate
|
|
1279
|
+
? 'app-automate'
|
|
1280
|
+
: (isTurboScale(options) ? 'turboscale' : 'automate');
|
|
1281
|
+
}
|
|
1282
|
+
exports.getObservabilityProduct = getObservabilityProduct;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wdio/browserstack-service",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.39.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",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"url": "https://github.com/webdriverio/webdriverio/issues"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
+
"@browserstack/ai-sdk-node": "1.5.9",
|
|
26
27
|
"@percy/appium-app": "^2.0.1",
|
|
27
28
|
"@percy/selenium-webdriver": "^2.0.2",
|
|
28
29
|
"@types/gitconfiglocal": "^2.0.1",
|
|
@@ -47,5 +48,5 @@
|
|
|
47
48
|
"access": "public"
|
|
48
49
|
},
|
|
49
50
|
"types": "./build/index.d.ts",
|
|
50
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "caed31252d3df187e8482d0e60c5675f18eeb0d9"
|
|
51
52
|
}
|