@mablhq/mabl-cli 1.17.0 → 1.19.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.
Files changed (73) hide show
  1. package/api/basicApiClient.js +7 -1
  2. package/api/featureSet.js +1 -4
  3. package/api/mablApiClient.js +3 -3
  4. package/browserLauncher/browserLauncherFactory.js +2 -3
  5. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowser.js +3 -0
  6. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +11 -9
  7. package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +1 -11
  8. package/browserLauncher/playwrightBrowserLauncher/playwrightFrame.js +18 -0
  9. package/browserLauncher/runnerType.js +0 -1
  10. package/commands/constants.js +3 -2
  11. package/commands/tests/testsUtil.js +11 -6
  12. package/commands/tests/tests_cmds/run.js +5 -0
  13. package/domUtil/index.js +1 -1
  14. package/domUtil/index.js.LICENSE.txt +5 -5
  15. package/execution/index.js +1 -1
  16. package/execution/index.js.LICENSE.txt +7 -5
  17. package/index.d.ts +0 -1
  18. package/mablscript/MablAction.js +1 -1
  19. package/mablscript/MablStep.js +21 -3
  20. package/mablscript/actions/AwaitPDFDownloadAction.js +2 -1
  21. package/mablscript/actions/ConditionAction.js +11 -3
  22. package/mablscript/actions/ExtractAction.js +16 -7
  23. package/mablscript/actions/FindAction.js +101 -69
  24. package/mablscript/actions/GenerateRandomStringAction.js +2 -1
  25. package/mablscript/actions/GetUrlAction.js +1 -1
  26. package/mablscript/actions/GetVariableValue.js +2 -2
  27. package/mablscript/diffing/diffingUtil.js +146 -0
  28. package/mablscript/importer.js +20 -2
  29. package/mablscript/steps/AccessibilityCheck.js +5 -5
  30. package/mablscript/steps/AssertStep.js +45 -31
  31. package/mablscript/steps/AssertStepOld.js +39 -21
  32. package/mablscript/steps/AwaitTabStep.js +7 -6
  33. package/mablscript/steps/ClickAndHoldStep.js +6 -6
  34. package/mablscript/steps/ClickStep.js +5 -5
  35. package/mablscript/steps/CreateVariableStep.js +2 -2
  36. package/mablscript/steps/DoubleClickStep.js +6 -6
  37. package/mablscript/steps/DownloadStep.js +3 -2
  38. package/mablscript/steps/EchoStep.js +3 -1
  39. package/mablscript/steps/ElseIfConditionStep.js +5 -2
  40. package/mablscript/steps/EnterTextStep.js +11 -8
  41. package/mablscript/steps/EvaluateFlowStep.js +40 -0
  42. package/mablscript/steps/HoverStep.js +5 -5
  43. package/mablscript/steps/IfConditionStep.js +6 -6
  44. package/mablscript/steps/ReleaseStep.js +7 -6
  45. package/mablscript/steps/RemoveCookieStep.js +2 -3
  46. package/mablscript/steps/SelectStep.js +5 -5
  47. package/mablscript/steps/SendHttpRequestStep.js +3 -3
  48. package/mablscript/steps/SendKeyStep.js +8 -8
  49. package/mablscript/steps/SetCookieStep.js +2 -4
  50. package/mablscript/steps/SetFilesStep.js +5 -5
  51. package/mablscript/steps/SetViewportStep.js +1 -1
  52. package/mablscript/steps/SwitchContextStep.js +3 -3
  53. package/mablscript/steps/VisitUrlStep.js +2 -1
  54. package/mablscript/steps/WaitStep.js +1 -4
  55. package/mablscript/steps/WaitUntilStep.js +3 -3
  56. package/{browserLauncher/puppeteerBrowserLauncher/internals.js → mablscript/types/EvaluateFlowStepDescriptor.js} +0 -0
  57. package/mablscript/types/GetCurrentLocationDescriptor.js +4 -3
  58. package/mablscriptFind/index.js +1 -1
  59. package/mablscriptFind/index.js.LICENSE.txt +5 -5
  60. package/package.json +3 -3
  61. package/resources/mablFind.js +1 -1
  62. package/resources/pdf-viewer/index.js +1 -1
  63. package/resources/pdf-viewer/libEmbeddedPdfHandler.js +11 -2
  64. package/util/actionabilityUtil.js +1 -24
  65. package/browserLauncher/puppeteerBrowserLauncher/puppeteerBrowser.js +0 -134
  66. package/browserLauncher/puppeteerBrowserLauncher/puppeteerBrowserLauncher.js +0 -45
  67. package/browserLauncher/puppeteerBrowserLauncher/puppeteerElementHandle.js +0 -139
  68. package/browserLauncher/puppeteerBrowserLauncher/puppeteerFrame.js +0 -115
  69. package/browserLauncher/puppeteerBrowserLauncher/puppeteerHttpRequest.js +0 -38
  70. package/browserLauncher/puppeteerBrowserLauncher/puppeteerHttpResponse.js +0 -27
  71. package/browserLauncher/puppeteerBrowserLauncher/puppeteerJsHandle.js +0 -36
  72. package/browserLauncher/puppeteerBrowserLauncher/puppeteerPage.js +0 -332
  73. package/browserLauncher/puppeteerBrowserLauncher/wrappers.js +0 -25
