@checkly/playwright-core 1.42.18 → 1.47.20-alpha
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/ThirdPartyNotices.txt +144 -109
- package/browsers.json +15 -25
- package/lib/androidServerImpl.js +1 -1
- package/lib/browserServerImpl.js +1 -1
- package/lib/cli/driver.js +1 -3
- package/lib/cli/program.js +5 -10
- package/lib/client/android.js +1 -1
- package/lib/client/api.js +7 -0
- package/lib/client/browserContext.js +37 -5
- package/lib/client/browserType.js +19 -11
- package/lib/client/channelOwner.js +19 -16
- package/lib/client/clientInstrumentation.js +17 -7
- package/lib/client/clock.js +68 -0
- package/lib/client/connection.js +9 -6
- package/lib/client/electron.js +7 -5
- package/lib/client/elementHandle.js +44 -14
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/fetch.js +81 -28
- package/lib/client/frame.js +2 -4
- package/lib/client/jsHandle.js +7 -1
- package/lib/client/locator.js +9 -0
- package/lib/client/network.js +12 -9
- package/lib/client/page.js +45 -23
- package/lib/client/playwright.js +3 -0
- package/lib/client/tracing.js +7 -4
- package/lib/common/socksProxy.js +2 -2
- package/lib/generated/clockSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/recorderSource.js +1 -1
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/protocol/serializers.js +12 -11
- package/lib/protocol/validator.js +137 -55
- package/lib/server/bidi/bidiBrowser.js +296 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +162 -0
- package/lib/server/bidi/bidiFirefox.js +110 -0
- package/lib/server/bidi/bidiInput.js +174 -0
- package/lib/server/bidi/bidiNetworkManager.js +304 -0
- package/lib/server/bidi/bidiPage.js +456 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
- package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
- package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
- package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
- package/lib/server/browser.js +9 -1
- package/lib/server/browserContext.js +97 -22
- package/lib/server/browserType.js +27 -20
- package/lib/server/chromium/chromium.js +30 -15
- package/lib/server/chromium/chromiumSwitches.js +6 -3
- package/lib/server/chromium/crBrowser.js +11 -17
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crDragDrop.js +28 -29
- package/lib/server/chromium/crNetworkManager.js +130 -84
- package/lib/server/chromium/crPage.js +34 -79
- package/lib/server/chromium/crProtocolHelper.js +3 -1
- package/lib/server/chromium/crServiceWorker.js +20 -23
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/clock.js +125 -0
- package/lib/server/codegen/csharp.js +299 -0
- package/lib/server/codegen/java.js +235 -0
- package/lib/server/codegen/javascript.js +223 -0
- package/lib/server/codegen/jsonl.js +47 -0
- package/lib/server/codegen/language.js +76 -0
- package/lib/server/codegen/languages.js +30 -0
- package/lib/server/codegen/python.js +265 -0
- package/lib/server/codegen/types.js +5 -0
- package/lib/server/debugController.js +3 -5
- package/lib/server/deviceDescriptors.js +9 -4
- package/lib/server/deviceDescriptorsSource.json +239 -119
- package/lib/server/dispatchers/androidDispatcher.js +1 -1
- package/lib/server/dispatchers/browserContextDispatcher.js +51 -7
- package/lib/server/dispatchers/dispatcher.js +36 -40
- package/lib/server/dispatchers/frameDispatcher.js +1 -2
- package/lib/server/dispatchers/jsHandleDispatcher.js +1 -1
- package/lib/server/dispatchers/jsonPipeDispatcher.js +4 -6
- package/lib/server/dispatchers/localUtilsDispatcher.js +19 -5
- package/lib/server/dispatchers/networkDispatchers.js +2 -2
- package/lib/server/dispatchers/pageDispatcher.js +5 -2
- package/lib/server/dispatchers/playwrightDispatcher.js +1 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +8 -5
- package/lib/server/dom.js +90 -53
- package/lib/server/electron/electron.js +21 -4
- package/lib/server/fetch.js +74 -25
- package/lib/server/fileUploadUtils.js +7 -3
- package/lib/server/firefox/ffBrowser.js +36 -25
- package/lib/server/firefox/ffConnection.js +2 -2
- package/lib/server/firefox/ffNetworkManager.js +6 -4
- package/lib/server/firefox/ffPage.js +22 -24
- package/lib/server/firefox/firefox.js +25 -6
- package/lib/server/frameSelectors.js +2 -2
- package/lib/server/frames.js +205 -159
- package/lib/server/har/harTracer.js +4 -12
- package/lib/server/helper.js +3 -3
- package/lib/server/index.js +18 -0
- package/lib/server/input.js +18 -8
- package/lib/server/instrumentation.js +0 -4
- package/lib/server/isomorphic/utilityScriptSerializers.js +19 -5
- package/lib/server/javascript.js +3 -2
- package/lib/server/launchApp.js +3 -2
- package/lib/server/network.js +14 -4
- package/lib/server/page.js +75 -46
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/codeGenerator.js +2 -1
- package/lib/server/recorder/contextRecorder.js +316 -0
- package/lib/server/recorder/csharp.js +2 -1
- package/lib/server/recorder/java.js +2 -1
- package/lib/server/recorder/javascript.js +2 -1
- package/lib/server/recorder/jsonl.js +2 -1
- package/lib/server/recorder/language.js +2 -1
- package/lib/server/recorder/python.js +2 -1
- package/lib/server/recorder/recorderApp.js +14 -5
- package/lib/server/recorder/recorderCollection.js +127 -0
- package/lib/server/recorder/recorderRunner.js +177 -0
- package/lib/server/recorder/recorderUtils.js +23 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder/utils.js +2 -1
- package/lib/server/recorder.js +42 -418
- package/lib/server/registry/index.js +99 -100
- package/lib/server/registry/nativeDeps.js +107 -0
- package/lib/server/screenshotter.js +6 -12
- package/lib/server/socksClientCertificatesInterceptor.js +328 -0
- package/lib/server/trace/recorder/snapshotter.js +4 -1
- package/lib/server/trace/recorder/tracing.js +27 -96
- package/lib/server/trace/viewer/traceViewer.js +54 -67
- package/lib/server/transport.js +1 -1
- package/lib/server/webkit/webkit.js +5 -5
- package/lib/server/webkit/wkBrowser.js +14 -14
- package/lib/server/webkit/wkConnection.js +3 -3
- package/lib/server/webkit/wkInterceptableRequest.js +8 -4
- package/lib/server/webkit/wkPage.js +52 -34
- package/lib/server/webkit/wkProvisionalPage.js +36 -1
- package/lib/utils/crypto.js +141 -0
- package/lib/utils/debugLogger.js +2 -0
- package/lib/utils/env.js +4 -2
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +140 -1
- package/lib/utils/glob.js +2 -1
- package/lib/utils/happy-eyeballs.js +29 -2
- package/lib/utils/hostPlatform.js +13 -4
- package/lib/utils/httpServer.js +54 -13
- package/lib/utils/index.js +53 -31
- package/lib/utils/isomorphic/cssTokenizer.js +1 -1
- package/lib/utils/isomorphic/locatorParser.js +1 -1
- package/lib/utils/isomorphic/mimeType.js +29 -0
- package/lib/utils/isomorphic/stringUtils.js +28 -1
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/mimeType.js +2 -1
- package/lib/utils/network.js +7 -35
- package/lib/utils/stackTrace.js +2 -4
- package/lib/utils/timeoutRunner.js +11 -76
- package/lib/utils/zones.js +23 -60
- package/lib/utilsBundle.js +2 -1
- package/lib/utilsBundleImpl/index.js +33 -31
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-C-fQ5QZD.js +24 -0
- package/lib/vite/recorder/assets/{codicon-zGuYmc9o.ttf → codicon-DCmgc-ay.ttf} +0 -0
- package/lib/vite/recorder/assets/index-B-MT5gKo.css +1 -0
- package/lib/vite/recorder/assets/index-D-5S5PPN.js +47 -0
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Dx6AXgMV.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-V7N6ppkd.js +15585 -0
- package/lib/vite/traceViewer/assets/testServerConnection-D-tXL3sj.js +224 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-Bjkiwcr1.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-C5OQh9VX.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +72 -0
- package/lib/vite/traceViewer/assets/wsPort-EUvw-dwH.js +18540 -0
- package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +6529 -0
- package/lib/vite/traceViewer/assets/xtermModule-_6TC5FYT.js +6529 -0
- package/lib/vite/traceViewer/codeMirrorModule.Cy8X9Wtw.css +344 -0
- package/lib/vite/traceViewer/codeMirrorModule.svF_VrcJ.css +344 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BQq6Psnz.js +104 -0
- package/lib/vite/traceViewer/embedded.BVDVQOzc.js +2 -0
- package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +2 -0
- package/lib/vite/traceViewer/embedded.CvhnUgIi.js +2 -0
- package/lib/vite/traceViewer/embedded.D27cnKiB.js +104 -0
- package/lib/vite/traceViewer/embedded.DPqrDeET.js +2 -0
- package/lib/vite/traceViewer/embedded.DjZq4InJ.css +68 -0
- package/lib/vite/traceViewer/embedded.html +16 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.5mge2rY_.css +124 -0
- package/lib/vite/traceViewer/index.6KJ-JQ0L.js +180 -0
- package/lib/vite/traceViewer/index.B8dgQwuN.js +2 -0
- package/lib/vite/traceViewer/index.BGj8jY3H.js +2 -0
- package/lib/vite/traceViewer/index.C0EgJ4oW.js +195 -0
- package/lib/vite/traceViewer/index.CUpI-BFe.js +195 -0
- package/lib/vite/traceViewer/{index.-g_5lMbJ.css → index.CrbWWHbf.css} +1 -1
- package/lib/vite/traceViewer/index.QanXxRUb.css +131 -0
- package/lib/vite/traceViewer/index._cX8k4co.js +2 -0
- package/lib/vite/traceViewer/index.html +5 -4
- package/lib/vite/traceViewer/index.pMAN88y-.js +2 -0
- package/lib/vite/traceViewer/snapshot.html +1 -1
- package/lib/vite/traceViewer/sw.bundle.js +3 -4
- package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +1730 -0
- package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +1 -0
- package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +1730 -0
- package/lib/vite/traceViewer/uiMode.DVWUEIHq.css +1424 -0
- package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +10 -0
- package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +10 -0
- package/lib/vite/traceViewer/uiMode.DwZAzstF.js +10 -0
- package/lib/vite/traceViewer/uiMode.html +5 -4
- package/lib/vite/traceViewer/uiMode.iq7CyYy7.js +1490 -0
- package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +10 -0
- package/lib/vite/traceViewer/uiMode.xvJHbkzl.css +1324 -0
- package/lib/vite/traceViewer/workbench.B3X2QtYa.css +3702 -0
- package/lib/vite/traceViewer/workbench.DyTpxWVb.css +1 -0
- package/lib/vite/traceViewer/wsPort.p5jUwABW.css +3450 -0
- package/lib/vite/traceViewer/xtermModule.4oRVGWQ-.css +209 -0
- package/lib/vite/traceViewer/xtermModule.OKEVRlkP.css +209 -0
- package/package.json +2 -2
- package/types/protocol.d.ts +960 -78
- package/types/structs.d.ts +1 -1
- package/types/types.d.ts +3083 -2448
- package/lib/vite/recorder/assets/codeMirrorModule-W69B4LBB.js +0 -24
- package/lib/vite/recorder/assets/index-Ly3PcVUb.js +0 -47
- package/lib/vite/recorder/assets/index-ljsTwXtJ.css +0 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-0bpaqixv.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-wLpsbIhd.js +0 -24
- package/lib/vite/traceViewer/assets/wsPort-_JBDEilC.js +0 -69
- package/lib/vite/traceViewer/assets/wsPort-f2dAQL4I.js +0 -69
- package/lib/vite/traceViewer/index.-_8-eHEE.js +0 -2
- package/lib/vite/traceViewer/index.u51inEcm.js +0 -2
- package/lib/vite/traceViewer/uiMode.9CwNsWc6.js +0 -10
- package/lib/vite/traceViewer/uiMode.Fb0bNA4H.js +0 -10
- package/lib/vite/traceViewer/uiMode.pWy0Re7G.css +0 -1
- package/lib/vite/traceViewer/wsPort.zR1WIy9-.css +0 -1
- /package/lib/vite/recorder/assets/{codeMirrorModule-Hs9-1ZG4.css → codeMirrorModule-ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/assets/{xtermModule-Yt6xwiJ_.js → xtermModule-BeNbaIVa.js} +0 -0
- /package/lib/vite/traceViewer/{codeMirrorModule.Hs9-1ZG4.css → codeMirrorModule.ez37Vkbh.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.0lwXJFHT.css → xtermModule.DSXBckUd.css} +0 -0
package/lib/server/recorder.js
CHANGED
|
@@ -5,27 +5,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.Recorder = void 0;
|
|
7
7
|
var fs = _interopRequireWildcard(require("fs"));
|
|
8
|
-
var _codeGenerator = require("./recorder/codeGenerator");
|
|
9
|
-
var _utils = require("./recorder/utils");
|
|
10
|
-
var _page = require("./page");
|
|
11
|
-
var _frames = require("./frames");
|
|
12
|
-
var _browserContext = require("./browserContext");
|
|
13
|
-
var _java = require("./recorder/java");
|
|
14
|
-
var _javascript = require("./recorder/javascript");
|
|
15
|
-
var _jsonl = require("./recorder/jsonl");
|
|
16
|
-
var _csharp = require("./recorder/csharp");
|
|
17
|
-
var _python = require("./recorder/python");
|
|
18
|
-
var recorderSource = _interopRequireWildcard(require("../generated/recorderSource"));
|
|
19
8
|
var consoleApiSource = _interopRequireWildcard(require("../generated/consoleApiSource"));
|
|
20
|
-
var
|
|
21
|
-
var _utils2 = require("../utils");
|
|
22
|
-
var _recorderUtils = require("./recorder/recorderUtils");
|
|
23
|
-
var _debugger = require("./debugger");
|
|
24
|
-
var _events = require("events");
|
|
25
|
-
var _timeoutRunner = require("../utils/timeoutRunner");
|
|
9
|
+
var _utils = require("../utils");
|
|
26
10
|
var _locatorParser = require("../utils/isomorphic/locatorParser");
|
|
27
|
-
var
|
|
28
|
-
var
|
|
11
|
+
var _browserContext = require("./browserContext");
|
|
12
|
+
var _debugger = require("./debugger");
|
|
13
|
+
var _contextRecorder = require("./recorder/contextRecorder");
|
|
14
|
+
var _recorderUtils = require("./recorder/recorderUtils");
|
|
29
15
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
30
16
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
31
17
|
/**
|
|
@@ -46,23 +32,25 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
46
32
|
|
|
47
33
|
const recorderSymbol = Symbol('recorderSymbol');
|
|
48
34
|
class Recorder {
|
|
49
|
-
static
|
|
50
|
-
Recorder.recorderAppFactory = recorderAppFactory;
|
|
51
|
-
}
|
|
52
|
-
static showInspector(context) {
|
|
35
|
+
static showInspector(context, recorderAppFactory) {
|
|
53
36
|
const params = {};
|
|
54
|
-
if ((0,
|
|
55
|
-
Recorder.show(context, params).catch(() => {});
|
|
37
|
+
if ((0, _utils.isUnderTest)()) params.language = process.env.TEST_INSPECTOR_LANGUAGE;
|
|
38
|
+
Recorder.show(context, recorderAppFactory, params).catch(() => {});
|
|
56
39
|
}
|
|
57
|
-
static show(context, params = {}) {
|
|
40
|
+
static show(context, recorderAppFactory, params = {}) {
|
|
58
41
|
let recorderPromise = context[recorderSymbol];
|
|
59
42
|
if (!recorderPromise) {
|
|
60
|
-
|
|
61
|
-
recorderPromise = recorder.install().then(() => recorder);
|
|
43
|
+
recorderPromise = Recorder._create(context, recorderAppFactory, params);
|
|
62
44
|
context[recorderSymbol] = recorderPromise;
|
|
63
45
|
}
|
|
64
46
|
return recorderPromise;
|
|
65
47
|
}
|
|
48
|
+
static async _create(context, recorderAppFactory, params = {}) {
|
|
49
|
+
const recorder = new Recorder(context, params);
|
|
50
|
+
const recorderApp = await recorderAppFactory(recorder);
|
|
51
|
+
await recorder._install(recorderApp);
|
|
52
|
+
return recorder;
|
|
53
|
+
}
|
|
66
54
|
constructor(context, params) {
|
|
67
55
|
this._context = void 0;
|
|
68
56
|
this._mode = void 0;
|
|
@@ -76,28 +64,21 @@ class Recorder {
|
|
|
76
64
|
this._userSources = new Map();
|
|
77
65
|
this._debugger = void 0;
|
|
78
66
|
this._contextRecorder = void 0;
|
|
79
|
-
this._handleSIGINT = void 0;
|
|
80
67
|
this._omitCallTracking = false;
|
|
81
68
|
this._currentLanguage = void 0;
|
|
82
69
|
this._mode = params.mode || 'none';
|
|
83
|
-
this._contextRecorder = new ContextRecorder(context, params);
|
|
70
|
+
this._contextRecorder = new _contextRecorder.ContextRecorder(context, params, {});
|
|
84
71
|
this._context = context;
|
|
85
72
|
this._omitCallTracking = !!params.omitCallTracking;
|
|
86
73
|
this._debugger = context.debugger();
|
|
87
|
-
this._handleSIGINT = params.handleSIGINT;
|
|
88
74
|
context.instrumentation.addListener(this, context);
|
|
89
75
|
this._currentLanguage = this._contextRecorder.languageName();
|
|
90
|
-
if ((0,
|
|
76
|
+
if ((0, _utils.isUnderTest)()) {
|
|
91
77
|
// Most of our tests put elements at the top left, so get out of the way.
|
|
92
78
|
this._overlayState.offsetX = 200;
|
|
93
79
|
}
|
|
94
80
|
}
|
|
95
|
-
|
|
96
|
-
if (process.env.PW_CODEGEN_NO_INSPECTOR) return new _recorderApp.EmptyRecorderApp();
|
|
97
|
-
return await _recorderApp.RecorderApp.open(recorder, recorder._context, recorder._handleSIGINT);
|
|
98
|
-
}
|
|
99
|
-
async install() {
|
|
100
|
-
const recorderApp = await (Recorder.recorderAppFactory || Recorder.defaultRecorderAppFactory)(this);
|
|
81
|
+
async _install(recorderApp) {
|
|
101
82
|
this._recorderApp = recorderApp;
|
|
102
83
|
recorderApp.once('close', () => {
|
|
103
84
|
this._debugger.resume(false);
|
|
@@ -136,15 +117,16 @@ class Recorder {
|
|
|
136
117
|
});
|
|
137
118
|
await Promise.all([recorderApp.setMode(this._mode), recorderApp.setPaused(this._debugger.isPaused()), this._pushAllSources()]);
|
|
138
119
|
this._context.once(_browserContext.BrowserContext.Events.Close, () => {
|
|
120
|
+
var _this$_recorderApp;
|
|
139
121
|
this._contextRecorder.dispose();
|
|
140
122
|
this._context.instrumentation.removeListener(this);
|
|
141
|
-
|
|
123
|
+
(_this$_recorderApp = this._recorderApp) === null || _this$_recorderApp === void 0 || _this$_recorderApp.close().catch(() => {});
|
|
142
124
|
});
|
|
143
|
-
this._contextRecorder.on(ContextRecorder.Events.Change, data => {
|
|
144
|
-
var _this$
|
|
125
|
+
this._contextRecorder.on(_contextRecorder.ContextRecorder.Events.Change, data => {
|
|
126
|
+
var _this$_recorderApp2;
|
|
145
127
|
this._recorderSources = data.sources;
|
|
146
128
|
this._pushAllSources();
|
|
147
|
-
(_this$
|
|
129
|
+
(_this$_recorderApp2 = this._recorderApp) === null || _this$_recorderApp2 === void 0 || _this$_recorderApp2.setFileIfNeeded(data.primaryFileName);
|
|
148
130
|
});
|
|
149
131
|
await this._context.exposeBinding('__pw_recorderState', false, source => {
|
|
150
132
|
let actionSelector = '';
|
|
@@ -172,16 +154,9 @@ class Recorder {
|
|
|
172
154
|
await this._context.exposeBinding('__pw_recorderSetSelector', false, async ({
|
|
173
155
|
frame
|
|
174
156
|
}, selector) => {
|
|
175
|
-
var _this$
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
while (currentFrame) {
|
|
179
|
-
selectorPromises.push(findFrameSelector(currentFrame));
|
|
180
|
-
currentFrame = currentFrame.parentFrame();
|
|
181
|
-
}
|
|
182
|
-
const fullSelector = (await Promise.all(selectorPromises)).filter(Boolean);
|
|
183
|
-
fullSelector.push(selector);
|
|
184
|
-
await ((_this$_recorderApp2 = this._recorderApp) === null || _this$_recorderApp2 === void 0 ? void 0 : _this$_recorderApp2.setSelector(fullSelector.join(' >> internal:control=enter-frame >> '), true));
|
|
157
|
+
var _this$_recorderApp3;
|
|
158
|
+
const selectorChain = await (0, _contextRecorder.generateFrameSelector)(frame);
|
|
159
|
+
await ((_this$_recorderApp3 = this._recorderApp) === null || _this$_recorderApp3 === void 0 ? void 0 : _this$_recorderApp3.setSelector((0, _recorderUtils.buildFullSelector)(selectorChain, selector), true));
|
|
185
160
|
});
|
|
186
161
|
await this._context.exposeBinding('__pw_recorderSetMode', false, async ({
|
|
187
162
|
frame
|
|
@@ -202,10 +177,10 @@ class Recorder {
|
|
|
202
177
|
await this._contextRecorder.install();
|
|
203
178
|
if (this._debugger.isPaused()) this._pausedStateChanged();
|
|
204
179
|
this._debugger.on(_debugger.Debugger.Events.PausedStateChanged, () => this._pausedStateChanged());
|
|
205
|
-
this._context.recorderAppForTest =
|
|
180
|
+
this._context.recorderAppForTest = this._recorderApp;
|
|
206
181
|
}
|
|
207
182
|
_pausedStateChanged() {
|
|
208
|
-
var _this$
|
|
183
|
+
var _this$_recorderApp4;
|
|
209
184
|
// If we are called upon page.pause, we don't have metadatas, populate them.
|
|
210
185
|
for (const {
|
|
211
186
|
metadata,
|
|
@@ -213,16 +188,16 @@ class Recorder {
|
|
|
213
188
|
} of this._debugger.pausedDetails()) {
|
|
214
189
|
if (!this._currentCallsMetadata.has(metadata)) this.onBeforeCall(sdkObject, metadata);
|
|
215
190
|
}
|
|
216
|
-
(_this$
|
|
191
|
+
(_this$_recorderApp4 = this._recorderApp) === null || _this$_recorderApp4 === void 0 || _this$_recorderApp4.setPaused(this._debugger.isPaused());
|
|
217
192
|
this._updateUserSources();
|
|
218
193
|
this.updateCallLog([...this._currentCallsMetadata.keys()]);
|
|
219
194
|
}
|
|
220
195
|
setMode(mode) {
|
|
221
|
-
var _this$
|
|
196
|
+
var _this$_recorderApp5;
|
|
222
197
|
if (this._mode === mode) return;
|
|
223
198
|
this._highlightedSelector = '';
|
|
224
199
|
this._mode = mode;
|
|
225
|
-
(_this$
|
|
200
|
+
(_this$_recorderApp5 = this._recorderApp) === null || _this$_recorderApp5 === void 0 || _this$_recorderApp5.setMode(this._mode);
|
|
226
201
|
this._contextRecorder.setEnabled(this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue');
|
|
227
202
|
this._debugger.setMuted(this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue');
|
|
228
203
|
if (this._mode !== 'none' && this._mode !== 'standby' && this._context.pages().length === 1) this._context.pages()[0].bringToFront().catch(() => {});
|
|
@@ -256,9 +231,9 @@ class Recorder {
|
|
|
256
231
|
if (isScreenshotCommand(metadata)) {
|
|
257
232
|
this.hideHighlightedSelector();
|
|
258
233
|
} else if (metadata.params && metadata.params.selector) {
|
|
259
|
-
var _this$
|
|
234
|
+
var _this$_recorderApp6;
|
|
260
235
|
this._highlightedSelector = metadata.params.selector;
|
|
261
|
-
(_this$
|
|
236
|
+
(_this$_recorderApp6 = this._recorderApp) === null || _this$_recorderApp6 === void 0 || _this$_recorderApp6.setSelector(this._highlightedSelector).catch(() => {});
|
|
262
237
|
}
|
|
263
238
|
}
|
|
264
239
|
async onAfterCall(sdkObject, metadata) {
|
|
@@ -268,7 +243,7 @@ class Recorder {
|
|
|
268
243
|
this.updateCallLog([metadata]);
|
|
269
244
|
}
|
|
270
245
|
_updateUserSources() {
|
|
271
|
-
var _this$
|
|
246
|
+
var _this$_recorderApp7;
|
|
272
247
|
// Remove old decorations.
|
|
273
248
|
for (const source of this._userSources.values()) {
|
|
274
249
|
source.highlight = [];
|
|
@@ -306,18 +281,18 @@ class Recorder {
|
|
|
306
281
|
}
|
|
307
282
|
}
|
|
308
283
|
this._pushAllSources();
|
|
309
|
-
if (fileToSelect) (_this$
|
|
284
|
+
if (fileToSelect) (_this$_recorderApp7 = this._recorderApp) === null || _this$_recorderApp7 === void 0 || _this$_recorderApp7.setFileIfNeeded(fileToSelect);
|
|
310
285
|
}
|
|
311
286
|
_pushAllSources() {
|
|
312
|
-
var _this$
|
|
313
|
-
(_this$
|
|
287
|
+
var _this$_recorderApp8;
|
|
288
|
+
(_this$_recorderApp8 = this._recorderApp) === null || _this$_recorderApp8 === void 0 || _this$_recorderApp8.setSources([...this._recorderSources, ...this._userSources.values()]);
|
|
314
289
|
}
|
|
315
290
|
async onBeforeInputAction(sdkObject, metadata) {}
|
|
316
291
|
async onCallLog(sdkObject, metadata, logName, message) {
|
|
317
292
|
this.updateCallLog([metadata]);
|
|
318
293
|
}
|
|
319
294
|
updateCallLog(metadatas) {
|
|
320
|
-
var _this$
|
|
295
|
+
var _this$_recorderApp9;
|
|
321
296
|
if (this._mode === 'recording' || this._mode === 'assertingText' || this._mode === 'assertingVisibility' || this._mode === 'assertingValue') return;
|
|
322
297
|
const logs = [];
|
|
323
298
|
for (const metadata of metadatas) {
|
|
@@ -327,7 +302,7 @@ class Recorder {
|
|
|
327
302
|
if (this._debugger.isPaused(metadata)) status = 'paused';
|
|
328
303
|
logs.push((0, _recorderUtils.metadataToCallLog)(metadata, status));
|
|
329
304
|
}
|
|
330
|
-
(_this$
|
|
305
|
+
(_this$_recorderApp9 = this._recorderApp) === null || _this$_recorderApp9 === void 0 || _this$_recorderApp9.updateCallLogs(logs);
|
|
331
306
|
}
|
|
332
307
|
_readSource(fileName) {
|
|
333
308
|
try {
|
|
@@ -338,363 +313,12 @@ class Recorder {
|
|
|
338
313
|
}
|
|
339
314
|
}
|
|
340
315
|
exports.Recorder = Recorder;
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
constructor(context, params) {
|
|
344
|
-
super();
|
|
345
|
-
this._generator = void 0;
|
|
346
|
-
this._pageAliases = new Map();
|
|
347
|
-
this._lastPopupOrdinal = 0;
|
|
348
|
-
this._lastDialogOrdinal = -1;
|
|
349
|
-
this._lastDownloadOrdinal = -1;
|
|
350
|
-
this._timers = new Set();
|
|
351
|
-
this._context = void 0;
|
|
352
|
-
this._params = void 0;
|
|
353
|
-
this._recorderSources = void 0;
|
|
354
|
-
this._throttledOutputFile = null;
|
|
355
|
-
this._orderedLanguages = [];
|
|
356
|
-
this._listeners = [];
|
|
357
|
-
this._context = context;
|
|
358
|
-
this._params = params;
|
|
359
|
-
this._recorderSources = [];
|
|
360
|
-
const language = params.language || context.attribution.playwright.options.sdkLanguage;
|
|
361
|
-
this.setOutput(language, params.outputFile);
|
|
362
|
-
const generator = new _codeGenerator.CodeGenerator(context._browser.options.name, params.mode === 'recording', params.launchOptions || {}, params.contextOptions || {}, params.device, params.saveStorage);
|
|
363
|
-
generator.on('change', () => {
|
|
364
|
-
this._recorderSources = [];
|
|
365
|
-
for (const languageGenerator of this._orderedLanguages) {
|
|
366
|
-
var _this$_throttledOutpu;
|
|
367
|
-
const {
|
|
368
|
-
header,
|
|
369
|
-
footer,
|
|
370
|
-
actions,
|
|
371
|
-
text
|
|
372
|
-
} = generator.generateStructure(languageGenerator);
|
|
373
|
-
const source = {
|
|
374
|
-
isRecorded: true,
|
|
375
|
-
label: languageGenerator.name,
|
|
376
|
-
group: languageGenerator.groupName,
|
|
377
|
-
id: languageGenerator.id,
|
|
378
|
-
text,
|
|
379
|
-
header,
|
|
380
|
-
footer,
|
|
381
|
-
actions,
|
|
382
|
-
language: languageGenerator.highlighter,
|
|
383
|
-
highlight: []
|
|
384
|
-
};
|
|
385
|
-
source.revealLine = text.split('\n').length - 1;
|
|
386
|
-
this._recorderSources.push(source);
|
|
387
|
-
if (languageGenerator === this._orderedLanguages[0]) (_this$_throttledOutpu = this._throttledOutputFile) === null || _this$_throttledOutpu === void 0 || _this$_throttledOutpu.setContent(source.text);
|
|
388
|
-
}
|
|
389
|
-
this.emit(ContextRecorder.Events.Change, {
|
|
390
|
-
sources: this._recorderSources,
|
|
391
|
-
primaryFileName: this._orderedLanguages[0].id
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
context.on(_browserContext.BrowserContext.Events.BeforeClose, () => {
|
|
395
|
-
var _this$_throttledOutpu2;
|
|
396
|
-
(_this$_throttledOutpu2 = this._throttledOutputFile) === null || _this$_throttledOutpu2 === void 0 || _this$_throttledOutpu2.flush();
|
|
397
|
-
});
|
|
398
|
-
this._listeners.push(_eventsHelper.eventsHelper.addEventListener(process, 'exit', () => {
|
|
399
|
-
var _this$_throttledOutpu3;
|
|
400
|
-
(_this$_throttledOutpu3 = this._throttledOutputFile) === null || _this$_throttledOutpu3 === void 0 || _this$_throttledOutpu3.flush();
|
|
401
|
-
}));
|
|
402
|
-
this._generator = generator;
|
|
403
|
-
}
|
|
404
|
-
setOutput(codegenId, outputFile) {
|
|
405
|
-
var _this$_generator;
|
|
406
|
-
const languages = new Set([new _java.JavaLanguageGenerator('junit'), new _java.JavaLanguageGenerator('library'), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */false), new _javascript.JavaScriptLanguageGenerator( /* isPlaywrightTest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */true), new _python.PythonLanguageGenerator( /* isAsync */false, /* isPytest */false), new _python.PythonLanguageGenerator( /* isAsync */true, /* isPytest */false), new _csharp.CSharpLanguageGenerator('mstest'), new _csharp.CSharpLanguageGenerator('nunit'), new _csharp.CSharpLanguageGenerator('library'), new _jsonl.JsonlLanguageGenerator()]);
|
|
407
|
-
const primaryLanguage = [...languages].find(l => l.id === codegenId);
|
|
408
|
-
if (!primaryLanguage) throw new Error(`\n===============================\nUnsupported language: '${codegenId}'\n===============================\n`);
|
|
409
|
-
languages.delete(primaryLanguage);
|
|
410
|
-
this._orderedLanguages = [primaryLanguage, ...languages];
|
|
411
|
-
this._throttledOutputFile = outputFile ? new ThrottledFile(outputFile) : null;
|
|
412
|
-
(_this$_generator = this._generator) === null || _this$_generator === void 0 || _this$_generator.restart();
|
|
413
|
-
}
|
|
414
|
-
languageName(id) {
|
|
415
|
-
for (const lang of this._orderedLanguages) {
|
|
416
|
-
if (!id || lang.id === id) return lang.highlighter;
|
|
417
|
-
}
|
|
418
|
-
return 'javascript';
|
|
419
|
-
}
|
|
420
|
-
async install() {
|
|
421
|
-
this._context.on(_browserContext.BrowserContext.Events.Page, page => this._onPage(page));
|
|
422
|
-
for (const page of this._context.pages()) this._onPage(page);
|
|
423
|
-
this._context.on(_browserContext.BrowserContext.Events.Dialog, dialog => this._onDialog(dialog.page()));
|
|
424
|
-
|
|
425
|
-
// Input actions that potentially lead to navigation are intercepted on the page and are
|
|
426
|
-
// performed by the Playwright.
|
|
427
|
-
await this._context.exposeBinding('__pw_recorderPerformAction', false, (source, action) => this._performAction(source.frame, action));
|
|
428
|
-
|
|
429
|
-
// Other non-essential actions are simply being recorded.
|
|
430
|
-
await this._context.exposeBinding('__pw_recorderRecordAction', false, (source, action) => this._recordAction(source.frame, action));
|
|
431
|
-
await this._context.extendInjectedScript(recorderSource.source);
|
|
432
|
-
}
|
|
433
|
-
setEnabled(enabled) {
|
|
434
|
-
this._generator.setEnabled(enabled);
|
|
435
|
-
}
|
|
436
|
-
dispose() {
|
|
437
|
-
for (const timer of this._timers) clearTimeout(timer);
|
|
438
|
-
this._timers.clear();
|
|
439
|
-
_eventsHelper.eventsHelper.removeEventListeners(this._listeners);
|
|
440
|
-
}
|
|
441
|
-
async _onPage(page) {
|
|
442
|
-
// First page is called page, others are called popup1, popup2, etc.
|
|
443
|
-
const frame = page.mainFrame();
|
|
444
|
-
page.on('close', () => {
|
|
445
|
-
this._generator.addAction({
|
|
446
|
-
frame: this._describeMainFrame(page),
|
|
447
|
-
committed: true,
|
|
448
|
-
action: {
|
|
449
|
-
name: 'closePage',
|
|
450
|
-
signals: []
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
this._pageAliases.delete(page);
|
|
454
|
-
});
|
|
455
|
-
frame.on(_frames.Frame.Events.InternalNavigation, event => {
|
|
456
|
-
if (event.isPublic) this._onFrameNavigated(frame, page);
|
|
457
|
-
});
|
|
458
|
-
page.on(_page.Page.Events.Download, () => this._onDownload(page));
|
|
459
|
-
const suffix = this._pageAliases.size ? String(++this._lastPopupOrdinal) : '';
|
|
460
|
-
const pageAlias = 'page' + suffix;
|
|
461
|
-
this._pageAliases.set(page, pageAlias);
|
|
462
|
-
if (page.opener()) {
|
|
463
|
-
this._onPopup(page.opener(), page);
|
|
464
|
-
} else {
|
|
465
|
-
this._generator.addAction({
|
|
466
|
-
frame: this._describeMainFrame(page),
|
|
467
|
-
committed: true,
|
|
468
|
-
action: {
|
|
469
|
-
name: 'openPage',
|
|
470
|
-
url: page.mainFrame().url(),
|
|
471
|
-
signals: []
|
|
472
|
-
}
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
clearScript() {
|
|
477
|
-
this._generator.restart();
|
|
478
|
-
if (this._params.mode === 'recording') {
|
|
479
|
-
for (const page of this._context.pages()) this._onFrameNavigated(page.mainFrame(), page);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
_describeMainFrame(page) {
|
|
483
|
-
return {
|
|
484
|
-
pageAlias: this._pageAliases.get(page),
|
|
485
|
-
isMainFrame: true
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
async _describeFrame(frame) {
|
|
489
|
-
const page = frame._page;
|
|
490
|
-
const pageAlias = this._pageAliases.get(page);
|
|
491
|
-
const chain = [];
|
|
492
|
-
for (let ancestor = frame; ancestor; ancestor = ancestor.parentFrame()) chain.push(ancestor);
|
|
493
|
-
chain.reverse();
|
|
494
|
-
if (chain.length === 1) return this._describeMainFrame(page);
|
|
495
|
-
const selectorPromises = [];
|
|
496
|
-
for (let i = 0; i < chain.length - 1; i++) selectorPromises.push(findFrameSelector(chain[i + 1]));
|
|
497
|
-
const result = await (0, _timeoutRunner.raceAgainstDeadline)(() => Promise.all(selectorPromises), (0, _utils2.monotonicTime)() + 2000);
|
|
498
|
-
if (!result.timedOut && result.result.every(selector => !!selector)) {
|
|
499
|
-
return {
|
|
500
|
-
pageAlias,
|
|
501
|
-
isMainFrame: false,
|
|
502
|
-
selectorsChain: result.result
|
|
503
|
-
};
|
|
504
|
-
}
|
|
505
|
-
// Best effort to find a selector for the frame.
|
|
506
|
-
const selectorsChain = [];
|
|
507
|
-
for (let i = 0; i < chain.length - 1; i++) {
|
|
508
|
-
if (chain[i].name()) selectorsChain.push(`iframe[name=${(0, _stringUtils.quoteCSSAttributeValue)(chain[i].name())}]`);else selectorsChain.push(`iframe[src=${(0, _stringUtils.quoteCSSAttributeValue)(chain[i].url())}]`);
|
|
509
|
-
}
|
|
510
|
-
return {
|
|
511
|
-
pageAlias,
|
|
512
|
-
isMainFrame: false,
|
|
513
|
-
selectorsChain
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
testIdAttributeName() {
|
|
517
|
-
return this._params.testIdAttributeName || this._context.selectors().testIdAttributeName() || 'data-testid';
|
|
518
|
-
}
|
|
519
|
-
async _performAction(frame, action) {
|
|
520
|
-
// Commit last action so that no further signals are added to it.
|
|
521
|
-
this._generator.commitLastAction();
|
|
522
|
-
const frameDescription = await this._describeFrame(frame);
|
|
523
|
-
const actionInContext = {
|
|
524
|
-
frame: frameDescription,
|
|
525
|
-
action
|
|
526
|
-
};
|
|
527
|
-
const perform = async (action, params, cb) => {
|
|
528
|
-
const callMetadata = {
|
|
529
|
-
id: `call@${(0, _utils2.createGuid)()}`,
|
|
530
|
-
apiName: 'frame.' + action,
|
|
531
|
-
objectId: frame.guid,
|
|
532
|
-
pageId: frame._page.guid,
|
|
533
|
-
frameId: frame.guid,
|
|
534
|
-
startTime: (0, _utils2.monotonicTime)(),
|
|
535
|
-
endTime: 0,
|
|
536
|
-
wallTime: Date.now(),
|
|
537
|
-
type: 'Frame',
|
|
538
|
-
method: action,
|
|
539
|
-
params,
|
|
540
|
-
log: []
|
|
541
|
-
};
|
|
542
|
-
this._generator.willPerformAction(actionInContext);
|
|
543
|
-
try {
|
|
544
|
-
await frame.instrumentation.onBeforeCall(frame, callMetadata);
|
|
545
|
-
await cb(callMetadata);
|
|
546
|
-
} catch (e) {
|
|
547
|
-
callMetadata.endTime = (0, _utils2.monotonicTime)();
|
|
548
|
-
await frame.instrumentation.onAfterCall(frame, callMetadata);
|
|
549
|
-
this._generator.performedActionFailed(actionInContext);
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
|
-
callMetadata.endTime = (0, _utils2.monotonicTime)();
|
|
553
|
-
await frame.instrumentation.onAfterCall(frame, callMetadata);
|
|
554
|
-
const timer = setTimeout(() => {
|
|
555
|
-
// Commit the action after 5 seconds so that no further signals are added to it.
|
|
556
|
-
actionInContext.committed = true;
|
|
557
|
-
this._timers.delete(timer);
|
|
558
|
-
}, 5000);
|
|
559
|
-
this._generator.didPerformAction(actionInContext);
|
|
560
|
-
this._timers.add(timer);
|
|
561
|
-
};
|
|
562
|
-
const kActionTimeout = 5000;
|
|
563
|
-
if (action.name === 'click') {
|
|
564
|
-
const {
|
|
565
|
-
options
|
|
566
|
-
} = (0, _utils.toClickOptions)(action);
|
|
567
|
-
await perform('click', {
|
|
568
|
-
selector: action.selector
|
|
569
|
-
}, callMetadata => frame.click(callMetadata, action.selector, {
|
|
570
|
-
...options,
|
|
571
|
-
timeout: kActionTimeout,
|
|
572
|
-
strict: true
|
|
573
|
-
}));
|
|
574
|
-
}
|
|
575
|
-
if (action.name === 'press') {
|
|
576
|
-
const modifiers = (0, _utils.toModifiers)(action.modifiers);
|
|
577
|
-
const shortcut = [...modifiers, action.key].join('+');
|
|
578
|
-
await perform('press', {
|
|
579
|
-
selector: action.selector,
|
|
580
|
-
key: shortcut
|
|
581
|
-
}, callMetadata => frame.press(callMetadata, action.selector, shortcut, {
|
|
582
|
-
timeout: kActionTimeout,
|
|
583
|
-
strict: true
|
|
584
|
-
}));
|
|
585
|
-
}
|
|
586
|
-
if (action.name === 'check') await perform('check', {
|
|
587
|
-
selector: action.selector
|
|
588
|
-
}, callMetadata => frame.check(callMetadata, action.selector, {
|
|
589
|
-
timeout: kActionTimeout,
|
|
590
|
-
strict: true
|
|
591
|
-
}));
|
|
592
|
-
if (action.name === 'uncheck') await perform('uncheck', {
|
|
593
|
-
selector: action.selector
|
|
594
|
-
}, callMetadata => frame.uncheck(callMetadata, action.selector, {
|
|
595
|
-
timeout: kActionTimeout,
|
|
596
|
-
strict: true
|
|
597
|
-
}));
|
|
598
|
-
if (action.name === 'select') {
|
|
599
|
-
const values = action.options.map(value => ({
|
|
600
|
-
value
|
|
601
|
-
}));
|
|
602
|
-
await perform('selectOption', {
|
|
603
|
-
selector: action.selector,
|
|
604
|
-
values
|
|
605
|
-
}, callMetadata => frame.selectOption(callMetadata, action.selector, [], values, {
|
|
606
|
-
timeout: kActionTimeout,
|
|
607
|
-
strict: true
|
|
608
|
-
}));
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
async _recordAction(frame, action) {
|
|
612
|
-
// Commit last action so that no further signals are added to it.
|
|
613
|
-
this._generator.commitLastAction();
|
|
614
|
-
const frameDescription = await this._describeFrame(frame);
|
|
615
|
-
const actionInContext = {
|
|
616
|
-
frame: frameDescription,
|
|
617
|
-
action
|
|
618
|
-
};
|
|
619
|
-
this._generator.addAction(actionInContext);
|
|
620
|
-
}
|
|
621
|
-
_onFrameNavigated(frame, page) {
|
|
622
|
-
const pageAlias = this._pageAliases.get(page);
|
|
623
|
-
this._generator.signal(pageAlias, frame, {
|
|
624
|
-
name: 'navigation',
|
|
625
|
-
url: frame.url()
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
_onPopup(page, popup) {
|
|
629
|
-
const pageAlias = this._pageAliases.get(page);
|
|
630
|
-
const popupAlias = this._pageAliases.get(popup);
|
|
631
|
-
this._generator.signal(pageAlias, page.mainFrame(), {
|
|
632
|
-
name: 'popup',
|
|
633
|
-
popupAlias
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
_onDownload(page) {
|
|
637
|
-
const pageAlias = this._pageAliases.get(page);
|
|
638
|
-
++this._lastDownloadOrdinal;
|
|
639
|
-
this._generator.signal(pageAlias, page.mainFrame(), {
|
|
640
|
-
name: 'download',
|
|
641
|
-
downloadAlias: this._lastDownloadOrdinal ? String(this._lastDownloadOrdinal) : ''
|
|
642
|
-
});
|
|
643
|
-
}
|
|
644
|
-
_onDialog(page) {
|
|
645
|
-
const pageAlias = this._pageAliases.get(page);
|
|
646
|
-
++this._lastDialogOrdinal;
|
|
647
|
-
this._generator.signal(pageAlias, page.mainFrame(), {
|
|
648
|
-
name: 'dialog',
|
|
649
|
-
dialogAlias: this._lastDialogOrdinal ? String(this._lastDialogOrdinal) : ''
|
|
650
|
-
});
|
|
651
|
-
}
|
|
316
|
+
function isScreenshotCommand(metadata) {
|
|
317
|
+
return metadata.method.toLowerCase().includes('screenshot');
|
|
652
318
|
}
|
|
653
|
-
ContextRecorder.Events = {
|
|
654
|
-
Change: 'change'
|
|
655
|
-
};
|
|
656
319
|
function languageForFile(file) {
|
|
657
320
|
if (file.endsWith('.py')) return 'python';
|
|
658
321
|
if (file.endsWith('.java')) return 'java';
|
|
659
322
|
if (file.endsWith('.cs')) return 'csharp';
|
|
660
323
|
return 'javascript';
|
|
661
|
-
}
|
|
662
|
-
class ThrottledFile {
|
|
663
|
-
constructor(file) {
|
|
664
|
-
this._file = void 0;
|
|
665
|
-
this._timer = void 0;
|
|
666
|
-
this._text = void 0;
|
|
667
|
-
this._file = file;
|
|
668
|
-
}
|
|
669
|
-
setContent(text) {
|
|
670
|
-
this._text = text;
|
|
671
|
-
if (!this._timer) this._timer = setTimeout(() => this.flush(), 250);
|
|
672
|
-
}
|
|
673
|
-
flush() {
|
|
674
|
-
if (this._timer) {
|
|
675
|
-
clearTimeout(this._timer);
|
|
676
|
-
this._timer = undefined;
|
|
677
|
-
}
|
|
678
|
-
if (this._text) fs.writeFileSync(this._file, this._text);
|
|
679
|
-
this._text = undefined;
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
function isScreenshotCommand(metadata) {
|
|
683
|
-
return metadata.method.toLowerCase().includes('screenshot');
|
|
684
|
-
}
|
|
685
|
-
async function findFrameSelector(frame) {
|
|
686
|
-
try {
|
|
687
|
-
const parent = frame.parentFrame();
|
|
688
|
-
const frameElement = await frame.frameElement();
|
|
689
|
-
if (!frameElement || !parent) return;
|
|
690
|
-
const utility = await parent._utilityContext();
|
|
691
|
-
const injected = await utility.injectedScript();
|
|
692
|
-
const selector = await injected.evaluate((injected, element) => {
|
|
693
|
-
return injected.generateSelectorSimple(element, {
|
|
694
|
-
testIdAttributeName: '',
|
|
695
|
-
omitInternalEngines: true
|
|
696
|
-
});
|
|
697
|
-
}, frameElement);
|
|
698
|
-
return selector;
|
|
699
|
-
} catch (e) {}
|
|
700
324
|
}
|