@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.
- package/api/basicApiClient.js +7 -1
- package/api/featureSet.js +1 -4
- package/api/mablApiClient.js +3 -3
- package/browserLauncher/browserLauncherFactory.js +2 -3
- package/browserLauncher/playwrightBrowserLauncher/playwrightBrowser.js +3 -0
- package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +11 -9
- package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +1 -11
- package/browserLauncher/playwrightBrowserLauncher/playwrightFrame.js +18 -0
- package/browserLauncher/runnerType.js +0 -1
- package/commands/constants.js +3 -2
- package/commands/tests/testsUtil.js +11 -6
- package/commands/tests/tests_cmds/run.js +5 -0
- package/domUtil/index.js +1 -1
- package/domUtil/index.js.LICENSE.txt +5 -5
- package/execution/index.js +1 -1
- package/execution/index.js.LICENSE.txt +7 -5
- package/index.d.ts +0 -1
- package/mablscript/MablAction.js +1 -1
- package/mablscript/MablStep.js +21 -3
- package/mablscript/actions/AwaitPDFDownloadAction.js +2 -1
- package/mablscript/actions/ConditionAction.js +11 -3
- package/mablscript/actions/ExtractAction.js +16 -7
- package/mablscript/actions/FindAction.js +101 -69
- package/mablscript/actions/GenerateRandomStringAction.js +2 -1
- package/mablscript/actions/GetUrlAction.js +1 -1
- package/mablscript/actions/GetVariableValue.js +2 -2
- package/mablscript/diffing/diffingUtil.js +146 -0
- package/mablscript/importer.js +20 -2
- package/mablscript/steps/AccessibilityCheck.js +5 -5
- package/mablscript/steps/AssertStep.js +45 -31
- package/mablscript/steps/AssertStepOld.js +39 -21
- package/mablscript/steps/AwaitTabStep.js +7 -6
- package/mablscript/steps/ClickAndHoldStep.js +6 -6
- package/mablscript/steps/ClickStep.js +5 -5
- package/mablscript/steps/CreateVariableStep.js +2 -2
- package/mablscript/steps/DoubleClickStep.js +6 -6
- package/mablscript/steps/DownloadStep.js +3 -2
- package/mablscript/steps/EchoStep.js +3 -1
- package/mablscript/steps/ElseIfConditionStep.js +5 -2
- package/mablscript/steps/EnterTextStep.js +11 -8
- package/mablscript/steps/EvaluateFlowStep.js +40 -0
- package/mablscript/steps/HoverStep.js +5 -5
- package/mablscript/steps/IfConditionStep.js +6 -6
- package/mablscript/steps/ReleaseStep.js +7 -6
- package/mablscript/steps/RemoveCookieStep.js +2 -3
- package/mablscript/steps/SelectStep.js +5 -5
- package/mablscript/steps/SendHttpRequestStep.js +3 -3
- package/mablscript/steps/SendKeyStep.js +8 -8
- package/mablscript/steps/SetCookieStep.js +2 -4
- package/mablscript/steps/SetFilesStep.js +5 -5
- package/mablscript/steps/SetViewportStep.js +1 -1
- package/mablscript/steps/SwitchContextStep.js +3 -3
- package/mablscript/steps/VisitUrlStep.js +2 -1
- package/mablscript/steps/WaitStep.js +1 -4
- package/mablscript/steps/WaitUntilStep.js +3 -3
- package/{browserLauncher/puppeteerBrowserLauncher/internals.js → mablscript/types/EvaluateFlowStepDescriptor.js} +0 -0
- package/mablscript/types/GetCurrentLocationDescriptor.js +4 -3
- package/mablscriptFind/index.js +1 -1
- package/mablscriptFind/index.js.LICENSE.txt +5 -5
- package/package.json +3 -3
- package/resources/mablFind.js +1 -1
- package/resources/pdf-viewer/index.js +1 -1
- package/resources/pdf-viewer/libEmbeddedPdfHandler.js +11 -2
- package/util/actionabilityUtil.js +1 -24
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerBrowser.js +0 -134
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerBrowserLauncher.js +0 -45
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerElementHandle.js +0 -139
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerFrame.js +0 -115
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerHttpRequest.js +0 -38
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerHttpResponse.js +0 -27
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerJsHandle.js +0 -36
- package/browserLauncher/puppeteerBrowserLauncher/puppeteerPage.js +0 -332
- package/browserLauncher/puppeteerBrowserLauncher/wrappers.js +0 -25
package/api/basicApiClient.js
CHANGED
|
@@ -130,7 +130,13 @@ class BasicApiClient {
|
|
|
130
130
|
return { ...result, entity_version: versionHeader };
|
|
131
131
|
}
|
|
132
132
|
async makePostRequest(path, requestBody, requestConfig) {
|
|
133
|
-
|
|
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
|
|
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)
|
package/api/mablApiClient.js
CHANGED
|
@@ -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
|
|
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.
|
|
457
|
+
return await this.makePostRequestWithRetries(`${env_1.BASE_API_URL}/mailbox/address`, body);
|
|
458
458
|
}
|
|
459
459
|
catch (error) {
|
|
460
|
-
throw
|
|
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.
|
|
28
|
-
|
|
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
|
-
|
|
27
|
-
headless: options.headless,
|
|
26
|
+
acceptDownloads: true,
|
|
28
27
|
args: options.args,
|
|
29
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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;
|
package/commands/constants.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
};
|