@checkly/playwright-core 1.47.20-alpha → 1.48.20
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/browsers.json +14 -10
- package/lib/checkly/escapeRegExp.js +33 -0
- package/lib/checkly/secretsFilter.js +23 -0
- package/lib/cli/program.js +26 -14
- package/lib/client/api.js +6 -0
- package/lib/client/browserContext.js +20 -2
- package/lib/client/channelOwner.js +5 -2
- package/lib/client/connection.js +3 -0
- package/lib/client/fetch.js +16 -3
- package/lib/client/jsHandle.js +0 -8
- package/lib/client/localUtils.js +1 -0
- package/lib/client/network.js +175 -17
- package/lib/client/page.js +21 -0
- package/lib/client/playwright.js +6 -3
- package/lib/client/tracing.js +16 -20
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +7 -0
- package/lib/protocol/validator.js +80 -14
- package/lib/server/bidi/bidiBrowser.js +23 -8
- package/lib/server/bidi/bidiChromium.js +124 -0
- package/lib/server/bidi/bidiConnection.js +1 -1
- package/lib/server/bidi/bidiExecutionContext.js +0 -3
- package/lib/server/bidi/bidiFirefox.js +15 -21
- package/lib/server/bidi/bidiInput.js +16 -32
- package/lib/server/bidi/bidiNetworkManager.js +39 -5
- package/lib/server/bidi/bidiOverCdp.js +103 -0
- package/lib/server/bidi/bidiPage.js +98 -25
- package/lib/server/bidi/bidiPdf.js +140 -0
- package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
- package/lib/server/browser.js +13 -2
- package/lib/server/browserContext.js +6 -23
- package/lib/server/browserType.js +39 -11
- package/lib/server/chromium/chromium.js +3 -15
- package/lib/server/chromium/chromiumSwitches.js +3 -1
- package/lib/server/chromium/crBrowser.js +4 -3
- package/lib/server/chromium/crExecutionContext.js +0 -7
- package/lib/server/chromium/crPage.js +5 -2
- package/lib/server/chromium/videoRecorder.js +1 -1
- package/lib/server/codegen/csharp.js +2 -2
- package/lib/server/codegen/java.js +1 -1
- package/lib/server/codegen/javascript.js +1 -1
- package/lib/server/codegen/language.js +14 -2
- package/lib/server/codegen/python.js +2 -2
- package/lib/server/cookieStore.js +73 -0
- package/lib/server/debugController.js +2 -2
- package/lib/server/deviceDescriptorsSource.json +51 -51
- package/lib/server/dialog.js +1 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +19 -2
- package/lib/server/dispatchers/jsHandleDispatcher.js +0 -5
- package/lib/server/dispatchers/pageDispatcher.js +9 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +2 -1
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
- package/lib/server/download.js +9 -2
- package/lib/server/fetch.js +96 -99
- package/lib/server/firefox/ffBrowser.js +6 -4
- package/lib/server/firefox/ffExecutionContext.js +0 -3
- package/lib/server/firefox/ffPage.js +3 -0
- package/lib/server/firefox/firefox.js +2 -13
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +3 -2
- package/lib/server/har/harTracer.js +11 -0
- package/lib/server/input.js +0 -1
- package/lib/server/javascript.js +0 -7
- package/lib/server/page.js +5 -1
- package/lib/server/playwright.js +5 -2
- package/lib/server/recorder/contextRecorder.js +33 -50
- package/lib/server/recorder/recorderActions.js +2 -1
- package/lib/server/recorder/recorderApp.js +16 -10
- package/lib/server/recorder/recorderCollection.js +68 -79
- package/lib/server/recorder/recorderFrontend.js +5 -0
- package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- package/lib/server/recorder/recorderRunner.js +75 -97
- package/lib/server/recorder/recorderUtils.js +47 -6
- package/lib/server/recorder.js +30 -25
- package/lib/server/registry/index.js +85 -4
- package/lib/server/socksClientCertificatesInterceptor.js +15 -3
- package/lib/server/trace/recorder/snapshotter.js +1 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +2 -2
- package/lib/server/trace/recorder/tracing.js +70 -5
- package/lib/server/trace/test/inMemorySnapshotter.js +1 -1
- package/lib/server/trace/viewer/traceViewer.js +2 -5
- package/lib/server/webkit/webkit.js +1 -1
- package/lib/server/webkit/wkBrowser.js +6 -5
- package/lib/server/webkit/wkExecutionContext.js +0 -3
- package/lib/server/webkit/wkPage.js +4 -1
- package/lib/utils/happy-eyeballs.js +13 -0
- package/lib/utils/hostPlatform.js +2 -2
- package/lib/utils/httpServer.js +1 -0
- package/lib/utils/isomorphic/locatorGenerators.js +9 -18
- package/lib/utils/isomorphic/locatorParser.js +2 -2
- package/lib/utils/isomorphic/recorderUtils.js +195 -0
- package/lib/vite/htmlReport/index.html +12 -12
- package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +24 -0
- package/lib/vite/recorder/assets/{index-B-MT5gKo.css → index-BW-aOBcL.css} +1 -1
- package/lib/vite/recorder/assets/{index-D-5S5PPN.js → index-Bxxcmxlu.js} +10 -15
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-BTYWvxEC.js +16437 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-BdBhzV6t.js +16443 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-BqcXH1AO.js +16838 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-CcviAl53.js +16831 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DZoSgqUd.js +24 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DblsdhjA.js +16449 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-DtXZtbmO.js +16437 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +16449 -0
- package/lib/vite/{recorder/assets/codeMirrorModule-C-fQ5QZD.js → traceViewer/assets/codeMirrorModule-MzSmL4X2.js} +1 -1
- package/lib/vite/traceViewer/assets/codeMirrorModule-U6XMqGkV.js +16437 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-lDjkI8Ax.js +24 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BABZNwlH.js +17351 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BB2Bm-wy.js +17361 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BHcfR9dD.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BPzVEZSf.js +17351 -0
- package/lib/vite/traceViewer/assets/inspectorTab-BPzhNk9r.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-C_OTuI8x.js +17361 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DOc4D3cX.js +17361 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +64 -0
- package/lib/vite/traceViewer/assets/inspectorTab-DpvLVMq5.js +17351 -0
- package/lib/vite/traceViewer/assets/workbench-B13nfocr.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-BcgGQnKb.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-BwodYCgl.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-ByyWxoT8.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-CWtpwfKK.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-Crj6jzdv.js +19119 -0
- package/lib/vite/traceViewer/assets/workbench-DLv_q9ji.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-DZqNXdoV.js +9 -0
- package/lib/vite/traceViewer/assets/workbench-DhqI6jeL.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-I4s6sWjN.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-M-Dh_RgU.js +1473 -0
- package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +72 -0
- package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +9 -0
- package/lib/vite/traceViewer/assets/xtermModule-DZP0glxx.js +5982 -0
- package/lib/vite/traceViewer/embedded.27BGR_eD.js +105 -0
- package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +104 -0
- package/lib/vite/traceViewer/embedded.BIubxTi3.js +2 -0
- package/lib/vite/traceViewer/embedded.CHH7D63q.js +106 -0
- package/lib/vite/traceViewer/embedded.CorI3dFX.js +104 -0
- package/lib/vite/traceViewer/embedded.D4lqGydT.js +2 -0
- package/lib/vite/traceViewer/embedded.DTjd2aiy.js +105 -0
- package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +2 -0
- package/lib/vite/traceViewer/embedded.Dxe2heQk.js +2 -0
- package/lib/vite/traceViewer/embedded.SsjKHrxC.js +105 -0
- package/lib/vite/traceViewer/embedded.Zu332ZC1.js +106 -0
- package/lib/vite/traceViewer/embedded.f-PLGsBT.js +2 -0
- package/lib/vite/traceViewer/embedded.html +5 -3
- package/lib/vite/traceViewer/embedded.ymLJ2mBS.js +106 -0
- package/lib/vite/traceViewer/index.B7aiTMfZ.js +2 -0
- package/lib/vite/traceViewer/index.BSak5QT9.js +2 -0
- package/lib/vite/traceViewer/index.Bfh46hDK.js +197 -0
- package/lib/vite/traceViewer/index.BrT2kfuc.js +2 -0
- package/lib/vite/traceViewer/index.C8ZWP1Qw.js +197 -0
- package/lib/vite/traceViewer/index.CB297BuW.js +2 -0
- package/lib/vite/traceViewer/index.CLxsp2W_.js +197 -0
- package/lib/vite/traceViewer/index.DPD22sZn.js +2 -0
- package/lib/vite/traceViewer/index.DkRbtWVo.js +195 -0
- package/lib/vite/traceViewer/index.DsjmhbB6.js +195 -0
- package/lib/vite/traceViewer/index.Dz3icWJV.js +196 -0
- package/lib/vite/traceViewer/index.PqcsvBxQ.js +196 -0
- package/lib/vite/traceViewer/index.html +5 -3
- package/lib/vite/traceViewer/index.yxAwzeWG.js +196 -0
- package/lib/vite/traceViewer/inspectorTab.DGJWXOSd.css +3145 -0
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
- package/lib/vite/traceViewer/recorder.7Wl6HrQl.js +550 -0
- package/lib/vite/traceViewer/recorder.BHq8OXiu.js +551 -0
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.BaRuS6Pc.js +2 -0
- package/lib/vite/traceViewer/recorder.BufKu9Hp.js +550 -0
- package/lib/vite/traceViewer/recorder.C88JDknq.js +2 -0
- package/lib/vite/traceViewer/recorder.Ch-WHviK.js +2 -0
- package/lib/vite/traceViewer/recorder.DBDpiNOK.css +15 -0
- package/lib/vite/traceViewer/recorder.Fwf59ZKh.js +551 -0
- package/lib/vite/traceViewer/recorder.POd-toIn.js +2 -0
- package/lib/vite/traceViewer/recorder.am-MV-DQ.js +550 -0
- package/lib/vite/traceViewer/recorder.html +17 -0
- package/lib/vite/traceViewer/recorder.zV_xPHM4.js +551 -0
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.2tr9k625.js +5 -0
- package/lib/vite/traceViewer/uiMode.B11wexdJ.js +5 -0
- package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +5 -0
- package/lib/vite/traceViewer/uiMode.BH2Nj2h0.js +1724 -0
- package/lib/vite/traceViewer/uiMode.BZoFj6zV.js +1723 -0
- package/lib/vite/traceViewer/uiMode.C4nbcio6.js +1730 -0
- package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
- package/lib/vite/traceViewer/uiMode.CBRJkC_K.js +1724 -0
- package/lib/vite/traceViewer/uiMode.CpC2B27N.js +1724 -0
- package/lib/vite/traceViewer/uiMode.DRmgrHSk.css +1462 -0
- package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +5 -0
- package/lib/vite/traceViewer/uiMode.Dlo9s_YX.js +1723 -0
- package/lib/vite/traceViewer/uiMode.O07awP3T.js +10 -0
- package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +1730 -0
- package/lib/vite/traceViewer/uiMode.html +6 -4
- package/lib/vite/traceViewer/uiMode.wsGnVMQK.js +1723 -0
- package/lib/vite/traceViewer/workbench.9Es1K_T7.css +549 -0
- package/lib/vite/traceViewer/workbench.BQNDbcQ0.css +550 -0
- package/lib/vite/traceViewer/workbench.DjbIuxix.css +1 -0
- package/lib/vite/traceViewer/workbench.DlsCx8k5.css +1 -0
- package/lib/vite/traceViewer/workbench.wuxQoE2z.css +3703 -0
- package/package.json +1 -1
- package/types/protocol.d.ts +610 -173
- package/types/types.d.ts +2037 -949
|
@@ -156,12 +156,22 @@ class HarTracer {
|
|
|
156
156
|
if (this._started) this._delegate.onEntryStarted(harEntry);
|
|
157
157
|
}
|
|
158
158
|
_onAPIRequestFinished(event) {
|
|
159
|
+
var _event$body$length, _event$body;
|
|
159
160
|
const harEntry = this._entryForRequest(event.requestEvent);
|
|
160
161
|
if (!harEntry) return;
|
|
161
162
|
harEntry.response.status = event.statusCode;
|
|
162
163
|
harEntry.response.statusText = event.statusMessage;
|
|
163
164
|
harEntry.response.httpVersion = event.httpVersion;
|
|
164
165
|
harEntry.response.redirectURL = event.headers.location || '';
|
|
166
|
+
if (!this._options.omitServerIP) {
|
|
167
|
+
harEntry.serverIPAddress = event.serverIPAddress;
|
|
168
|
+
harEntry._serverPort = event.serverPort;
|
|
169
|
+
}
|
|
170
|
+
if (!this._options.omitTiming) {
|
|
171
|
+
harEntry.timings = event.timings;
|
|
172
|
+
this._computeHarEntryTotalTime(harEntry);
|
|
173
|
+
}
|
|
174
|
+
if (!this._options.omitSecurityDetails) harEntry._securityDetails = event.securityDetails;
|
|
165
175
|
for (let i = 0; i < event.rawHeaders.length; i += 2) {
|
|
166
176
|
harEntry.response.headers.push({
|
|
167
177
|
name: event.rawHeaders[i],
|
|
@@ -178,6 +188,7 @@ class HarTracer {
|
|
|
178
188
|
const contentType = event.headers['content-type'];
|
|
179
189
|
if (contentType) content.mimeType = contentType;
|
|
180
190
|
this._storeResponseContent(event.body, content, 'other');
|
|
191
|
+
if (!this._options.omitSizes) harEntry.response.bodySize = (_event$body$length = (_event$body = event.body) === null || _event$body === void 0 ? void 0 : _event$body.length) !== null && _event$body$length !== void 0 ? _event$body$length : 0;
|
|
181
192
|
if (this._started) this._delegate.onEntryFinished(harEntry);
|
|
182
193
|
}
|
|
183
194
|
_onRequest(request) {
|
package/lib/server/input.js
CHANGED
package/lib/server/javascript.js
CHANGED
|
@@ -85,9 +85,6 @@ class ExecutionContext extends _instrumentation.SdkObject {
|
|
|
85
85
|
}
|
|
86
86
|
return this._utilityScriptPromise;
|
|
87
87
|
}
|
|
88
|
-
async objectCount(objectId) {
|
|
89
|
-
return this._delegate.objectCount(objectId);
|
|
90
|
-
}
|
|
91
88
|
async doSlowMo() {
|
|
92
89
|
// overridden in FrameExecutionContext
|
|
93
90
|
}
|
|
@@ -189,10 +186,6 @@ class JSHandle extends _instrumentation.SdkObject {
|
|
|
189
186
|
this._preview = preview;
|
|
190
187
|
if (this._previewCallback) this._previewCallback(preview);
|
|
191
188
|
}
|
|
192
|
-
async objectCount() {
|
|
193
|
-
if (!this._objectId) throw new Error('Can only count objects for a handle that points to the constructor prototype');
|
|
194
|
-
return this._context.objectCount(this._objectId);
|
|
195
|
-
}
|
|
196
189
|
}
|
|
197
190
|
exports.JSHandle = JSHandle;
|
|
198
191
|
async function evaluate(context, returnByValue, pageFunction, ...args) {
|
package/lib/server/page.js
CHANGED
|
@@ -285,6 +285,9 @@ class Page extends _instrumentation.SdkObject {
|
|
|
285
285
|
return response;
|
|
286
286
|
}), this._timeoutSettings.navigationTimeout(options));
|
|
287
287
|
}
|
|
288
|
+
requestGC() {
|
|
289
|
+
return this._delegate.requestGC();
|
|
290
|
+
}
|
|
288
291
|
registerLocatorHandler(selector, noWaitAfter) {
|
|
289
292
|
const uid = ++this._lastLocatorHandlerUid;
|
|
290
293
|
this._locatorHandlers.set(uid, {
|
|
@@ -324,7 +327,7 @@ class Page extends _instrumentation.SdkObject {
|
|
|
324
327
|
progress.throwIfAborted();
|
|
325
328
|
if (!handler.noWaitAfter) {
|
|
326
329
|
progress.log(` locator handler has finished, waiting for ${(0, _utils.asLocator)(this.attribution.playwright.options.sdkLanguage, handler.selector)} to be hidden`);
|
|
327
|
-
await this.mainFrame().waitForSelectorInternal(progress, handler.selector, {
|
|
330
|
+
await this.mainFrame().waitForSelectorInternal(progress, handler.selector, false, {
|
|
328
331
|
state: 'hidden'
|
|
329
332
|
});
|
|
330
333
|
} else {
|
|
@@ -668,6 +671,7 @@ class PageBinding {
|
|
|
668
671
|
context: page._browserContext
|
|
669
672
|
}, handle);
|
|
670
673
|
} else {
|
|
674
|
+
if (!Array.isArray(serializedArgs)) throw new Error(`serializedArgs is not an array. This can happen when Array.prototype.toJSON is defined incorrectly`);
|
|
671
675
|
const args = serializedArgs.map(a => (0, _utilityScriptSerializers.parseEvaluationResultValue)(a));
|
|
672
676
|
result = await binding.playwrightFunction({
|
|
673
677
|
frame: context.frame,
|
package/lib/server/playwright.js
CHANGED
|
@@ -15,6 +15,7 @@ var _webkit = require("./webkit/webkit");
|
|
|
15
15
|
var _instrumentation = require("./instrumentation");
|
|
16
16
|
var _utils = require("../utils");
|
|
17
17
|
var _debugController = require("./debugController");
|
|
18
|
+
var _bidiChromium = require("./bidi/bidiChromium");
|
|
18
19
|
var _bidiFirefox = require("./bidi/bidiFirefox");
|
|
19
20
|
/**
|
|
20
21
|
* Copyright (c) Microsoft Corporation.
|
|
@@ -42,9 +43,10 @@ class Playwright extends _instrumentation.SdkObject {
|
|
|
42
43
|
this.chromium = void 0;
|
|
43
44
|
this.android = void 0;
|
|
44
45
|
this.electron = void 0;
|
|
45
|
-
this.bidi = void 0;
|
|
46
46
|
this.firefox = void 0;
|
|
47
47
|
this.webkit = void 0;
|
|
48
|
+
this.bidiChromium = void 0;
|
|
49
|
+
this.bidiFirefox = void 0;
|
|
48
50
|
this.options = void 0;
|
|
49
51
|
this.debugController = void 0;
|
|
50
52
|
this._allPages = new Set();
|
|
@@ -61,7 +63,8 @@ class Playwright extends _instrumentation.SdkObject {
|
|
|
61
63
|
}
|
|
62
64
|
}, null);
|
|
63
65
|
this.chromium = new _chromium.Chromium(this);
|
|
64
|
-
this.
|
|
66
|
+
this.bidiChromium = new _bidiChromium.BidiChromium(this);
|
|
67
|
+
this.bidiFirefox = new _bidiFirefox.BidiFirefox(this);
|
|
65
68
|
this.firefox = new _firefox.Firefox(this);
|
|
66
69
|
this.webkit = new _webkit.WebKit(this);
|
|
67
70
|
this.electron = new _electron.Electron(this);
|
|
@@ -6,14 +6,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.ContextRecorder = void 0;
|
|
7
7
|
exports.generateFrameSelector = generateFrameSelector;
|
|
8
8
|
var _events = require("events");
|
|
9
|
-
var recorderSource = _interopRequireWildcard(require("../../generated/
|
|
9
|
+
var recorderSource = _interopRequireWildcard(require("../../generated/pollingRecorderSource"));
|
|
10
10
|
var _utils = require("../../utils");
|
|
11
11
|
var _timeoutRunner = require("../../utils/timeoutRunner");
|
|
12
12
|
var _browserContext = require("../browserContext");
|
|
13
13
|
var _languages = require("../codegen/languages");
|
|
14
14
|
var _frames = require("../frames");
|
|
15
15
|
var _page = require("../page");
|
|
16
|
-
var _recorderRunner = require("./recorderRunner");
|
|
17
16
|
var _throttledFile = require("./throttledFile");
|
|
18
17
|
var _recorderCollection = require("./recorderCollection");
|
|
19
18
|
var _language = require("../codegen/language");
|
|
@@ -36,14 +35,13 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
36
35
|
*/
|
|
37
36
|
|
|
38
37
|
class ContextRecorder extends _events.EventEmitter {
|
|
39
|
-
constructor(context, params, delegate) {
|
|
38
|
+
constructor(codegenMode, context, params, delegate) {
|
|
40
39
|
super();
|
|
41
40
|
this._collection = void 0;
|
|
42
41
|
this._pageAliases = new Map();
|
|
43
42
|
this._lastPopupOrdinal = 0;
|
|
44
43
|
this._lastDialogOrdinal = -1;
|
|
45
44
|
this._lastDownloadOrdinal = -1;
|
|
46
|
-
this._timers = new Set();
|
|
47
45
|
this._context = void 0;
|
|
48
46
|
this._params = void 0;
|
|
49
47
|
this._delegate = void 0;
|
|
@@ -51,6 +49,8 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
51
49
|
this._throttledOutputFile = null;
|
|
52
50
|
this._orderedLanguages = [];
|
|
53
51
|
this._listeners = [];
|
|
52
|
+
this._codegenMode = void 0;
|
|
53
|
+
this._codegenMode = codegenMode;
|
|
54
54
|
this._context = context;
|
|
55
55
|
this._params = params;
|
|
56
56
|
this._delegate = delegate;
|
|
@@ -63,7 +63,8 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
63
63
|
browserName: context._browser.options.name,
|
|
64
64
|
launchOptions: {
|
|
65
65
|
headless: false,
|
|
66
|
-
...params.launchOptions
|
|
66
|
+
...params.launchOptions,
|
|
67
|
+
tracesDir: undefined
|
|
67
68
|
},
|
|
68
69
|
contextOptions: {
|
|
69
70
|
...params.contextOptions
|
|
@@ -71,8 +72,8 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
71
72
|
deviceName: params.device,
|
|
72
73
|
saveStorage: params.saveStorage
|
|
73
74
|
};
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
this._collection = new _recorderCollection.RecorderCollection(this._pageAliases);
|
|
76
|
+
this._collection.on('change', actions => {
|
|
76
77
|
this._recorderSources = [];
|
|
77
78
|
for (const languageGenerator of this._orderedLanguages) {
|
|
78
79
|
var _this$_throttledOutpu;
|
|
@@ -81,7 +82,7 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
81
82
|
footer,
|
|
82
83
|
actionTexts,
|
|
83
84
|
text
|
|
84
|
-
} = (0, _language.generateCode)(
|
|
85
|
+
} = (0, _language.generateCode)(actions, languageGenerator, languageGeneratorOptions);
|
|
85
86
|
const source = {
|
|
86
87
|
isRecorded: true,
|
|
87
88
|
label: languageGenerator.name,
|
|
@@ -100,7 +101,7 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
100
101
|
}
|
|
101
102
|
this.emit(ContextRecorder.Events.Change, {
|
|
102
103
|
sources: this._recorderSources,
|
|
103
|
-
|
|
104
|
+
actions
|
|
104
105
|
});
|
|
105
106
|
});
|
|
106
107
|
context.on(_browserContext.BrowserContext.Events.BeforeClose, () => {
|
|
@@ -111,7 +112,7 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
111
112
|
var _this$_throttledOutpu3;
|
|
112
113
|
(_this$_throttledOutpu3 = this._throttledOutputFile) === null || _this$_throttledOutpu3 === void 0 || _this$_throttledOutpu3.flush();
|
|
113
114
|
}));
|
|
114
|
-
this.
|
|
115
|
+
this.setEnabled(true);
|
|
115
116
|
}
|
|
116
117
|
setOutput(codegenId, outputFile) {
|
|
117
118
|
var _this$_collection;
|
|
@@ -144,23 +145,29 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
144
145
|
}
|
|
145
146
|
setEnabled(enabled) {
|
|
146
147
|
this._collection.setEnabled(enabled);
|
|
148
|
+
if (this._codegenMode === 'trace-events') {
|
|
149
|
+
if (enabled) this._context.tracing.startChunk({
|
|
150
|
+
name: 'trace',
|
|
151
|
+
title: 'trace'
|
|
152
|
+
}).catch(() => {});else this._context.tracing.stopChunk({
|
|
153
|
+
mode: 'discard'
|
|
154
|
+
}).catch(() => {});
|
|
155
|
+
}
|
|
147
156
|
}
|
|
148
157
|
dispose() {
|
|
149
|
-
for (const timer of this._timers) clearTimeout(timer);
|
|
150
|
-
this._timers.clear();
|
|
151
158
|
_utils.eventsHelper.removeEventListeners(this._listeners);
|
|
152
159
|
}
|
|
153
160
|
async _onPage(page) {
|
|
154
161
|
// First page is called page, others are called popup1, popup2, etc.
|
|
155
162
|
const frame = page.mainFrame();
|
|
156
163
|
page.on('close', () => {
|
|
157
|
-
this._collection.
|
|
164
|
+
this._collection.addRecordedAction({
|
|
158
165
|
frame: this._describeMainFrame(page),
|
|
159
|
-
committed: true,
|
|
160
166
|
action: {
|
|
161
167
|
name: 'closePage',
|
|
162
168
|
signals: []
|
|
163
|
-
}
|
|
169
|
+
},
|
|
170
|
+
startTime: (0, _utils.monotonicTime)()
|
|
164
171
|
});
|
|
165
172
|
this._pageAliases.delete(page);
|
|
166
173
|
});
|
|
@@ -174,14 +181,14 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
174
181
|
if (page.opener()) {
|
|
175
182
|
this._onPopup(page.opener(), page);
|
|
176
183
|
} else {
|
|
177
|
-
this._collection.
|
|
184
|
+
this._collection.addRecordedAction({
|
|
178
185
|
frame: this._describeMainFrame(page),
|
|
179
|
-
committed: true,
|
|
180
186
|
action: {
|
|
181
187
|
name: 'openPage',
|
|
182
188
|
url: page.mainFrame().url(),
|
|
183
189
|
signals: []
|
|
184
|
-
}
|
|
190
|
+
},
|
|
191
|
+
startTime: (0, _utils.monotonicTime)()
|
|
185
192
|
});
|
|
186
193
|
}
|
|
187
194
|
}
|
|
@@ -206,47 +213,23 @@ class ContextRecorder extends _events.EventEmitter {
|
|
|
206
213
|
testIdAttributeName() {
|
|
207
214
|
return this._params.testIdAttributeName || this._context.selectors().testIdAttributeName() || 'data-testid';
|
|
208
215
|
}
|
|
209
|
-
async
|
|
216
|
+
async _createActionInContext(frame, action) {
|
|
210
217
|
var _this$_delegate$rewri, _this$_delegate;
|
|
211
|
-
// Commit last action so that no further signals are added to it.
|
|
212
|
-
this._collection.commitLastAction();
|
|
213
218
|
const frameDescription = await this._describeFrame(frame);
|
|
214
219
|
const actionInContext = {
|
|
215
220
|
frame: frameDescription,
|
|
216
221
|
action,
|
|
217
|
-
description: undefined
|
|
222
|
+
description: undefined,
|
|
223
|
+
startTime: (0, _utils.monotonicTime)()
|
|
218
224
|
};
|
|
219
225
|
await ((_this$_delegate$rewri = (_this$_delegate = this._delegate).rewriteActionInContext) === null || _this$_delegate$rewri === void 0 ? void 0 : _this$_delegate$rewri.call(_this$_delegate, this._pageAliases, actionInContext));
|
|
220
|
-
|
|
221
|
-
const success = await (0, _recorderRunner.performAction)(this._pageAliases, actionInContext);
|
|
222
|
-
if (success) {
|
|
223
|
-
this._collection.didPerformAction(actionInContext);
|
|
224
|
-
this._setCommittedAfterTimeout(actionInContext);
|
|
225
|
-
} else {
|
|
226
|
-
this._collection.performedActionFailed(actionInContext);
|
|
227
|
-
}
|
|
226
|
+
return actionInContext;
|
|
228
227
|
}
|
|
229
|
-
async
|
|
230
|
-
|
|
231
|
-
// Commit last action so that no further signals are added to it.
|
|
232
|
-
this._collection.commitLastAction();
|
|
233
|
-
const frameDescription = await this._describeFrame(frame);
|
|
234
|
-
const actionInContext = {
|
|
235
|
-
frame: frameDescription,
|
|
236
|
-
action,
|
|
237
|
-
description: undefined
|
|
238
|
-
};
|
|
239
|
-
await ((_this$_delegate$rewri2 = (_this$_delegate2 = this._delegate).rewriteActionInContext) === null || _this$_delegate$rewri2 === void 0 ? void 0 : _this$_delegate$rewri2.call(_this$_delegate2, this._pageAliases, actionInContext));
|
|
240
|
-
this._setCommittedAfterTimeout(actionInContext);
|
|
241
|
-
this._collection.addAction(actionInContext);
|
|
228
|
+
async _performAction(frame, action) {
|
|
229
|
+
await this._collection.performAction(await this._createActionInContext(frame, action));
|
|
242
230
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
// Commit the action after 5 seconds so that no further signals are added to it.
|
|
246
|
-
actionInContext.committed = true;
|
|
247
|
-
this._timers.delete(timer);
|
|
248
|
-
}, (0, _utils.isUnderTest)() ? 500 : 5000);
|
|
249
|
-
this._timers.add(timer);
|
|
231
|
+
async _recordAction(frame, action) {
|
|
232
|
+
this._collection.addRecordedAction(await this._createActionInContext(frame, action));
|
|
250
233
|
}
|
|
251
234
|
_onFrameNavigated(frame, page) {
|
|
252
235
|
const pageAlias = this._pageAliases.get(page);
|
|
@@ -30,25 +30,30 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
32
|
class EmptyRecorderApp extends _events.EventEmitter {
|
|
33
|
+
constructor(...args) {
|
|
34
|
+
super(...args);
|
|
35
|
+
this.wsEndpointForTest = void 0;
|
|
36
|
+
}
|
|
33
37
|
async close() {}
|
|
34
38
|
async setPaused(paused) {}
|
|
35
39
|
async setMode(mode) {}
|
|
36
|
-
async
|
|
40
|
+
async setRunningFile(file) {}
|
|
37
41
|
async setSelector(selector, userGesture) {}
|
|
38
42
|
async updateCallLogs(callLogs) {}
|
|
39
43
|
async setSources(sources) {}
|
|
44
|
+
async setActions(actions, sources) {}
|
|
40
45
|
}
|
|
41
46
|
exports.EmptyRecorderApp = EmptyRecorderApp;
|
|
42
47
|
class RecorderApp extends _events.EventEmitter {
|
|
43
48
|
constructor(recorder, page, wsEndpoint) {
|
|
44
49
|
super();
|
|
45
50
|
this._page = void 0;
|
|
46
|
-
this.
|
|
51
|
+
this.wsEndpointForTest = void 0;
|
|
47
52
|
this._recorder = void 0;
|
|
48
53
|
this.setMaxListeners(0);
|
|
49
54
|
this._recorder = recorder;
|
|
50
55
|
this._page = page;
|
|
51
|
-
this.
|
|
56
|
+
this.wsEndpointForTest = wsEndpoint;
|
|
52
57
|
}
|
|
53
58
|
async close() {
|
|
54
59
|
await this._page.context().close({
|
|
@@ -63,7 +68,6 @@ class RecorderApp extends _events.EventEmitter {
|
|
|
63
68
|
const file = require.resolve('../../vite/recorder/' + uri);
|
|
64
69
|
_fs.default.promises.readFile(file).then(buffer => {
|
|
65
70
|
route.fulfill({
|
|
66
|
-
requestUrl: route.request().url(),
|
|
67
71
|
status: 200,
|
|
68
72
|
headers: [{
|
|
69
73
|
name: 'Content-Type',
|
|
@@ -114,9 +118,8 @@ class RecorderApp extends _events.EventEmitter {
|
|
|
114
118
|
persistentContextOptions: {
|
|
115
119
|
noDefaultViewport: true,
|
|
116
120
|
headless: !!process.env.PWTEST_CLI_HEADLESS || (0, _utils.isUnderTest)() && !headed,
|
|
117
|
-
useWebSocket:
|
|
118
|
-
handleSIGINT:
|
|
119
|
-
args: process.env.PWTEST_RECORDER_PORT ? [`--remote-debugging-port=${process.env.PWTEST_RECORDER_PORT}`] : [],
|
|
121
|
+
useWebSocket: (0, _utils.isUnderTest)(),
|
|
122
|
+
handleSIGINT: recorder.handleSIGINT,
|
|
120
123
|
executablePath: inspectedContext._browser.options.isChromium ? inspectedContext._browser.options.customExecutablePath : undefined
|
|
121
124
|
}
|
|
122
125
|
});
|
|
@@ -135,9 +138,9 @@ class RecorderApp extends _events.EventEmitter {
|
|
|
135
138
|
isFunction: true
|
|
136
139
|
}, mode).catch(() => {});
|
|
137
140
|
}
|
|
138
|
-
async
|
|
141
|
+
async setRunningFile(file) {
|
|
139
142
|
await this._page.mainFrame().evaluateExpression((file => {
|
|
140
|
-
window.
|
|
143
|
+
window.playwrightSetRunningFile(file);
|
|
141
144
|
}).toString(), {
|
|
142
145
|
isFunction: true
|
|
143
146
|
}, file).catch(() => {});
|
|
@@ -157,8 +160,11 @@ class RecorderApp extends _events.EventEmitter {
|
|
|
157
160
|
}, sources).catch(() => {});
|
|
158
161
|
|
|
159
162
|
// Testing harness for runCLI mode.
|
|
160
|
-
if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length)
|
|
163
|
+
if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
|
|
164
|
+
if (process._didSetSourcesForTest(sources[0].text)) this.close();
|
|
165
|
+
}
|
|
161
166
|
}
|
|
167
|
+
async setActions(actions, sources) {}
|
|
162
168
|
async setSelector(selector, userGesture) {
|
|
163
169
|
if (userGesture) {
|
|
164
170
|
var _this$_recorder;
|
|
@@ -5,6 +5,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.RecorderCollection = void 0;
|
|
7
7
|
var _events = require("events");
|
|
8
|
+
var _time = require("../../utils/time");
|
|
9
|
+
var _recorderUtils = require("./recorderUtils");
|
|
10
|
+
var _errors = require("../errors");
|
|
11
|
+
var _recorderRunner = require("./recorderRunner");
|
|
12
|
+
var _debug = require("../../utils/debug");
|
|
8
13
|
/**
|
|
9
14
|
* Copyright (c) Microsoft Corporation.
|
|
10
15
|
*
|
|
@@ -22,106 +27,90 @@ var _events = require("events");
|
|
|
22
27
|
*/
|
|
23
28
|
|
|
24
29
|
class RecorderCollection extends _events.EventEmitter {
|
|
25
|
-
constructor(
|
|
30
|
+
constructor(pageAliases) {
|
|
26
31
|
super();
|
|
27
|
-
this._currentAction = null;
|
|
28
|
-
this._lastAction = null;
|
|
29
32
|
this._actions = [];
|
|
30
|
-
this._enabled =
|
|
31
|
-
this.
|
|
32
|
-
this.
|
|
33
|
+
this._enabled = false;
|
|
34
|
+
this._pageAliases = void 0;
|
|
35
|
+
this._pageAliases = pageAliases;
|
|
33
36
|
}
|
|
34
37
|
restart() {
|
|
35
|
-
this._currentAction = null;
|
|
36
|
-
this._lastAction = null;
|
|
37
38
|
this._actions = [];
|
|
38
|
-
this.
|
|
39
|
-
}
|
|
40
|
-
actions() {
|
|
41
|
-
return this._actions;
|
|
39
|
+
this._fireChange();
|
|
42
40
|
}
|
|
43
41
|
setEnabled(enabled) {
|
|
44
42
|
this._enabled = enabled;
|
|
45
43
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
willPerformAction(action) {
|
|
52
|
-
if (!this._enabled) return;
|
|
53
|
-
this._currentAction = action;
|
|
44
|
+
async performAction(actionInContext) {
|
|
45
|
+
await this._addAction(actionInContext, async callMetadata => {
|
|
46
|
+
await (0, _recorderRunner.performAction)(callMetadata, this._pageAliases, actionInContext);
|
|
47
|
+
});
|
|
54
48
|
}
|
|
55
|
-
|
|
56
|
-
if (
|
|
57
|
-
|
|
49
|
+
addRecordedAction(actionInContext) {
|
|
50
|
+
if (['openPage', 'closePage'].includes(actionInContext.action.name)) {
|
|
51
|
+
this._actions.push(actionInContext);
|
|
52
|
+
this._fireChange();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this._addAction(actionInContext).catch(() => {});
|
|
58
56
|
}
|
|
59
|
-
|
|
57
|
+
async _addAction(actionInContext, callback) {
|
|
60
58
|
if (!this._enabled) return;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// We augment last action based on the type.
|
|
66
|
-
if (this._lastAction && action.name === 'fill' && lastAction.name === 'fill') {
|
|
67
|
-
if (action.selector === lastAction.selector) eraseLastAction = true;
|
|
68
|
-
}
|
|
69
|
-
if (lastAction && action.name === 'click' && lastAction.name === 'click') {
|
|
70
|
-
if (action.selector === lastAction.selector && action.clickCount > lastAction.clickCount) eraseLastAction = true;
|
|
71
|
-
}
|
|
72
|
-
if (lastAction && action.name === 'navigate' && lastAction.name === 'navigate') {
|
|
73
|
-
if (action.url === lastAction.url) {
|
|
74
|
-
// Already at a target URL.
|
|
75
|
-
this._currentAction = null;
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Check and uncheck erase click.
|
|
80
|
-
if (lastAction && (action.name === 'check' || action.name === 'uncheck') && lastAction.name === 'click') {
|
|
81
|
-
if (action.selector === lastAction.selector) eraseLastAction = true;
|
|
82
|
-
}
|
|
59
|
+
if (actionInContext.action.name === 'openPage' || actionInContext.action.name === 'closePage') {
|
|
60
|
+
this._actions.push(actionInContext);
|
|
61
|
+
this._fireChange();
|
|
62
|
+
return;
|
|
83
63
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
64
|
+
const {
|
|
65
|
+
callMetadata,
|
|
66
|
+
mainFrame
|
|
67
|
+
} = (0, _recorderUtils.callMetadataForAction)(this._pageAliases, actionInContext);
|
|
68
|
+
await mainFrame.instrumentation.onBeforeCall(mainFrame, callMetadata);
|
|
87
69
|
this._actions.push(actionInContext);
|
|
88
|
-
this.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
70
|
+
this._fireChange();
|
|
71
|
+
const error = await (callback === null || callback === void 0 ? void 0 : callback(callMetadata).catch(e => e));
|
|
72
|
+
callMetadata.endTime = (0, _time.monotonicTime)();
|
|
73
|
+
actionInContext.endTime = callMetadata.endTime;
|
|
74
|
+
callMetadata.error = error ? (0, _errors.serializeError)(error) : undefined;
|
|
75
|
+
// Do not wait for onAfterCall so that performAction returned immediately after the action.
|
|
76
|
+
mainFrame.instrumentation.onAfterCall(mainFrame, callMetadata).then(() => {
|
|
77
|
+
this._fireChange();
|
|
78
|
+
}).catch(() => {});
|
|
94
79
|
}
|
|
95
80
|
signal(pageAlias, frame, signal) {
|
|
96
81
|
if (!this._enabled) return;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
82
|
+
if (signal.name === 'navigation' && frame._page.mainFrame() === frame) {
|
|
83
|
+
const timestamp = (0, _time.monotonicTime)();
|
|
84
|
+
const lastAction = this._actions[this._actions.length - 1];
|
|
85
|
+
const signalThreshold = (0, _debug.isUnderTest)() ? 500 : 5000;
|
|
86
|
+
let generateGoto = false;
|
|
87
|
+
if (!lastAction) generateGoto = true;else if (lastAction.action.name !== 'click' && lastAction.action.name !== 'press') generateGoto = true;else if (timestamp - lastAction.startTime > signalThreshold) generateGoto = true;
|
|
88
|
+
if (generateGoto) {
|
|
89
|
+
this.addRecordedAction({
|
|
90
|
+
frame: {
|
|
91
|
+
pageAlias,
|
|
92
|
+
framePath: []
|
|
93
|
+
},
|
|
94
|
+
action: {
|
|
95
|
+
name: 'navigate',
|
|
96
|
+
url: frame.url(),
|
|
97
|
+
signals: []
|
|
98
|
+
},
|
|
99
|
+
startTime: timestamp,
|
|
100
|
+
endTime: timestamp
|
|
101
|
+
});
|
|
102
|
+
}
|
|
101
103
|
return;
|
|
102
104
|
}
|
|
103
|
-
if (this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (signal.name === 'download' && signals.length && signals[signals.length - 1].name === 'navigation') signals.length = signals.length - 1;
|
|
107
|
-
this._lastAction.action.signals.push(signal);
|
|
108
|
-
this.emit('change');
|
|
105
|
+
if (this._actions.length) {
|
|
106
|
+
this._actions[this._actions.length - 1].action.signals.push(signal);
|
|
107
|
+
this._fireChange();
|
|
109
108
|
return;
|
|
110
109
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
framePath: []
|
|
116
|
-
},
|
|
117
|
-
committed: true,
|
|
118
|
-
action: {
|
|
119
|
-
name: 'navigate',
|
|
120
|
-
url: frame.url(),
|
|
121
|
-
signals: []
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
110
|
+
}
|
|
111
|
+
_fireChange() {
|
|
112
|
+
if (!this._enabled) return;
|
|
113
|
+
this.emit('change', (0, _recorderUtils.collapseActions)(this._actions));
|
|
125
114
|
}
|
|
126
115
|
}
|
|
127
116
|
exports.RecorderCollection = RecorderCollection;
|