@@ -130,7 +130,13 @@ class BasicApiClient {
130
130
  return { ...result, entity_version: versionHeader };
131
131
  }
132
132
  async makePostRequest(path, requestBody, requestConfig) {
133
- const response = await this.debugRequest('POST', path, () => this.httpClient.post(path, requestBody, this.getNonRetryableRequestConfig(requestConfig)));
133
+ return this.postRequest(path, requestBody, this.getNonRetryableRequestConfig(requestConfig));
134
+ }
135
+ async makePostRequestWithRetries(path, requestBody, config) {
136
+ return this.retryWrappedRequest(`makePostRequestWithRetries('${path}')`, () => this.postRequest(path, requestBody, this.getRetryableRequestConfig(config)), config);
137
+ }
138
+ async postRequest(path, requestBody, config) {
139
+ const response = await this.debugRequest('POST', path, () => this.httpClient.post(path, requestBody, config));
134
140
  BasicApiClient.checkResponseStatusCode(response);
135
141
  return response.data;
136
142
  }
package/api/featureSet.js CHANGED
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FeatureSet = exports.FindImplementationVersion = void 0;
4
4
  const runnerType_1 = require("../browserLauncher/runnerType");
5
- const PLAYWRIGHT_FEATURE_FLAG = 'nodejs_execution_engine_playwright';
6
5
  const SMARTER_WAIT_FEATURE_FLAG = 'smarter_wait';
7
6
  var FindImplementationVersion;
