@mablhq/mabl-cli 1.48.7 → 1.48.26
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/mablApiClient.js +11 -0
- package/browserEngines/chromiumBrowserEngine.js +3 -0
- package/browserEngines/firefoxBrowserEngine.js +8 -2
- package/browserEngines/unsupportedBrowserEngine.js +3 -0
- package/browserEngines/webkitBrowerEngine.js +11 -0
- package/browserLauncher/elementHandle.js +10 -1
- package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumElementHandleDelegate.js +63 -0
- package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumPageDelegate.js +29 -10
- package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxBrowserDelegate.js +36 -0
- package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxElementHandleDelegate.js +4 -0
- package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractBrowserDelegate.js +0 -35
- package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractElementHandleDelegate.js +4 -0
- package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +35 -52
- package/browserLauncher/playwrightBrowserLauncher/webkit/webkitBrowserDelegate.js +36 -0
- package/browserLauncher/playwrightBrowserLauncher/webkit/webkitElementHandleDelegate.js +9 -0
- package/commands/constants.js +5 -2
- package/commands/datatables/datatables_cmds/create.js +148 -0
- package/commands/datatables/datatables_cmds/export.js +1 -2
- package/commands/tests/testsUtil.js +19 -1
- package/commands/tests/tests_cmds/run.js +1 -15
- package/execution/index.js +1 -1
- package/index.d.ts +9 -0
- package/mablApi/index.js +1 -1
- package/mablscript/importer.js +2 -0
- package/mablscript/steps/DoubleClickStep.js +1 -1
- package/mablscript/steps/RightClickStep.js +57 -0
- package/mablscriptFind/index.js +1 -1
- package/package.json +2 -1
- package/popupDismissal/index.js +7 -2
- package/resources/mablFind.js +1 -1
- package/resources/popupDismissal.js +1 -1
- package/util/asyncUtil.js +1 -1
- package/util/browserTestUtils.js +2 -2
- package/util/clickUtil.js +24 -14
- package/util/csvUtil.js +6 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.parseCsvRows = exports.parseJsonRows = void 0;
|
|
30
|
+
const path_1 = require("path");
|
|
31
|
+
const mablApiClientFactory_1 = require("../../../api/mablApiClientFactory");
|
|
32
|
+
const util_1 = require("../../commandUtil/util");
|
|
33
|
+
const constants_1 = require("../../constants");
|
|
34
|
+
const fs = __importStar(require("fs"));
|
|
35
|
+
const csv_parser_1 = __importDefault(require("csv-parser"));
|
|
36
|
+
const describe_1 = require("../../commandUtil/describe");
|
|
37
|
+
const csvUtil_1 = require("../../../util/csvUtil");
|
|
38
|
+
exports.command = `create <${constants_1.CommandArgInput}>`;
|
|
39
|
+
exports.describe = 'Create a new mabl DataTable';
|
|
40
|
+
exports.builder = (yargs) => {
|
|
41
|
+
yargs
|
|
42
|
+
.positional(constants_1.CommandArgInput, {
|
|
43
|
+
alias: 'file',
|
|
44
|
+
describe: 'Relative path file to create DataTable from',
|
|
45
|
+
})
|
|
46
|
+
.option(constants_1.CommandArgWorkspaceId, {
|
|
47
|
+
alias: constants_1.CommandArgAliases.WorkspaceId,
|
|
48
|
+
describe: `Workspace to create DataTable in`,
|
|
49
|
+
type: 'string',
|
|
50
|
+
})
|
|
51
|
+
.option(constants_1.CommandArgName, {
|
|
52
|
+
alias: 'table-name',
|
|
53
|
+
describe: `The name for your new DataTable`,
|
|
54
|
+
type: 'string',
|
|
55
|
+
})
|
|
56
|
+
.option(constants_1.CommandArgFormat, {
|
|
57
|
+
alias: 'fmt',
|
|
58
|
+
describe: `Specify the format of your input file`,
|
|
59
|
+
choices: [constants_1.OutputFormats.Json, constants_1.OutputFormats.Csv, undefined],
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
exports.handler = (0, util_1.failWrapper)(createDataTable);
|
|
63
|
+
var AllowedExtensions;
|
|
64
|
+
(function (AllowedExtensions) {
|
|
65
|
+
AllowedExtensions["Csv"] = ".csv";
|
|
66
|
+
AllowedExtensions["Json"] = ".json";
|
|
67
|
+
})(AllowedExtensions || (AllowedExtensions = {}));
|
|
68
|
+
async function createDataTable(parsed) {
|
|
69
|
+
const input = parsed.input;
|
|
70
|
+
const format = parsed.format || tryInferFormat(input);
|
|
71
|
+
const name = parsed.name || (0, path_1.basename)((0, path_1.resolve)(input));
|
|
72
|
+
const workspaceId = await (0, util_1.getWorkspaceId)(parsed);
|
|
73
|
+
let rows = [];
|
|
74
|
+
switch (format) {
|
|
75
|
+
case constants_1.OutputFormats.Json:
|
|
76
|
+
const jsonInput = fs.readFileSync(input, 'utf-8');
|
|
77
|
+
rows = parseJsonRows(jsonInput);
|
|
78
|
+
break;
|
|
79
|
+
case constants_1.OutputFormats.Csv:
|
|
80
|
+
const csvInput = [];
|
|
81
|
+
await new Promise((resolve) => {
|
|
82
|
+
fs.createReadStream(input)
|
|
83
|
+
.pipe((0, csv_parser_1.default)())
|
|
84
|
+
.on('data', (data) => csvInput.push(data))
|
|
85
|
+
.on('end', () => resolve());
|
|
86
|
+
});
|
|
87
|
+
rows = parseCsvRows(csvInput);
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
throw Error(`${format} is not a valid option.`);
|
|
91
|
+
}
|
|
92
|
+
const options = {
|
|
93
|
+
prototype: {
|
|
94
|
+
name,
|
|
95
|
+
organization_id: workspaceId,
|
|
96
|
+
},
|
|
97
|
+
mappings: rows.map((datatableRow) => ({
|
|
98
|
+
scenario_id: datatableRow.scenario,
|
|
99
|
+
row: datatableRow.columns.map((column) => ({
|
|
100
|
+
name: column.name,
|
|
101
|
+
value: column.value,
|
|
102
|
+
})),
|
|
103
|
+
})),
|
|
104
|
+
};
|
|
105
|
+
const apiClient = await mablApiClientFactory_1.MablApiClientFactory.createApiClient();
|
|
106
|
+
const datatableRows = await apiClient.createDatatable(workspaceId, options);
|
|
107
|
+
(0, describe_1.outputEntity)(datatableRows, constants_1.OutputFormats.Json);
|
|
108
|
+
}
|
|
109
|
+
function tryInferFormat(input) {
|
|
110
|
+
const extension = (0, path_1.extname)(input);
|
|
111
|
+
switch (extension) {
|
|
112
|
+
case AllowedExtensions.Csv:
|
|
113
|
+
return constants_1.OutputFormats.Csv;
|
|
114
|
+
case AllowedExtensions.Json:
|
|
115
|
+
return constants_1.OutputFormats.Json;
|
|
116
|
+
default:
|
|
117
|
+
throw new Error('No format could be inferred, please specify a format for your input data.');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function parseJsonRows(input) {
|
|
121
|
+
const parsedJson = JSON.parse(input);
|
|
122
|
+
if (isDataTableRowArray(parsedJson)) {
|
|
123
|
+
return parsedJson;
|
|
124
|
+
}
|
|
125
|
+
throw Error('Json input was not formatted correctly');
|
|
126
|
+
}
|
|
127
|
+
exports.parseJsonRows = parseJsonRows;
|
|
128
|
+
function isDataTableRowArray(arg) {
|
|
129
|
+
return (Array.isArray(arg) &&
|
|
130
|
+
arg.every((row) => typeof row.scenario === 'string' &&
|
|
131
|
+
Array.isArray(row.columns) &&
|
|
132
|
+
row.columns.every((col) => typeof col.name === 'string' && typeof col.value === 'string')));
|
|
133
|
+
}
|
|
134
|
+
function parseCsvRows(input) {
|
|
135
|
+
if (input.length === 0) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
return input.map((rows) => ({
|
|
139
|
+
scenario: (0, csvUtil_1.desanitizeCellOutput)(rows[constants_1.SCENARIO_NAME_HEADER]),
|
|
140
|
+
columns: Object.entries(rows)
|
|
141
|
+
.filter(([key, _]) => key !== constants_1.SCENARIO_NAME_HEADER)
|
|
142
|
+
.map(([key, value]) => ({
|
|
143
|
+
name: (0, csvUtil_1.desanitizeCellOutput)(key),
|
|
144
|
+
value: (0, csvUtil_1.desanitizeCellOutput)(value),
|
|
145
|
+
})),
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
exports.parseCsvRows = parseCsvRows;
|
|
@@ -8,7 +8,6 @@ const fileUtil_1 = require("../../commandUtil/fileUtil");
|
|
|
8
8
|
const js_yaml_1 = require("js-yaml");
|
|
9
9
|
const csvUtil_1 = require("../../../util/csvUtil");
|
|
10
10
|
const sync_1 = require("csv-stringify/sync");
|
|
11
|
-
const SCENARIO_NAME_HEADER = 'Scenario name';
|
|
12
11
|
exports.command = `export <${constants_1.CommandArgId}>`;
|
|
13
12
|
exports.describe = 'Export a mabl test in a specified file format';
|
|
14
13
|
exports.builder = (yargs) => {
|
|
@@ -62,7 +61,7 @@ function dumpToCsv(datatableRows) {
|
|
|
62
61
|
return '';
|
|
63
62
|
}
|
|
64
63
|
const headers = [
|
|
65
|
-
SCENARIO_NAME_HEADER,
|
|
64
|
+
constants_1.SCENARIO_NAME_HEADER,
|
|
66
65
|
...(datatableRows[0].row || []).map((variable) => (0, csvUtil_1.sanitizeCellInput)(variable.name || '')),
|
|
67
66
|
];
|
|
68
67
|
output.push(headers);
|
|
@@ -26,7 +26,7 @@ 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.toBasicHttpAuthenticationCredentials = exports.logTestInfoIfPresent = exports.milliSecondsToSeconds = exports.calculateTotalTimeSeconds = exports.extractTestRunConfig = exports.pullDownTestRunConfig = exports.validateRunCommandWithLabels = exports.validateRunEditCommand = exports.cleanupTestResources = exports.sleep = exports.editTheTest = exports.runTheTest = exports.prepareTrainerForSplitPlayback = exports.cleanUpInitialPages = exports.getExtensionBackgroundPageWithCliTool = exports.createBrowserForExecutionEngine = exports.createBrowser = exports.getFinalUrl = void 0;
|
|
29
|
+
exports.parseBrowserType = exports.toBasicHttpAuthenticationCredentials = exports.logTestInfoIfPresent = exports.milliSecondsToSeconds = exports.calculateTotalTimeSeconds = exports.extractTestRunConfig = exports.pullDownTestRunConfig = exports.validateRunCommandWithLabels = exports.validateRunEditCommand = exports.cleanupTestResources = exports.sleep = exports.editTheTest = exports.runTheTest = exports.prepareTrainerForSplitPlayback = exports.cleanUpInitialPages = exports.getExtensionBackgroundPageWithCliTool = exports.createBrowserForExecutionEngine = exports.createBrowser = exports.getFinalUrl = void 0;
|
|
30
30
|
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
31
31
|
const fs = __importStar(require("fs-extra"));
|
|
32
32
|
const os = __importStar(require("os"));
|
|
@@ -39,6 +39,7 @@ const cliConfigProvider_1 = require("../../providers/cliConfigProvider");
|
|
|
39
39
|
const loggingProvider_1 = require("../../providers/logging/loggingProvider");
|
|
40
40
|
const fileUploadUtil_1 = require("../../util/fileUploadUtil");
|
|
41
41
|
const logUtils_1 = require("../../util/logUtils");
|
|
42
|
+
const browserTypes_1 = require("../browserTypes");
|
|
42
43
|
const constants_1 = require("../constants");
|
|
43
44
|
const trainerUtil_1 = require("./tests_cmds/trainerUtil");
|
|
44
45
|
const chalk = require('chalk');
|
|
@@ -127,9 +128,11 @@ exports.createBrowser = createBrowser;
|
|
|
127
128
|
async function createBrowserForExecutionEngine(engine, proxyInfo, options) {
|
|
128
129
|
const userDataDir = await engine.prepareBrowserPreferencesDirectory(undefined, proxyInfo);
|
|
129
130
|
const launchOptions = engine.getExecutionEngineBrowserLaunchOptions(options, proxyInfo);
|
|
131
|
+
const proxy = engine.getProxySpec(proxyInfo);
|
|
130
132
|
const maybeBrowser = await maybeLaunchBrowser({
|
|
131
133
|
...options,
|
|
132
134
|
...launchOptions,
|
|
135
|
+
proxy,
|
|
133
136
|
downloadPath: createDownloadDirectory(),
|
|
134
137
|
userDataDir,
|
|
135
138
|
});
|
|
@@ -469,3 +472,18 @@ function toBasicHttpAuthenticationCredentials(credentials) {
|
|
|
469
472
|
};
|
|
470
473
|
}
|
|
471
474
|
exports.toBasicHttpAuthenticationCredentials = toBasicHttpAuthenticationCredentials;
|
|
475
|
+
function parseBrowserType(browserType) {
|
|
476
|
+
switch (browserType) {
|
|
477
|
+
case 'edge':
|
|
478
|
+
return browserTypes_1.BrowserType.Edge;
|
|
479
|
+
case 'firefox':
|
|
480
|
+
return browserTypes_1.BrowserType.Firefox;
|
|
481
|
+
case 'chrome':
|
|
482
|
+
return browserTypes_1.BrowserType.Chrome;
|
|
483
|
+
case 'webkit':
|
|
484
|
+
return browserTypes_1.BrowserType.Webkit;
|
|
485
|
+
default:
|
|
486
|
+
return constants_1.DefaultBrowserType;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
exports.parseBrowserType = parseBrowserType;
|
|
@@ -7,7 +7,6 @@ const constants_1 = require("../../constants");
|
|
|
7
7
|
const loggingProvider_1 = require("../../../providers/logging/loggingProvider");
|
|
8
8
|
const mablApi_1 = require("../../../mablApi");
|
|
9
9
|
const reporter_1 = require("../../../reporters/reporter");
|
|
10
|
-
const browserTypes_1 = require("../../browserTypes");
|
|
11
10
|
const execution_1 = require("../../../execution");
|
|
12
11
|
const defaultEnv_1 = require("../../../env/defaultEnv");
|
|
13
12
|
const chalk = require('chalk');
|
|
@@ -194,20 +193,7 @@ async function run(parsed) {
|
|
|
194
193
|
extraHttpHeaders[headerParts[0].toLowerCase()] = headerParts[1];
|
|
195
194
|
}
|
|
196
195
|
});
|
|
197
|
-
|
|
198
|
-
switch (parsed[constants_1.CommandArgBrowser]) {
|
|
199
|
-
case 'edge':
|
|
200
|
-
browserType = browserTypes_1.BrowserType.Edge;
|
|
201
|
-
break;
|
|
202
|
-
case 'firefox':
|
|
203
|
-
browserType = browserTypes_1.BrowserType.Firefox;
|
|
204
|
-
break;
|
|
205
|
-
case 'chrome':
|
|
206
|
-
browserType = browserTypes_1.BrowserType.Chrome;
|
|
207
|
-
break;
|
|
208
|
-
default:
|
|
209
|
-
browserType = constants_1.DefaultBrowserType;
|
|
210
|
-
}
|
|
196
|
+
const browserType = (0, testsUtil_1.parseBrowserType)(parsed[constants_1.CommandArgBrowser]);
|
|
211
197
|
const testRunnerConfig = {
|
|
212
198
|
_cliCreated: true,
|
|
213
199
|
basicAuthCredentialsId: parsed[constants_1.CommandArgBasicAuthCredentials],
|