@mablhq/mabl-cli 1.17.0 → 1.17.6

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 (32) hide show
  1. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +11 -9
  2. package/browserLauncher/puppeteerBrowserLauncher/puppeteerBrowser.js +2 -1
  3. package/browserLauncher/puppeteerBrowserLauncher/puppeteerBrowserLauncher.js +1 -1
  4. package/browserLauncher/puppeteerBrowserLauncher/puppeteerPage.js +3 -0
  5. package/commands/constants.js +3 -2
  6. package/commands/tests/testsUtil.js +11 -6
  7. package/commands/tests/tests_cmds/run.js +5 -0
  8. package/domUtil/index.js +1 -1
  9. package/domUtil/index.js.LICENSE.txt +5 -5
  10. package/execution/index.js +1 -1
  11. package/execution/index.js.LICENSE.txt +5 -5
  12. package/mablscript/actions/FindAction.js +40 -39
  13. package/mablscript/steps/AccessibilityCheck.js +5 -5
  14. package/mablscript/steps/AssertStep.js +12 -12
  15. package/mablscript/steps/AssertStepOld.js +8 -8
  16. package/mablscript/steps/ClickAndHoldStep.js +5 -5
  17. package/mablscript/steps/ClickStep.js +5 -5
  18. package/mablscript/steps/CreateVariableStep.js +2 -2
  19. package/mablscript/steps/DoubleClickStep.js +6 -6
  20. package/mablscript/steps/EnterTextStep.js +7 -7
  21. package/mablscript/steps/HoverStep.js +5 -5
  22. package/mablscript/steps/IfConditionStep.js +6 -6
  23. package/mablscript/steps/ReleaseStep.js +5 -5
  24. package/mablscript/steps/SelectStep.js +5 -5
  25. package/mablscript/steps/SendKeyStep.js +6 -6
  26. package/mablscript/steps/SetFilesStep.js +5 -5
  27. package/mablscript/steps/SwitchContextStep.js +3 -3
  28. package/mablscript/steps/WaitUntilStep.js +3 -3
  29. package/mablscriptFind/index.js +1 -1
  30. package/mablscriptFind/index.js.LICENSE.txt +5 -5
  31. package/package.json +1 -1
  32. package/resources/mablFind.js +1 -1
@@ -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
  }
@@ -11,12 +11,13 @@ const puppeteerBrowserLauncher_1 = require("./puppeteerBrowserLauncher");
11
11
  const puppeteerPage_1 = require("./puppeteerPage");
12
12
  const runnerType_1 = require("../runnerType");
13
13
  class PuppeteerBrowser extends events_1.default {
14
- constructor(browser, downloadDirectory, credentials) {
14
+ constructor(browser, downloadDirectory, credentials, userAgent) {
15
15
  var _a;
16
16
  super();
17
17
  this.browser = browser;
18
18
  this.downloadDirectory = downloadDirectory;
19
19
  this.credentials = credentials;
20
+ this.userAgent = userAgent;
20
21
  this.puppeteerPages = new Map();
21
22
  (_a = this.browser
22
23
  .process()) === null || _a === void 0 ? void 0 : _a.on('close', () => this.emit(browserLauncher_1.BrowserEvent.BrowserDestroyed));
@@ -18,7 +18,7 @@ class PuppeteerBrowserLauncher {
18
18
  const browser = new puppeteerBrowser_1.PuppeteerBrowser(await puppeteer_core_1.default.launch({
19
19
  ignoreHTTPSErrors: true,
20
20
  ...options,
21
- }), options.downloadPath, options.credentials);
21
+ }), options.downloadPath, options.credentials, options.userAgent);
22
22
  if (options.downloadPath) {
23
23
  await browser.setDownloadBehavior(options.downloadPath);
24
24
  }
@@ -59,6 +59,9 @@ class PuppeteerPage extends events_1.default {
59
59
  if (this.browser.credentials !== undefined) {
60
60
  await this.page.authenticate(this.browser.credentials);
61
61
  }
62
+ if (this.browser.userAgent) {
63
+ await this.page.setUserAgent(this.browser.userAgent);
64
+ }
62
65
  const opener = await ((_a = this.page.target().opener()) === null || _a === void 0 ? void 0 : _a.page());
63
66
  this.openerPage = await (0, utils_1.mapIfNotNull)(opener, (page) => this.browser.getOrCreatePage(page));
64
67
  }
@@ -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
  };