8
7
  (function (FindImplementationVersion) {
@@ -14,9 +13,7 @@ class FeatureSet {
14
13
  this.featureFlags = featureFlags;
15
14
  }
16
15
  getRunnerType() {
17
- return this.featureFlags.has(PLAYWRIGHT_FEATURE_FLAG)
18
- ? runnerType_1.RunnerType.Playwright
19
- : runnerType_1.RunnerType.Puppeteer;
16
+ return runnerType_1.RunnerType.Playwright;
20
17
  }
21
18
  getFindImplementationVersion() {
22
19
  return this.featureFlags.has(SMARTER_WAIT_FEATURE_FLAG)
@@ -303,7 +303,7 @@ class MablApiClient extends basicApiClient_1.BasicApiClient {
303
303
  return await this.makeGetRequest(`${env_1.BASE_API_URL}/accounts/${accountId}`);
304
304
  }
305
305
  catch (error) {
306
- throw new ApiError_1.ApiError(`Failed to get account`, error, error.status);
306
+ throw toApiError(`Failed to get account`, error);
307
307
  }
308
308
  }
309
309
  async getApiKeyDetails() {
@@ -454,10 +454,10 @@ class MablApiClient extends basicApiClient_1.BasicApiClient {
454
454
  context_id: contextId,
455
455
  workspace_id: workspaceId,
456
456
  };
457
- return await this.makePostRequest(`${env_1.BASE_API_URL}/mailbox/address`, body);
457
+ return await this.makePostRequestWithRetries(`${env_1.BASE_API_URL}/mailbox/address`, body);
458
458
  }
459
459
  catch (error) {
460
- throw new ApiError_1.ApiError('Failed to create mailbox email address', error);
460
+ throw toApiError('Failed to create mailbox email address', error);
461
461
  }
462
462
  }
463
463
  async createBranch(workspaceId, branchName) {
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BrowserLauncherFactory = void 0;
7
- const puppeteerBrowserLauncher_1 = require("./puppeteerBrowserLauncher/puppeteerBrowserLauncher");
8
7
  const playwrightBrowserLauncher_1 = require("./playwrightBrowserLauncher/playwrightBrowserLauncher");
9
8
  const runnerType_1 = require("./runnerType");
10
9
  const logUtils_1 = require("../util/logUtils");
@@ -24,8 +23,8 @@ class BrowserLauncherFactory {
24
23
  loggerFunc(chalk_1.default.cyan(`Browser launcher:`, chalk_1.default.magenta('Playwright')));
25
24
  return new playwrightBrowserLauncher_1.PlaywrightBrowserLauncher();
26
25
  }
27
- loggerFunc(chalk_1.default.cyan(`Browser launcher:`, chalk_1.default.magenta('Puppeteer')));
28
- return new puppeteerBrowserLauncher_1.PuppeteerBrowserLauncher();
26
+ loggerFunc(chalk_1.default.red.bold(`Unsupported runner type:`, runner));
27
+ throw new Error(`Unsupported runner type:[${runner}]`);
29
28
  }
30
29
  }
31
30
  exports.BrowserLauncherFactory = BrowserLauncherFactory;
@@ -128,5 +128,8 @@ class PlaywrightBrowser extends events_1.default {
128
128
  await playwrightPage.waitForInitialization();
129
129
  return playwrightPage;
130
130
  }
131
+ exposeFunction(name, callback) {
132
+ return this.defaultContext.exposeFunction(name, callback);
133
+ }
131
134
  }
132
135
  exports.PlaywrightBrowser = PlaywrightBrowser;
@@ -23,20 +23,22 @@ class PlaywrightBrowserLauncher {
23
23
  :
24
24
  null;
25
25
  const defaultContext = await test_1.chromium.launchPersistentContext(options.userDataDir, {
26
- ignoreHTTPSErrors: true,
27
- headless: options.headless,
26
+ acceptDownloads: true,
28
27
  args: options.args,
29
- ignoreDefaultArgs: options.ignoreDefaultArgs,
28
+ bypassCSP: options.bypassContentSecurityPolicy,
29
+ deviceScaleFactor: (_a = options.defaultDeviceDescriptor) === null || _a === void 0 ? void 0 : _a.deviceScaleFactor,
30
30
  downloadsPath: options.downloadPath,
31
31
  executablePath: options.executablePath,
32
- viewport,
33
- acceptDownloads: true,
34
- httpCredentials: options.credentials,
35
32
  extraHTTPHeaders: options.extraHttpHeaders,
36
- isMobile: (_a = options.defaultDeviceDescriptor) === null || _a === void 0 ? void 0 : _a.isMobile,
37
- deviceScaleFactor: (_b = options.defaultDeviceDescriptor) === null || _b === void 0 ? void 0 : _b.deviceScaleFactor,
38
- hasTouch: (_c = options.defaultDeviceDescriptor) === null || _c === void 0 ? void 0 : _c.hasTouch,
33
+ hasTouch: (_b = options.defaultDeviceDescriptor) === null || _b === void 0 ? void 0 : _b.hasTouch,
34
+ headless: options.headless,
35
+ httpCredentials: options.credentials,
36
+ ignoreDefaultArgs: options.ignoreDefaultArgs,
37
+ ignoreHTTPSErrors: true,
38
+ isMobile: (_c = options.defaultDeviceDescriptor) === null || _c === void 0 ? void 0 : _c.isMobile,
39
39
  timeout: BROWSER_LAUNCH_TIMEOUT_MS,
40
+ userAgent: options.userAgent,
41
+ viewport,
40
42
  });
41
43
  return new playwrightBrowser_1.PlaywrightBrowser(defaultContext, path_1.default.join(options.downloadPath, 'final'), '');
42
44
  }
