@mablhq/mabl-cli 1.48.1 → 1.48.22
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/browserEngines.js +2 -0
- package/browserEngines/chromiumBrowserEngine.js +4 -1
- package/browserEngines/firefoxBrowserEngine.js +20 -4
- package/browserEngines/unsupportedBrowserEngine.js +3 -0
- package/browserEngines/webkitBrowerEngine.js +50 -0
- package/browserLauncher/elementHandle.js +10 -1
- package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumElementHandleDelegate.js +63 -0
- package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumPageDelegate.js +25 -10
- package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxBrowserDelegate.js +5 -12
- package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxElementHandleDelegate.js +5 -55
- package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxFrameDelegate.js +2 -5
- package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxPageDelegate.js +2 -70
- package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractBrowserDelegate.js +15 -0
- package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractElementHandleDelegate.js +65 -0
- package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractFrameDelegate.js +10 -0
- package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractPageDelegate.js +75 -0
- package/browserLauncher/playwrightBrowserLauncher/playwrightBrowser.js +3 -0
- package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +2 -0
- package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +35 -52
- package/browserLauncher/playwrightBrowserLauncher/webkit/webkitBrowserDelegate.js +47 -0
- package/browserLauncher/playwrightBrowserLauncher/webkit/webkitElementHandleDelegate.js +16 -0
- package/browserLauncher/playwrightBrowserLauncher/webkit/webkitFrameDelegate.js +10 -0
- package/browserLauncher/playwrightBrowserLauncher/webkit/webkitPageDelegate.js +15 -0
- package/commands/browserTypes.js +5 -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 +20 -2
- package/commands/tests/tests_cmds/run.js +1 -15
- package/execution/index.js +1 -1
- package/http/requestInterceptor.js +6 -2
- 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/observers/mockObserver.js +3 -0
- package/package.json +4 -3
- 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 +6 -7
- package/util/clickUtil.js +24 -14
- package/util/csvUtil.js +6 -1
package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractPageDelegate.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.NonChromiumAbstractPageDelegate = void 0;
|
|
27
|
+
const playwright = __importStar(require("@playwright/test"));
|
|
28
|
+
const logUtils_1 = require("../../../util/logUtils");
|
|
29
|
+
class NonChromiumAbstractPageDelegate {
|
|
30
|
+
constructor(page) {
|
|
31
|
+
this.page = page;
|
|
32
|
+
this.pageImpl = playwright._toImpl(page);
|
|
33
|
+
}
|
|
34
|
+
setFocusEmulationEnabled(_enabled) {
|
|
35
|
+
return Promise.resolve();
|
|
36
|
+
}
|
|
37
|
+
waitForInitialization() {
|
|
38
|
+
return Promise.resolve();
|
|
39
|
+
}
|
|
40
|
+
getBrowserBounds() {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
setBrowserBounds(_width, _height) {
|
|
44
|
+
return Promise.resolve();
|
|
45
|
+
}
|
|
46
|
+
getTargetId() {
|
|
47
|
+
return this.page.mainFrame()._id;
|
|
48
|
+
}
|
|
49
|
+
createCDPSession() {
|
|
50
|
+
var _a;
|
|
51
|
+
return Promise.resolve((_a = this.pageImpl._delegate) === null || _a === void 0 ? void 0 : _a._session);
|
|
52
|
+
}
|
|
53
|
+
makeCDPCall(method, paramArgs) {
|
|
54
|
+
return this.getCDPSession().send(method, paramArgs);
|
|
55
|
+
}
|
|
56
|
+
getCDPSession() {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
this.checkCDPSession();
|
|
59
|
+
return (_b = (_a = this.pageImpl) === null || _a === void 0 ? void 0 : _a._delegate) === null || _b === void 0 ? void 0 : _b._session;
|
|
60
|
+
}
|
|
61
|
+
checkCDPSession() {
|
|
62
|
+
var _a, _b, _c, _d;
|
|
63
|
+
if (((_b = (_a = this.pageImpl) === null || _a === void 0 ? void 0 : _a._delegate) === null || _b === void 0 ? void 0 : _b._session) === undefined) {
|
|
64
|
+
const undefinedField = ((_d = (_c = this.pageImpl) === null || _c === void 0 ? void 0 : _c._delegate) === null || _d === void 0 ? void 0 : _d._session) !== undefined
|
|
65
|
+
? '_session'
|
|
66
|
+
: '_delegate';
|
|
67
|
+
(0, logUtils_1.logInternal)(`Unable to get the CDP Session of the page (${undefinedField} is undefined).
|
|
68
|
+
Creating a fallback session. Some functionality might not work as expected.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
enableScreencastMode() {
|
|
72
|
+
return Promise.resolve();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.NonChromiumAbstractPageDelegate = NonChromiumAbstractPageDelegate;
|
|
@@ -36,6 +36,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
36
36
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
37
37
|
const firefoxBrowserDelegate_1 = require("./firefox/firefoxBrowserDelegate");
|
|
38
38
|
const chromiumBrowserDelegate_1 = require("./chromium/chromiumBrowserDelegate");
|
|
39
|
+
const webkitBrowserDelegate_1 = require("./webkit/webkitBrowserDelegate");
|
|
39
40
|
class PlaywrightBrowser extends events_1.default {
|
|
40
41
|
constructor(defaultContext, downloadDirectory, browserWSEndpoint, browserDelegate, preferenceDirectory, disableFocusEmulation) {
|
|
41
42
|
super();
|
|
@@ -168,6 +169,8 @@ function getBrowserDelegate(browserType, browserContext) {
|
|
|
168
169
|
return new chromiumBrowserDelegate_1.ChromiumBrowserDelegate(browserContext);
|
|
169
170
|
case playwright.firefox:
|
|
170
171
|
return new firefoxBrowserDelegate_1.FirefoxBrowserDelegate(browserContext);
|
|
172
|
+
case playwright.webkit:
|
|
173
|
+
return new webkitBrowserDelegate_1.WebkitBrowserDelegate(browserContext);
|
|
171
174
|
default:
|
|
172
175
|
throw new Error(`Unsupported browser type: ${browserType}`);
|
|
173
176
|
}
|
|
@@ -66,6 +66,8 @@ function getPlaywrightBrowserType(browserType) {
|
|
|
66
66
|
return test_1.chromium;
|
|
67
67
|
case browserTypes_1.BrowserType.Firefox:
|
|
68
68
|
return test_1.firefox;
|
|
69
|
+
case browserTypes_1.BrowserType.Webkit:
|
|
70
|
+
return test_1.webkit;
|
|
69
71
|
default:
|
|
70
72
|
throw new Error(`Unsupported browser type: ${browserType}`);
|
|
71
73
|
}
|
|
@@ -1,11 +1,33 @@
|
|
|
1
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
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.PlaywrightElementHandle = exports.PlaywrightJsHandle = exports.NAVIGATION_ERROR_MESSAGE = void 0;
|
|
27
|
+
const playwright = __importStar(require("@playwright/test"));
|
|
4
28
|
const types_1 = require("../types");
|
|
5
29
|
const utils_1 = require("../utils");
|
|
6
30
|
const logUtils_1 = require("../../util/logUtils");
|
|
7
|
-
const elementHandle_1 = require("../elementHandle");
|
|
8
|
-
const testsUtil_1 = require("../../commands/tests/testsUtil");
|
|
9
31
|
const pureUtil_1 = require("../../util/pureUtil");
|
|
10
32
|
exports.NAVIGATION_ERROR_MESSAGE = 'waiting for scheduled navigations to finish';
|
|
11
33
|
class PlaywrightJsHandle {
|
|
@@ -34,6 +56,11 @@ class PlaywrightJsHandle {
|
|
|
34
56
|
jsonValue() {
|
|
35
57
|
return this.handle.jsonValue();
|
|
36
58
|
}
|
|
59
|
+
isContextDestroyed() {
|
|
60
|
+
var _a, _b, _c;
|
|
61
|
+
const elementImpl = playwright._toImpl(this.handle);
|
|
62
|
+
return (_c = (_b = (_a = elementImpl._context) === null || _a === void 0 ? void 0 : _a._destroyedPromise) === null || _b === void 0 ? void 0 : _b._isDone) !== null && _c !== void 0 ? _c : true;
|
|
63
|
+
}
|
|
37
64
|
static unwrapProperties(arg, addSecondaryWorldFlag = false) {
|
|
38
65
|
if (arg === undefined) {
|
|
39
66
|
return addSecondaryWorldFlag ? { secondaryWorldValue: undefined } : null;
|
|
@@ -114,6 +141,7 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
|
|
|
114
141
|
const trial = (_a = options === null || options === void 0 ? void 0 : options.trial) !== null && _a !== void 0 ? _a : false;
|
|
115
142
|
try {
|
|
116
143
|
await this.element.click({
|
|
144
|
+
button: options === null || options === void 0 ? void 0 : options.button,
|
|
117
145
|
clickCount: (_b = options === null || options === void 0 ? void 0 : options.clickCount) !== null && _b !== void 0 ? _b : 1,
|
|
118
146
|
force: (_c = options === null || options === void 0 ? void 0 : options.force) !== null && _c !== void 0 ? _c : !trial,
|
|
119
147
|
timeout: this.getActionTimeout(options),
|
|
@@ -201,60 +229,12 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
|
|
|
201
229
|
minimizeScrollIntoView: options === null || options === void 0 ? void 0 : options.minimizeScrollIntoView,
|
|
202
230
|
});
|
|
203
231
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (((_a = this.delegate.getElementImpl()) === null || _a === void 0 ? void 0 : _a._objectId) === undefined) {
|
|
207
|
-
(0, logUtils_1.logInternal)('ObjectId of an element handle was not found.');
|
|
208
|
-
}
|
|
209
|
-
return (_c = (_b = this.delegate.getElementImpl()) === null || _b === void 0 ? void 0 : _b._objectId) !== null && _c !== void 0 ? _c : '';
|
|
210
|
-
}
|
|
211
|
-
async highlight(highlightDurationMillis, highlightPhases) {
|
|
212
|
-
await this.enableDom();
|
|
213
|
-
await this.enableOverlay();
|
|
214
|
-
const nodeInfo = await this.makeCDPCall('DOM.describeNode', {
|
|
215
|
-
objectId: this.getRemoteObjectId(),
|
|
216
|
-
depth: -1,
|
|
217
|
-
pierce: true,
|
|
218
|
-
});
|
|
219
|
-
const highlightConfig = {
|
|
220
|
-
backendNodeId: nodeInfo.node.backendNodeId,
|
|
221
|
-
highlightConfig: {
|
|
222
|
-
borderColor: (0, elementHandle_1.getHighlightColor)(0),
|
|
223
|
-
contentColor: (0, elementHandle_1.getHighlightColor)(1),
|
|
224
|
-
colorFormat: 'rgb',
|
|
225
|
-
},
|
|
226
|
-
};
|
|
227
|
-
await this.fadeInOutHighlight(highlightConfig, highlightDurationMillis, highlightPhases);
|
|
228
|
-
await this.hideHighlight();
|
|
232
|
+
highlight(highlightDurationMillis, highlightPhases) {
|
|
233
|
+
return this.delegate.highlight(highlightDurationMillis, highlightPhases);
|
|
229
234
|
}
|
|
230
235
|
async getValue() {
|
|
231
236
|
return this.element.inputValue();
|
|
232
237
|
}
|
|
233
|
-
async fadeInOutHighlight(highlightConfig, highlightDurationMillis, highlightPhases) {
|
|
234
|
-
var _a;
|
|
235
|
-
if (highlightPhases <= 0) {
|
|
236
|
-
throw new Error('Highlight phases must be greater than 0');
|
|
237
|
-
}
|
|
238
|
-
const phaseIntervalMilliseconds = highlightDurationMillis / highlightPhases;
|
|
239
|
-
for (let iteration = 0; iteration < highlightPhases; iteration++) {
|
|
240
|
-
if (((_a = highlightConfig.highlightConfig.contentColor) === null || _a === void 0 ? void 0 : _a.a) !== undefined) {
|
|
241
|
-
const x = iteration / highlightPhases;
|
|
242
|
-
highlightConfig.highlightConfig.contentColor.a =
|
|
243
|
-
x * (1 - x) * 4 * elementHandle_1.MAX_HIGHLIGHT_OPACITY;
|
|
244
|
-
}
|
|
245
|
-
await this.makeCDPCall('Overlay.highlightNode', highlightConfig);
|
|
246
|
-
await (0, testsUtil_1.sleep)(phaseIntervalMilliseconds);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
async enableDom() {
|
|
250
|
-
await this.makeCDPCall('DOM.enable');
|
|
251
|
-
}
|
|
252
|
-
async enableOverlay() {
|
|
253
|
-
await this.makeCDPCall('Overlay.enable');
|
|
254
|
-
}
|
|
255
|
-
async hideHighlight() {
|
|
256
|
-
await this.makeCDPCall('Overlay.hideHighlight');
|
|
257
|
-
}
|
|
258
238
|
async makeCDPCall(method, paramArgs) {
|
|
259
239
|
var _a;
|
|
260
240
|
return ((_a = this.cdpSession) !== null && _a !== void 0 ? _a : this.page.getCDPSession()).send(method, paramArgs);
|
|
@@ -291,6 +271,9 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
|
|
|
291
271
|
async isInShadowRoot() {
|
|
292
272
|
return this.element.evaluate((el) => el.getRootNode().nodeName === '#document-fragment');
|
|
293
273
|
}
|
|
274
|
+
focusAndSelect() {
|
|
275
|
+
return this.delegate.focusAndSelect(this);
|
|
276
|
+
}
|
|
294
277
|
getActionTimeout(options) {
|
|
295
278
|
var _a;
|
|
296
279
|
const defaultTimeout = (options === null || options === void 0 ? void 0 : options.trial)
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.WebkitBrowserDelegate = void 0;
|
|
27
|
+
const playwright = __importStar(require("@playwright/test"));
|
|
28
|
+
const webkitPageDelegate_1 = require("./webkitPageDelegate");
|
|
29
|
+
const nonChromiumAbstractBrowserDelegate_1 = require("../nonChromium/nonChromiumAbstractBrowserDelegate");
|
|
30
|
+
class WebkitBrowserDelegate extends nonChromiumAbstractBrowserDelegate_1.NonChromiumAbstractBrowserDelegate {
|
|
31
|
+
constructor(context) {
|
|
32
|
+
super();
|
|
33
|
+
this.context = context;
|
|
34
|
+
const contextImpl = playwright._toImpl(context);
|
|
35
|
+
this._browser = contextImpl._browser;
|
|
36
|
+
}
|
|
37
|
+
getBrowser() {
|
|
38
|
+
return this._browser;
|
|
39
|
+
}
|
|
40
|
+
createPageDelegate(page) {
|
|
41
|
+
return new webkitPageDelegate_1.WebkitPageDelegate(page);
|
|
42
|
+
}
|
|
43
|
+
getCDPSession() {
|
|
44
|
+
return this._browser._connection.browserSession;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.WebkitBrowserDelegate = WebkitBrowserDelegate;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebkitElementHandleDelegate = void 0;
|
|
4
|
+
const nonChromiumAbstractElementHandleDelegate_1 = require("../nonChromium/nonChromiumAbstractElementHandleDelegate");
|
|
5
|
+
class WebkitElementHandleDelegate extends nonChromiumAbstractElementHandleDelegate_1.NonChromiumAbstractElementHandleDelegate {
|
|
6
|
+
async focusAndSelect(element) {
|
|
7
|
+
const frame = await element.frame();
|
|
8
|
+
return frame.evaluate((element) => {
|
|
9
|
+
var _a;
|
|
10
|
+
element.focus();
|
|
11
|
+
(_a = element.select) === null || _a === void 0 ? void 0 : _a.call(element);
|
|
12
|
+
return element.value;
|
|
13
|
+
}, element);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.WebkitElementHandleDelegate = WebkitElementHandleDelegate;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebkitFrameDelegate = void 0;
|
|
4
|
+
const nonChromiumAbstractFrameDelegate_1 = require("../nonChromium/nonChromiumAbstractFrameDelegate");
|
|
5
|
+
class WebkitFrameDelegate extends nonChromiumAbstractFrameDelegate_1.NonChromiumAbstractFrameDelegate {
|
|
6
|
+
addBindingToSecondaryWorld(_binding) {
|
|
7
|
+
return Promise.resolve();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.WebkitFrameDelegate = WebkitFrameDelegate;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebkitPageDelegate = void 0;
|
|
4
|
+
const webkitElementHandleDelegate_1 = require("./webkitElementHandleDelegate");
|
|
5
|
+
const webkitFrameDelegate_1 = require("./webkitFrameDelegate");
|
|
6
|
+
const nonChromiumAbstractPageDelegate_1 = require("../nonChromium/nonChromiumAbstractPageDelegate");
|
|
7
|
+
class WebkitPageDelegate extends nonChromiumAbstractPageDelegate_1.NonChromiumAbstractPageDelegate {
|
|
8
|
+
createElementHandleDelegate(element) {
|
|
9
|
+
return new webkitElementHandleDelegate_1.WebkitElementHandleDelegate(element);
|
|
10
|
+
}
|
|
11
|
+
createFrameDelegate(frame) {
|
|
12
|
+
return new webkitFrameDelegate_1.WebkitFrameDelegate(this, frame);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.WebkitPageDelegate = WebkitPageDelegate;
|
package/commands/browserTypes.js
CHANGED
|
@@ -8,6 +8,7 @@ var BrowserType;
|
|
|
8
8
|
BrowserType["Firefox"] = "firefox";
|
|
9
9
|
BrowserType["InternetExplorer"] = "internet_explorer";
|
|
10
10
|
BrowserType["Safari"] = "safari";
|
|
11
|
+
BrowserType["Webkit"] = "webkit";
|
|
11
12
|
})(BrowserType = exports.BrowserType || (exports.BrowserType = {}));
|
|
12
13
|
exports.SupportedBrowserTypeProperties = {
|
|
13
14
|
chrome: { browserName: 'chrome', browserReleaseChannel: 'chrome' },
|
|
@@ -17,5 +18,9 @@ exports.SupportedBrowserTypeProperties = {
|
|
|
17
18
|
browserName: 'safari',
|
|
18
19
|
browserReleaseChannel: 'webkit',
|
|
19
20
|
},
|
|
21
|
+
webkit: {
|
|
22
|
+
browserName: 'webkit',
|
|
23
|
+
browserReleaseChannel: 'webkit',
|
|
24
|
+
},
|
|
20
25
|
};
|
|
21
26
|
exports.DefaultBrowserProperties = exports.SupportedBrowserTypeProperties.chrome;
|
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.ValidBrowserTypesForLocalRuns = 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 = exports.CommandArgUrlApi = exports.CommandArgUrlApp = void 0;
|
|
3
|
+
exports.CommandArgTrainerVersion = exports.CommandArgTo = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgMaxHeartbeatAge = 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.CommandArgInput = 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.CommandArgBrowser = exports.CommandArgApplicationId = exports.CommandArgApiKey = void 0;
|
|
4
|
+
exports.SCENARIO_NAME_HEADER = exports.ValidBrowserTypesForLocalRuns = 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 = exports.CommandArgUrlApi = exports.CommandArgUrlApp = exports.CommandArgUrl = void 0;
|
|
5
5
|
const browserTypes_1 = require("./browserTypes");
|
|
6
6
|
exports.CommandArgApiKey = 'api-key';
|
|
7
7
|
exports.CommandArgApplicationId = 'application-id';
|
|
@@ -25,6 +25,7 @@ exports.CommandArgHelp = 'help';
|
|
|
25
25
|
exports.CommandArgHttpHeaders = 'http-headers';
|
|
26
26
|
exports.CommandArgUserAgent = 'user-agent';
|
|
27
27
|
exports.CommandArgId = 'id';
|
|
28
|
+
exports.CommandArgInput = 'input';
|
|
28
29
|
exports.CommandArgTestFile = 'test-file';
|
|
29
30
|
exports.CommandArgTestRunId = 'run-id';
|
|
30
31
|
exports.CommandArgTestInteractionSpeed = 'interaction-speed';
|
|
@@ -120,4 +121,6 @@ exports.ValidBrowserTypesForLocalRuns = [
|
|
|
120
121
|
browserTypes_1.BrowserType.Chrome,
|
|
121
122
|
browserTypes_1.BrowserType.Edge,
|
|
122
123
|
browserTypes_1.BrowserType.Firefox,
|
|
124
|
+
browserTypes_1.BrowserType.Webkit,
|
|
123
125
|
];
|
|
126
|
+
exports.SCENARIO_NAME_HEADER = 'Scenario name';
|
|
@@ -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');
|
|
@@ -125,11 +126,13 @@ async function createBrowser(engine, options) {
|
|
|
125
126
|
}
|
|
126
127
|
exports.createBrowser = createBrowser;
|
|
127
128
|
async function createBrowserForExecutionEngine(engine, proxyInfo, options) {
|
|
128
|
-
const userDataDir = await engine.prepareBrowserPreferencesDirectory();
|
|
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],
|