@@ -194,23 +194,13 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
194
194
  return this.element.selectOption(value);
195
195
  }
196
196
  async type(text, options) {
197
- const timeout = PlaywrightElementHandle.getTypeTimeout(text, options);
198
197
  await this.element.focus();
199
198
  await this.element.selectText({ force: true });
200
199
  return this.element.type(text, {
201
200
  delay: options === null || options === void 0 ? void 0 : options.delay,
202
- timeout,
201
+ timeout: 0,
203
202
  });
204
203
  }
205
- static getTypeTimeout(text, options) {
206
- var _a;
207
- let timeout;
208
- const newTimeout = text.length * ((_a = options === null || options === void 0 ? void 0 : options.delay) !== null && _a !== void 0 ? _a : 1) * 2;
209
- if (newTimeout > types_1.DefaultTimeouts.defaultTextInputTimeoutMs) {
210
- timeout = newTimeout;
211
- }
212
- return timeout;
213
- }
214
204
  press(key) {
215
205
  return this.element.press(key);
216
206
  }
@@ -178,5 +178,23 @@ class PlaywrightFrame extends browserLauncher_1.Frame {
178
178
  }
179
179
  return this.frameImpl;
180
180
  }
181
+ async initializeExposedFunctionInSecondaryWorld(functionName) {
182
+ var _a;
183
+ try {
184
+ const pageImpl = this.parentPage.getPageImpl();
185
+ if (!pageImpl) {
186
+ return false;
187
+ }
188
+ const binding = (_a = pageImpl._pageBindings.get(functionName)) !== null && _a !== void 0 ? _a : pageImpl._browserContext._pageBindings.get(functionName);
189
+ if (!binding) {
190
+ return false;
191
+ }
192
+ await this.evaluateCodeInSecondaryWorld(binding.source, {});
193
+ }
194
+ catch (e) {
195
+ return false;
196
+ }
197
+ return true;
198
+ }
181
199
  }
182
200
  exports.PlaywrightFrame = PlaywrightFrame;
@@ -4,5 +4,4 @@ exports.RunnerType = void 0;
4
4
  var RunnerType;
5
5
  (function (RunnerType) {
6
6
  RunnerType["Playwright"] = "playwright";
7
- RunnerType["Puppeteer"] = "puppeteer";
8
7
  })(RunnerType = exports.RunnerType || (exports.RunnerType = {}));
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CommandArgVariables = exports.CommandArgUrlApi = exports.CommandArgUrlApp = exports.CommandArgUrl = exports.CommandArgTrainerVersion = exports.CommandArgTo = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgPlanId = exports.CommandArgContentTypes = exports.CommandArgPreview = exports.CommandArgOutputFilePath = exports.CommandArgOutput = exports.CommandArgNoPrompt = exports.CommandArgPrompt = exports.CommandArgPortNumber = exports.CommandArgName = exports.CommandArgMablBranchChangesOnly = exports.CommandArgMablBranch = exports.CommandArgMablAutoLogin = exports.CommandArgMablAutoBranch = exports.CommandArgLinkBypass = exports.CommandArgLinkLabel = exports.CommandArgLimitOutput = exports.CommandArgLabels = exports.CommandArgLabelsInclude = exports.CommandArgLabelsExclude = exports.CommandArgTestInteractionSpeed = exports.CommandArgTestRunId = exports.CommandArgTestFile = exports.CommandArgId = exports.CommandArgHttpHeaders = exports.CommandArgHelp = exports.CommandArgFromPlanId = exports.CommandArgFrom = exports.CommandArgFormat = exports.CommandArgFastFailure = exports.CommandArgOverrideEnvironmentId = exports.CommandArgEnvironmentId = exports.CommandArgEnableLink = exports.CommandArgDetailLevel = exports.CommandArgDescription = exports.CommandArgDeploymentId = exports.CommandArgDecrypt = exports.CommandArgDataTables = exports.CommandArgCredentials = exports.CommandArgBasicAuthCredentials = exports.CommandArgBrowsers = exports.CommandArgApplicationId = exports.CommandArgApiKey = void 0;
4
- exports.BrowserTypeSelections = exports.DefaultBrowserType = exports.DefaultBranchName = exports.DefaultOutputFormatChoices = exports.DetailLevelFormats = exports.ReporterOptions = exports.OutputFormats = exports.CommandArgAliases = exports.CommandArgBrowserEnableExtensions = exports.CommandArgBrowserIgnoreCertificateErrors = exports.CommandArgBrowserDisableIsolation = exports.ListTimeFormat = exports.CommandArgReporterOptions = exports.CommandArgReporter = exports.CommandArgWorkspaceId = exports.CommandArgVersion = void 0;
3
+ exports.CommandArgUrlApi = exports.CommandArgUrlApp = exports.CommandArgUrl = exports.CommandArgTrainerVersion = exports.CommandArgTo = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgPlanId = exports.CommandArgContentTypes = exports.CommandArgPreview = exports.CommandArgOutputFilePath = exports.CommandArgOutput = exports.CommandArgNoPrompt = exports.CommandArgPrompt = exports.CommandArgPortNumber = exports.CommandArgName = exports.CommandArgMablBranchChangesOnly = exports.CommandArgMablBranch = exports.CommandArgMablAutoLogin = exports.CommandArgMablAutoBranch = exports.CommandArgLinkBypass = exports.CommandArgLinkLabel = exports.CommandArgLimitOutput = exports.CommandArgLabels = exports.CommandArgLabelsInclude = exports.CommandArgLabelsExclude = exports.CommandArgTestInteractionSpeed = exports.CommandArgTestRunId = exports.CommandArgTestFile = exports.CommandArgId = exports.CommandArgUserAgent = exports.CommandArgHttpHeaders = exports.CommandArgHelp = exports.CommandArgFromPlanId = exports.CommandArgFrom = exports.CommandArgFormat = exports.CommandArgFastFailure = exports.CommandArgOverrideEnvironmentId = exports.CommandArgEnvironmentId = exports.CommandArgEnableLink = exports.CommandArgDetailLevel = exports.CommandArgDescription = exports.CommandArgDeploymentId = exports.CommandArgDecrypt = exports.CommandArgDataTables = exports.CommandArgCredentials = exports.CommandArgBasicAuthCredentials = exports.CommandArgBrowsers = exports.CommandArgApplicationId = exports.CommandArgApiKey = void 0;
4
+ exports.BrowserTypeSelections = exports.DefaultBrowserType = exports.DefaultBranchName = exports.DefaultOutputFormatChoices = exports.DetailLevelFormats = exports.ReporterOptions = exports.OutputFormats = exports.CommandArgAliases = exports.CommandArgBrowserEnableExtensions = exports.CommandArgBrowserIgnoreCertificateErrors = exports.CommandArgBrowserDisableIsolation = exports.ListTimeFormat = exports.CommandArgReporterOptions = exports.CommandArgReporter = exports.CommandArgWorkspaceId = exports.CommandArgVersion = exports.CommandArgVariables = void 0;
5
5
  const browserTypes_1 = require("./browserTypes");
6
6
  exports.CommandArgApiKey = 'api-key';
7
7
  exports.CommandArgApplicationId = 'application-id';
@@ -22,6 +22,7 @@ exports.CommandArgFrom = 'from';
22
22
  exports.CommandArgFromPlanId = 'from-plan-id';
23
23
  exports.CommandArgHelp = 'help';
24
24
  exports.CommandArgHttpHeaders = 'http-headers';
25
+ exports.CommandArgUserAgent = 'user-agent';
25
26
  exports.CommandArgId = 'id';
26
27
  exports.CommandArgTestFile = 'test-file';
27
28
  exports.CommandArgTestRunId = 'run-id';
@@ -138,15 +138,17 @@ async function createBrowserWithAuthedExtension(accessToken, browserWidth, brows
138
138
  }
139
139
  exports.createBrowserWithAuthedExtension = createBrowserWithAuthedExtension;
140
140
  async function launchBrowserInstance(chromePath, launchArgs, userDataDir, headless, credentials, options) {
141
- const { defaultDeviceDescriptor, extraHttpHeaders, ignoreDefaultArgs, runnerType, loggerFunc, } = options || {};
141
+ const { bypassContentSecurityPolicy, defaultDeviceDescriptor, extraHttpHeaders, ignoreDefaultArgs, runnerType, loggerFunc, userAgent, } = options || {};
142
142
  let browser;
143
143
  try {
144
144
  browser = await maybeLaunchBrowser(chromePath, launchArgs, userDataDir, headless, credentials, {
145
+ bypassContentSecurityPolicy,
145
146
  defaultDeviceDescriptor,
146
147
  extraHttpHeaders,
147
148
  ignoreDefaultArgs,
148
149
  runnerType,
149
150
  loggerFunc,
151
+ userAgent,
150
152
  });
151
153
  }
152
154
  catch (error) {
@@ -154,6 +156,7 @@ async function launchBrowserInstance(chromePath, launchArgs, userDataDir, headle
154
156
  launchArgs.push('--no-sandbox');
155
157
  messaging_1.mablEventEmitter.log('Unable to initialize browser with standard settings, attempting to run with --no-sandbox setting', Date.now(), logLineMessaging_1.LogLineColor.yellow);
156
158
  return maybeLaunchBrowser(chromePath, launchArgs, userDataDir, headless, credentials, {
159
+ bypassContentSecurityPolicy,
157
160
  defaultDeviceDescriptor,
158
161
  ignoreDefaultArgs,
159
162
  runnerType,
@@ -168,8 +171,9 @@ async function launchBrowserInstance(chromePath, launchArgs, userDataDir, headle
168
171
  return browser;
169
172
  }
170
173
  function maybeLaunchBrowser(chromePath, launchArgs, userDataDir, headless, credentials, options) {
171
- const { defaultDeviceDescriptor, extraHttpHeaders, ignoreDefaultArgs, runnerType, loggerFunc, } = options || {};
174
+ const { bypassContentSecurityPolicy, defaultDeviceDescriptor, extraHttpHeaders, ignoreDefaultArgs, runnerType, loggerFunc, userAgent, } = options || {};
172
175
  return browserLauncher_1.BrowserLauncherFactory.createRunner(runnerType, loggerFunc).launch({
176
+ bypassContentSecurityPolicy,
173
177
  defaultDeviceDescriptor,
174
178
  executablePath: chromePath,
175
179
  extraHttpHeaders,
@@ -179,6 +183,7 @@ function maybeLaunchBrowser(chromePath, launchArgs, userDataDir, headless, crede
179
183
  userDataDir,
180
184
  downloadPath: createDownloadDirectory(),
181
185
  credentials,
186
+ userAgent,
182
187
  });
183
188
  }
184
189
  async function prepareChromePreferencesDirectory(browserPreferences) {
@@ -203,7 +208,7 @@ function removeTempBrowserPreferencesDirectory(tempDirPath) {
203
208
  }
204
209
  }
205
210
  async function createBrowser(browserWidth, browserHeight, headless, containerTesting, tempBrowserPreferencesDirectory, options) {
206
- const { credentials, browserPath, disableIsolation, extraHttpHeaders, ignoreCertificateErrors, emulationConfig, enableExtensions, runnerType, loggerFunc, resourcesDirectoryOverride, } = options || {};
211
+ const { bypassContentSecurityPolicy, credentials, browserPath, disableIsolation, extraHttpHeaders, ignoreCertificateErrors, emulationConfig, enableExtensions, runnerType, loggerFunc, resourcesDirectoryOverride, userAgent, } = options || {};
207
212
  const chromePath = browserPath !== null && browserPath !== void 0 ? browserPath : findChrome();
208
213
  if (!chromePath.length) {
209
214
  messaging_1.mablEventEmitter.log(chalk.yellow('Could not find a local install of Chrome to use, please ensure you have it installed and try again'));
@@ -227,11 +232,13 @@ async function createBrowser(browserWidth, browserHeight, headless, containerTes
227
232
  ignoreDefaultArgs = ['--disable-extensions'];
228
233
  }
229
234
  const maybeBrowser = await launchBrowserInstance(chromePath, launchArgs, tempBrowserPreferencesDirectory, headless, credentials, {
235
+ bypassContentSecurityPolicy,
230
236
  defaultDeviceDescriptor,
231
237
  extraHttpHeaders,
232
238
  ignoreDefaultArgs,
233
239
  runnerType,
234
240
  loggerFunc,
241
+ userAgent: userAgent !== null && userAgent !== void 0 ? userAgent : emulationConfig === null || emulationConfig === void 0 ? void 0 : emulationConfig.device_config.user_agent,
235
242
  });
236
243
  if (!maybeBrowser) {
237
244
  throw new Error('Unable to start Chrome session');
@@ -244,9 +251,6 @@ function addLaunchArgs(launchArgs, browserWidth, browserHeight, fakeMicrophoneMe
244
251
  var _a, _b;
245
252
  const defaultDeviceDescriptor = (0, mobileEmulationUtil_1.getDeviceDescriptorForEmulation)(emulationConfig);
246
253
  launchArgs.push(`--window-size=${(_a = defaultDeviceDescriptor === null || defaultDeviceDescriptor === void 0 ? void 0 : defaultDeviceDescriptor.width) !== null && _a !== void 0 ? _a : browserWidth},${(_b = defaultDeviceDescriptor === null || defaultDeviceDescriptor === void 0 ? void 0 : defaultDeviceDescriptor.height) !== null && _b !== void 0 ? _b : browserHeight}`);
247
- if (emulationConfig === null || emulationConfig === void 0 ? void 0 : emulationConfig.device_config.user_agent) {
248
- launchArgs.push(`--user-agent=${emulationConfig === null || emulationConfig === void 0 ? void 0 : emulationConfig.device_config.user_agent}`);
249
- }
250
254
  launchArgs.push('--use-fake-ui-for-media-stream');
251
255
  launchArgs.push('--use-fake-device-for-media-stream');
252
256
  launchArgs.push(`--use-file-for-fake-audio-capture=${fakeMicrophoneMediaPath}`);
@@ -281,6 +285,7 @@ async function createBrowserForExecutionEngine(browserWidth, browserHeight, head
281
285
  defaultDeviceDescriptor,
282
286
  runnerType,
283
287
  loggerFunc,
288
+ userAgent: emulationConfig === null || emulationConfig === void 0 ? void 0 : emulationConfig.device_config.user_agent,
284
289
  });
285
290
  if (!maybeBrowser) {
286
291
  throw new Error('Unable to start Chrome session');
@@ -149,6 +149,10 @@ exports.builder = (yargs) => {
149
149
  .option(constants_1.CommandArgHttpHeaders, {
150
150
  describe: 'Space delimited HTTP headers added to browser requests (e.g. "x-header:foo")',
151
151
  type: 'array',
152
+ })
153
+ .option(constants_1.CommandArgUserAgent, {
154
+ describe: 'Emulates a custom user-agent (e.g. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4651.0 Safari/537.36")',
155
+ type: 'string',
152
156
  })
153
157
  .option(constants_1.CommandArgTestInteractionSpeed, {
154
158
  describe: 'Set the speed that mabl interacts with webpages. Overrides test run settings if specified.',
@@ -200,6 +204,7 @@ async function run(parsed) {
200
204
  testFile: parsed[constants_1.CommandArgTestFile],
201
205
  runId: parsed['run-id'],
202
206
  url: parsed.url,
207
+ userAgent: parsed[constants_1.CommandArgUserAgent],
203
208
  width: parsed.width,
204
209
  workspaceId,
205
210
  };