@checkly/playwright-core 1.48.22 → 1.51.11-beta.2
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 +60 -48
- package/bin/reinstall_chrome_beta_linux.sh +10 -8
- package/bin/reinstall_chrome_stable_linux.sh +10 -8
- package/bin/reinstall_msedge_beta_linux.sh +17 -9
- package/bin/reinstall_msedge_dev_linux.sh +17 -9
- package/bin/reinstall_msedge_stable_linux.sh +17 -9
- package/browsers.json +33 -12
- package/index.js +0 -1
- package/lib/androidServerImpl.js +5 -5
- package/lib/browserServerImpl.js +18 -9
- package/lib/checkly/secretsFilter.js +1 -1
- package/lib/cli/driver.js +6 -6
- package/lib/cli/program.js +38 -43
- package/lib/cli/programWithTestStub.js +2 -1
- package/lib/client/android.js +37 -58
- package/lib/client/artifact.js +4 -7
- package/lib/client/browser.js +10 -15
- package/lib/client/browserContext.js +69 -62
- package/lib/client/browserType.js +30 -64
- package/lib/client/channelOwner.js +53 -68
- package/lib/client/clientHelper.js +4 -6
- package/lib/client/clientInstrumentation.js +2 -0
- package/lib/client/clientStackTrace.js +65 -0
- package/lib/client/connection.js +48 -41
- package/lib/client/consoleMessage.js +4 -7
- package/lib/client/electron.js +10 -10
- package/lib/client/elementHandle.js +32 -33
- package/lib/client/errors.js +2 -2
- package/lib/client/eventEmitter.js +5 -8
- package/lib/client/fetch.js +61 -62
- package/lib/client/fileUtils.js +31 -0
- package/lib/client/frame.js +22 -23
- package/lib/client/harRouter.js +7 -9
- package/lib/client/jsHandle.js +3 -4
- package/lib/client/localUtils.js +24 -0
- package/lib/client/locator.js +27 -13
- package/lib/client/network.js +44 -37
- package/lib/client/page.js +50 -41
- package/lib/client/platform.js +71 -0
- package/lib/client/playwright.js +21 -1
- package/lib/client/selectors.js +8 -2
- package/lib/client/stream.js +2 -21
- package/lib/client/timeoutSettings.js +65 -0
- package/lib/client/tracing.js +29 -7
- package/lib/client/video.js +2 -2
- package/lib/client/waiter.js +19 -16
- package/lib/client/webSocket.js +106 -0
- package/lib/client/worker.js +4 -4
- package/lib/client/writableStream.js +2 -21
- package/lib/generated/consoleApiSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/generated/recorderSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +1 -1
- package/lib/inProcessFactory.js +8 -3
- package/lib/outofprocess.js +12 -8
- package/lib/protocol/debug.js +1 -1
- package/lib/protocol/validator.js +77 -11
- package/lib/protocol/validatorPrimitives.js +1 -2
- package/lib/remote/playwrightConnection.js +21 -12
- package/lib/remote/playwrightServer.js +22 -8
- package/lib/server/android/android.js +17 -14
- package/lib/server/android/backendAdb.js +14 -14
- package/lib/server/artifact.js +3 -3
- package/lib/server/bidi/bidiBrowser.js +11 -8
- package/lib/server/bidi/bidiChromium.js +5 -4
- package/lib/server/bidi/bidiConnection.js +1 -3
- package/lib/server/bidi/bidiExecutionContext.js +71 -25
- package/lib/server/bidi/bidiFirefox.js +4 -3
- package/lib/server/bidi/bidiInput.js +11 -12
- package/lib/server/bidi/bidiNetworkManager.js +11 -12
- package/lib/server/bidi/bidiOverCdp.js +2 -2
- package/lib/server/bidi/bidiPage.js +39 -66
- package/lib/server/bidi/third_party/bidiKeyboard.js +9 -7
- package/lib/server/bidi/third_party/firefoxPrefs.js +19 -3
- package/lib/server/browser.js +2 -2
- package/lib/server/browserContext.js +60 -55
- package/lib/server/browserType.js +22 -18
- package/lib/server/callLog.js +79 -0
- package/lib/server/chromium/chromium.js +20 -16
- package/lib/server/chromium/chromiumSwitches.js +32 -9
- package/lib/server/chromium/crBrowser.js +25 -24
- package/lib/server/chromium/crConnection.js +2 -2
- package/lib/server/chromium/crCoverage.js +1 -1
- package/lib/server/chromium/crDevTools.js +1 -1
- package/lib/server/chromium/crDragDrop.js +1 -1
- package/lib/server/chromium/crExecutionContext.js +26 -35
- package/lib/server/chromium/crInput.js +17 -6
- package/lib/server/chromium/crNetworkManager.js +3 -3
- package/lib/server/chromium/crPage.js +43 -55
- package/lib/server/chromium/crPdf.js +1 -1
- package/lib/server/chromium/crProtocolHelper.js +3 -3
- package/lib/server/chromium/crServiceWorker.js +2 -2
- package/lib/server/chromium/videoRecorder.js +2 -2
- package/lib/server/clock.js +1 -1
- package/lib/server/codegen/csharp.js +21 -16
- package/lib/server/codegen/java.js +17 -9
- package/lib/server/codegen/javascript.js +37 -7
- package/lib/server/codegen/jsonl.js +1 -1
- package/lib/server/codegen/languages.js +2 -2
- package/lib/server/codegen/python.js +14 -17
- package/lib/server/debugController.js +23 -45
- package/lib/server/debugger.js +1 -1
- package/lib/server/deviceDescriptors.js +1 -1
- package/lib/server/deviceDescriptorsSource.json +131 -131
- package/lib/server/dispatchers/androidDispatcher.js +14 -3
- package/lib/server/dispatchers/artifactDispatcher.js +3 -3
- package/lib/server/dispatchers/browserContextDispatcher.js +21 -32
- package/lib/server/dispatchers/browserTypeDispatcher.js +1 -1
- package/lib/server/dispatchers/cdpSessionDispatcher.js +1 -1
- package/lib/server/dispatchers/debugControllerDispatcher.js +5 -3
- package/lib/server/dispatchers/dispatcher.js +27 -25
- package/lib/server/dispatchers/electronDispatcher.js +3 -3
- package/lib/server/dispatchers/elementHandlerDispatcher.js +7 -2
- package/lib/server/dispatchers/frameDispatcher.js +9 -3
- package/lib/server/dispatchers/jsonPipeDispatcher.js +2 -2
- package/lib/server/dispatchers/localUtilsDispatcher.js +25 -291
- package/lib/server/dispatchers/networkDispatchers.js +3 -3
- package/lib/server/dispatchers/pageDispatcher.js +10 -8
- package/lib/server/dispatchers/playwrightDispatcher.js +5 -5
- package/lib/server/dispatchers/streamDispatcher.js +4 -3
- package/lib/server/dispatchers/tracingDispatcher.js +10 -0
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +18 -18
- package/lib/server/dispatchers/writableStreamDispatcher.js +5 -6
- package/lib/server/dom.js +102 -48
- package/lib/server/download.js +1 -1
- package/lib/server/electron/electron.js +17 -16
- package/lib/server/errors.js +1 -1
- package/lib/server/fetch.js +49 -33
- package/lib/server/fileUploadUtils.js +7 -4
- package/lib/server/firefox/ffBrowser.js +17 -9
- package/lib/server/firefox/ffConnection.js +1 -1
- package/lib/server/firefox/ffExecutionContext.js +25 -29
- package/lib/server/firefox/ffInput.js +15 -4
- package/lib/server/firefox/ffNetworkManager.js +3 -3
- package/lib/server/firefox/ffPage.js +29 -50
- package/lib/server/firefox/firefox.js +7 -9
- package/lib/server/frameSelectors.js +1 -1
- package/lib/server/frames.js +65 -55
- package/lib/server/har/harRecorder.js +4 -4
- package/lib/server/har/harTracer.js +8 -9
- package/lib/server/harBackend.js +157 -0
- package/lib/server/helper.js +2 -2
- package/lib/server/index.js +1 -14
- package/lib/server/input.js +3 -4
- package/lib/server/instrumentation.js +2 -2
- package/lib/server/isomorphic/utilityScriptSerializers.js +3 -0
- package/lib/server/javascript.js +26 -33
- package/lib/server/launchApp.js +7 -7
- package/lib/server/localUtils.js +203 -0
- package/lib/server/network.js +5 -5
- package/lib/server/page.js +76 -37
- package/lib/server/pipeTransport.js +1 -1
- package/lib/server/playwright.js +5 -5
- package/lib/server/progress.js +1 -4
- package/lib/server/protocolError.js +1 -1
- package/lib/server/recorder/chat.js +177 -0
- package/lib/server/recorder/codeGenerator.js +154 -0
- package/lib/server/recorder/contextRecorder.js +9 -18
- package/lib/server/recorder/csharp.js +311 -0
- package/lib/server/recorder/java.js +249 -0
- package/lib/server/recorder/javascript.js +230 -0
- package/lib/server/recorder/jsonl.js +48 -0
- package/lib/server/recorder/language.js +45 -0
- package/lib/server/recorder/python.js +276 -0
- package/lib/server/recorder/recorderActions.js +6 -0
- package/lib/server/recorder/recorderApp.js +25 -28
- package/lib/server/recorder/recorderCollection.js +9 -21
- package/lib/server/recorder/recorderInTraceViewer.js +1 -1
- package/lib/server/recorder/recorderRunner.js +7 -3
- package/lib/server/recorder/recorderUtils.js +5 -28
- package/lib/server/recorder/throttledFile.js +3 -4
- package/lib/server/recorder/utils.js +46 -0
- package/lib/server/recorder.js +83 -43
- package/lib/server/registry/browserFetcher.js +10 -8
- package/lib/server/registry/dependencies.js +20 -20
- package/lib/server/registry/index.js +215 -61
- package/lib/server/registry/nativeDeps.js +10 -4
- package/lib/server/registry/oopDownloadBrowserMain.js +3 -3
- package/lib/server/screenshotter.js +1 -1
- package/lib/server/selectors.js +3 -3
- package/lib/server/socksClientCertificatesInterceptor.js +8 -8
- package/lib/server/socksInterceptor.js +8 -5
- package/lib/server/storageScript.js +160 -0
- package/lib/server/timeoutSettings.js +74 -0
- package/lib/server/trace/recorder/snapshotter.js +10 -20
- package/lib/server/trace/recorder/snapshotterInjected.js +26 -1
- package/lib/server/trace/recorder/tracing.js +108 -45
- package/lib/server/trace/test/inMemorySnapshotter.js +6 -6
- package/lib/server/trace/viewer/traceViewer.js +21 -7
- package/lib/server/transport.js +3 -2
- package/lib/server/utils/ascii.js +31 -0
- package/lib/server/utils/comparators.js +159 -0
- package/lib/server/utils/crypto.js +171 -0
- package/lib/server/utils/debug.js +38 -0
- package/lib/server/utils/debugLogger.js +93 -0
- package/lib/server/utils/env.js +53 -0
- package/lib/server/utils/eventsHelper.js +38 -0
- package/lib/server/utils/expectUtils.js +33 -0
- package/lib/server/utils/fileUtils.js +204 -0
- package/lib/server/utils/happyEyeballs.js +207 -0
- package/lib/server/utils/hostPlatform.js +145 -0
- package/lib/server/utils/httpServer.js +233 -0
- package/lib/server/utils/image_tools/colorUtils.js +98 -0
- package/lib/server/utils/image_tools/compare.js +108 -0
- package/lib/server/utils/image_tools/imageChannel.js +70 -0
- package/lib/server/utils/image_tools/stats.js +102 -0
- package/lib/server/utils/linuxUtils.js +58 -0
- package/lib/server/utils/network.js +160 -0
- package/lib/server/utils/nodePlatform.js +140 -0
- package/lib/server/utils/pipeTransport.js +82 -0
- package/lib/server/utils/processLauncher.js +248 -0
- package/lib/server/utils/profiler.js +52 -0
- package/lib/server/utils/socksProxy.js +570 -0
- package/lib/server/utils/spawnAsync.js +45 -0
- package/lib/server/utils/task.js +58 -0
- package/lib/server/utils/userAgent.js +91 -0
- package/lib/server/utils/wsServer.js +128 -0
- package/lib/server/utils/zipFile.js +75 -0
- package/lib/server/utils/zones.js +54 -0
- package/lib/server/webkit/webkit.js +4 -4
- package/lib/server/webkit/wkBrowser.js +10 -10
- package/lib/server/webkit/wkConnection.js +1 -1
- package/lib/server/webkit/wkExecutionContext.js +26 -30
- package/lib/server/webkit/wkInput.js +17 -7
- package/lib/server/webkit/wkInterceptableRequest.js +2 -2
- package/lib/server/webkit/wkPage.js +80 -66
- package/lib/server/webkit/wkProvisionalPage.js +1 -1
- package/lib/server/webkit/wkWorkers.js +2 -2
- package/lib/utils/fileUtils.js +1 -1
- package/lib/utils/glob.js +84 -0
- package/lib/utils/isomorphic/ariaSnapshot.js +392 -0
- package/lib/utils/isomorphic/assert.js +25 -0
- package/lib/utils/isomorphic/colors.js +65 -0
- package/lib/utils/isomorphic/cssParser.js +5 -5
- package/lib/utils/isomorphic/headers.js +52 -0
- package/lib/utils/isomorphic/locatorGenerators.js +38 -8
- package/lib/utils/isomorphic/locatorParser.js +19 -13
- package/lib/utils/isomorphic/manualPromise.js +107 -0
- package/lib/utils/isomorphic/mimeType.js +11 -3
- package/lib/utils/isomorphic/multimap.js +73 -0
- package/lib/utils/isomorphic/rtti.js +41 -0
- package/lib/utils/isomorphic/semaphore.js +51 -0
- package/lib/utils/isomorphic/stackTrace.js +169 -0
- package/lib/utils/isomorphic/stringUtils.js +31 -1
- package/lib/utils/isomorphic/time.js +25 -0
- package/lib/utils/isomorphic/timeoutRunner.js +66 -0
- package/lib/utils/isomorphic/traceUtils.js +23 -0
- package/lib/utils/isomorphic/types.js +5 -0
- package/lib/utils/isomorphic/urlMatch.js +7 -5
- package/lib/utils/mimeType.js +30 -0
- package/lib/utils/stackTrace.js +1 -1
- package/lib/utils.js +447 -0
- package/lib/utilsBundle.js +4 -29
- package/lib/utilsBundleImpl/index.js +188 -33
- package/lib/vite/htmlReport/index.html +20 -17
- package/lib/vite/recorder/assets/codeMirrorModule-B9YMkrwa.js +24 -0
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +184 -0
- package/lib/vite/recorder/assets/{index-BW-aOBcL.css → index-eHBmevrY.css} +1 -1
- package/lib/vite/recorder/index.html +2 -2
- package/lib/vite/traceViewer/assets/codeMirrorModule-gU1OOCQO.js +24 -0
- package/lib/vite/traceViewer/assets/defaultSettingsView-B5n_FjMx.js +1 -0
- package/lib/vite/traceViewer/assets/inspectorTab-6Tru8Mn_.js +235 -0
- package/lib/vite/traceViewer/assets/workbench-B_Nj4NA2.js +25 -0
- package/lib/vite/traceViewer/assets/{xtermModule-BeNbaIVa.js → xtermModule-BoAIEibi.js} +7 -7
- package/lib/vite/traceViewer/defaultSettingsView.CO3FR0CX.css +1 -0
- package/lib/vite/traceViewer/{embedded.BkvOrz5Z.js → embedded.DpNPH6mk.js} +2 -2
- package/lib/vite/traceViewer/embedded.html +6 -6
- package/lib/vite/traceViewer/index.CuE3SYGw.js +2 -0
- package/lib/vite/traceViewer/index.html +27 -9
- package/lib/vite/traceViewer/inspectorTab.CXDulcFG.css +1 -0
- package/lib/vite/traceViewer/{recorder.DNMfnSiu.js → recorder.BD-uZJs7.js} +2 -2
- package/lib/vite/traceViewer/recorder.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +7888 -3
- package/lib/vite/traceViewer/{uiMode.CAYqod-m.css → uiMode.BatfzHMG.css} +1 -1
- package/lib/vite/traceViewer/uiMode.DHrNgddz.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +8 -7
- package/lib/vite/traceViewer/workbench.B9vIAzH9.css +1 -0
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +7 -7
- package/types/protocol.d.ts +820 -153
- package/types/types.d.ts +285 -82
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +0 -2
- package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +0 -24
- package/lib/vite/recorder/assets/index-Bxxcmxlu.js +0 -42
- package/lib/vite/traceViewer/assets/codeMirrorModule-pBPtArIT.js +0 -24
- package/lib/vite/traceViewer/assets/codeMirrorModule-tzBrK1V4.js +0 -24
- package/lib/vite/traceViewer/assets/inspectorTab-BuJ3wAX_.js +0 -64
- package/lib/vite/traceViewer/assets/inspectorTab-Soeeuvzv.js +0 -64
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +0 -1
- package/lib/vite/traceViewer/assets/workbench-DdmJ9AJV.js +0 -9
- package/lib/vite/traceViewer/assets/workbench-lypYlf00.js +0 -9
- package/lib/vite/traceViewer/embedded.DInvAijy.js +0 -2
- package/lib/vite/traceViewer/index.Dha3cgqs.js +0 -2
- package/lib/vite/traceViewer/index._Iolt-uE.js +0 -2
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +0 -1
- package/lib/vite/traceViewer/recorder.DTSaNaly.js +0 -2
- package/lib/vite/traceViewer/uiMode.BM7yhjzl.js +0 -5
- package/lib/vite/traceViewer/uiMode.Cr1tvTWS.js +0 -5
- package/lib/vite/traceViewer/workbench.DlsCx8k5.css +0 -1
- /package/lib/vite/recorder/assets/{codeMirrorModule-ez37Vkbh.css → codeMirrorModule-C3UTv-Ge.css} +0 -0
- /package/lib/vite/traceViewer/{codeMirrorModule.ez37Vkbh.css → codeMirrorModule.C3UTv-Ge.css} +0 -0
- /package/lib/vite/traceViewer/{embedded.w7WN2u1R.css → embedded.mLhjB5IF.css} +0 -0
- /package/lib/vite/traceViewer/{index.CrbWWHbf.css → index.CFOW-Ezb.css} +0 -0
- /package/lib/vite/traceViewer/{recorder.B_SY1GJM.css → recorder.tn0RQdqM.css} +0 -0
- /package/lib/vite/traceViewer/{xtermModule.DSXBckUd.css → xtermModule.Beg8tuEN.css} +0 -0
|
@@ -4,9 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.JavaScriptLanguageGenerator = exports.JavaScriptFormatter = void 0;
|
|
7
|
+
exports.quoteMultiline = quoteMultiline;
|
|
7
8
|
var _language = require("./language");
|
|
8
|
-
var _deviceDescriptors = require("../deviceDescriptors");
|
|
9
9
|
var _utils = require("../../utils");
|
|
10
|
+
var _deviceDescriptors = require("../deviceDescriptors");
|
|
10
11
|
/**
|
|
11
12
|
* Copyright (c) Microsoft Corporation.
|
|
12
13
|
*
|
|
@@ -92,7 +93,7 @@ class JavaScriptLanguageGenerator {
|
|
|
92
93
|
case 'navigate':
|
|
93
94
|
return `await ${subject}.goto(${quote(action.url)});`;
|
|
94
95
|
case 'select':
|
|
95
|
-
return `await ${subject}.${this._asLocator(action.selector)}.selectOption(${formatObject(action.options.length
|
|
96
|
+
return `await ${subject}.${this._asLocator(action.selector)}.selectOption(${formatObject(action.options.length === 1 ? action.options[0] : action.options)});`;
|
|
96
97
|
case 'assertText':
|
|
97
98
|
return `${this._isTest ? '' : '// '}await expect(${subject}.${this._asLocator(action.selector)}).${action.substring ? 'toContainText' : 'toHaveText'}(${quote(action.text)});`;
|
|
98
99
|
case 'assertChecked':
|
|
@@ -104,6 +105,11 @@ class JavaScriptLanguageGenerator {
|
|
|
104
105
|
const assertion = action.value ? `toHaveValue(${quote(action.value)})` : `toBeEmpty()`;
|
|
105
106
|
return `${this._isTest ? '' : '// '}await expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
|
|
106
107
|
}
|
|
108
|
+
case 'assertSnapshot':
|
|
109
|
+
{
|
|
110
|
+
const commentIfNeeded = this._isTest ? '' : '// ';
|
|
111
|
+
return `${commentIfNeeded}await expect(${subject}.${this._asLocator(action.selector)}).toMatchAriaSnapshot(${quoteMultiline(action.snapshot, `${commentIfNeeded} `)});`;
|
|
112
|
+
}
|
|
107
113
|
}
|
|
108
114
|
}
|
|
109
115
|
_asLocator(selector) {
|
|
@@ -119,11 +125,17 @@ class JavaScriptLanguageGenerator {
|
|
|
119
125
|
}
|
|
120
126
|
generateTestHeader(options) {
|
|
121
127
|
const formatter = new JavaScriptFormatter();
|
|
122
|
-
const useText = formatContextOptions(options.contextOptions, options.deviceName);
|
|
128
|
+
const useText = formatContextOptions(options.contextOptions, options.deviceName, this._isTest);
|
|
123
129
|
formatter.add(`
|
|
124
130
|
import { test, expect${options.deviceName ? ', devices' : ''} } from '@playwright/test';
|
|
125
131
|
${useText ? '\ntest.use(' + useText + ');\n' : ''}
|
|
126
132
|
test('test', async ({ page }) => {`);
|
|
133
|
+
if (options.contextOptions.recordHar) {
|
|
134
|
+
const url = options.contextOptions.recordHar.urlFilter;
|
|
135
|
+
formatter.add(` await page.routeFromHAR(${quote(options.contextOptions.recordHar.path)}${url ? `, ${formatOptions({
|
|
136
|
+
url
|
|
137
|
+
}, false)}` : ''});`);
|
|
138
|
+
}
|
|
127
139
|
return formatter.format();
|
|
128
140
|
}
|
|
129
141
|
generateTestFooter(saveStorage) {
|
|
@@ -136,7 +148,8 @@ ${useText ? '\ntest.use(' + useText + ');\n' : ''}
|
|
|
136
148
|
|
|
137
149
|
(async () => {
|
|
138
150
|
const browser = await ${options.browserName}.launch(${formatObjectOrVoid(options.launchOptions)});
|
|
139
|
-
const context = await browser.newContext(${formatContextOptions(options.contextOptions, options.deviceName)});`);
|
|
151
|
+
const context = await browser.newContext(${formatContextOptions(options.contextOptions, options.deviceName, false)});`);
|
|
152
|
+
if (options.contextOptions.recordHar) formatter.add(` await context.routeFromHAR(${quote(options.contextOptions.recordHar.path)});`);
|
|
140
153
|
return formatter.format();
|
|
141
154
|
}
|
|
142
155
|
generateStandaloneFooter(saveStorage) {
|
|
@@ -169,8 +182,13 @@ function formatObjectOrVoid(value, indent = ' ') {
|
|
|
169
182
|
const result = formatObject(value, indent);
|
|
170
183
|
return result === '{}' ? '' : result;
|
|
171
184
|
}
|
|
172
|
-
function formatContextOptions(options, deviceName) {
|
|
185
|
+
function formatContextOptions(options, deviceName, isTest) {
|
|
173
186
|
const device = deviceName && _deviceDescriptors.deviceDescriptors[deviceName];
|
|
187
|
+
// recordHAR is replaced with routeFromHAR in the generated code.
|
|
188
|
+
options = {
|
|
189
|
+
...options,
|
|
190
|
+
recordHar: undefined
|
|
191
|
+
};
|
|
174
192
|
if (!device) return formatObjectOrVoid(options);
|
|
175
193
|
// Filter out all the properties from the device descriptor.
|
|
176
194
|
let serializedObject = formatObjectOrVoid((0, _language.sanitizeDeviceOptions)(device, options));
|
|
@@ -189,10 +207,12 @@ class JavaScriptFormatter {
|
|
|
189
207
|
this._baseOffset = ' '.repeat(offset);
|
|
190
208
|
}
|
|
191
209
|
prepend(text) {
|
|
192
|
-
|
|
210
|
+
const trim = isMultilineString(text) ? line => line : line => line.trim();
|
|
211
|
+
this._lines = text.trim().split('\n').map(trim).concat(this._lines);
|
|
193
212
|
}
|
|
194
213
|
add(text) {
|
|
195
|
-
|
|
214
|
+
const trim = isMultilineString(text) ? line => line : line => line.trim();
|
|
215
|
+
this._lines.push(...text.trim().split('\n').map(trim));
|
|
196
216
|
}
|
|
197
217
|
newLine() {
|
|
198
218
|
this._lines.push('');
|
|
@@ -220,4 +240,14 @@ function wrapWithStep(description, body) {
|
|
|
220
240
|
return description ? `await test.step(\`${description}\`, async () => {
|
|
221
241
|
${body}
|
|
222
242
|
});` : body;
|
|
243
|
+
}
|
|
244
|
+
function quoteMultiline(text, indent = ' ') {
|
|
245
|
+
const escape = text => text.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
|
|
246
|
+
const lines = text.split('\n');
|
|
247
|
+
if (lines.length === 1) return '`' + escape(text) + '`';
|
|
248
|
+
return '`\n' + lines.map(line => indent + escape(line).replace(/\${/g, '\\${')).join('\n') + `\n${indent}\``;
|
|
249
|
+
}
|
|
250
|
+
function isMultilineString(text) {
|
|
251
|
+
var _text$match;
|
|
252
|
+
return (_text$match = text.match(/`[\S\s]*`/)) === null || _text$match === void 0 ? void 0 : _text$match[0].includes('\n');
|
|
223
253
|
}
|
|
@@ -32,7 +32,7 @@ class JsonlLanguageGenerator {
|
|
|
32
32
|
const locator = actionInContext.action.selector ? JSON.parse((0, _utils.asLocator)('jsonl', actionInContext.action.selector)) : undefined;
|
|
33
33
|
const entry = {
|
|
34
34
|
...actionInContext.action,
|
|
35
|
-
|
|
35
|
+
...actionInContext.frame,
|
|
36
36
|
locator
|
|
37
37
|
};
|
|
38
38
|
return JSON.stringify(entry);
|
|
@@ -4,10 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.languageSet = languageSet;
|
|
7
|
+
var _csharp = require("./csharp");
|
|
7
8
|
var _java = require("./java");
|
|
8
9
|
var _javascript = require("./javascript");
|
|
9
10
|
var _jsonl = require("./jsonl");
|
|
10
|
-
var _csharp = require("./csharp");
|
|
11
11
|
var _python = require("./python");
|
|
12
12
|
/**
|
|
13
13
|
* Copyright (c) Microsoft Corporation.
|
|
@@ -26,5 +26,5 @@ var _python = require("./python");
|
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
function languageSet() {
|
|
29
|
-
return new Set([new _java.JavaLanguageGenerator('junit'), new _java.JavaLanguageGenerator('library'), new _javascript.JavaScriptLanguageGenerator(
|
|
29
|
+
return 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()]);
|
|
30
30
|
}
|
|
@@ -114,6 +114,8 @@ class PythonLanguageGenerator {
|
|
|
114
114
|
const assertion = action.value ? `to_have_value(${quote(action.value)})` : `to_be_empty()`;
|
|
115
115
|
return `expect(${subject}.${this._asLocator(action.selector)}).${assertion};`;
|
|
116
116
|
}
|
|
117
|
+
case 'assertSnapshot':
|
|
118
|
+
return `expect(${subject}.${this._asLocator(action.selector)}).to_match_aria_snapshot(${quote(action.snapshot)})`;
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
_asLocator(selector) {
|
|
@@ -121,6 +123,7 @@ class PythonLanguageGenerator {
|
|
|
121
123
|
}
|
|
122
124
|
generateHeader(options) {
|
|
123
125
|
const formatter = new PythonFormatter();
|
|
126
|
+
const recordHar = options.contextOptions.recordHar;
|
|
124
127
|
if (this._isPyTest) {
|
|
125
128
|
const contextOptions = formatContextOptions(options.contextOptions, options.deviceName, true /* asDict */);
|
|
126
129
|
const fixture = contextOptions ? `
|
|
@@ -130,11 +133,12 @@ def browser_context_args(browser_context_args, playwright) {
|
|
|
130
133
|
return {${contextOptions}}
|
|
131
134
|
}
|
|
132
135
|
` : '';
|
|
133
|
-
formatter.add(`${options.deviceName ? 'import pytest\n' : ''}import re
|
|
136
|
+
formatter.add(`${options.deviceName || contextOptions ? 'import pytest\n' : ''}import re
|
|
134
137
|
from playwright.sync_api import Page, expect
|
|
135
138
|
${fixture}
|
|
136
139
|
|
|
137
140
|
def test_example(page: Page) -> None {`);
|
|
141
|
+
if (recordHar) formatter.add(` page.route_from_har(${quote(recordHar.path)}${typeof recordHar.urlFilter === 'string' ? `, url=${quote(recordHar.urlFilter)}` : ''})`);
|
|
138
142
|
} else if (this._isAsync) {
|
|
139
143
|
formatter.add(`
|
|
140
144
|
import asyncio
|
|
@@ -145,6 +149,7 @@ from playwright.async_api import Playwright, async_playwright, expect
|
|
|
145
149
|
async def run(playwright: Playwright) -> None {
|
|
146
150
|
browser = await playwright.${options.browserName}.launch(${formatOptions(options.launchOptions, false)})
|
|
147
151
|
context = await browser.new_context(${formatContextOptions(options.contextOptions, options.deviceName)})`);
|
|
152
|
+
if (recordHar) formatter.add(` await context.route_from_har(${quote(recordHar.path)}${typeof recordHar.urlFilter === 'string' ? `, url=${quote(recordHar.urlFilter)}` : ''})`);
|
|
148
153
|
} else {
|
|
149
154
|
formatter.add(`
|
|
150
155
|
import re
|
|
@@ -154,6 +159,7 @@ from playwright.sync_api import Playwright, sync_playwright, expect
|
|
|
154
159
|
def run(playwright: Playwright) -> None {
|
|
155
160
|
browser = playwright.${options.browserName}.launch(${formatOptions(options.launchOptions, false)})
|
|
156
161
|
context = browser.new_context(${formatContextOptions(options.contextOptions, options.deviceName)})`);
|
|
162
|
+
if (recordHar) formatter.add(` context.route_from_har(${quote(recordHar.path)}${typeof recordHar.urlFilter === 'string' ? `, url=${quote(recordHar.urlFilter)}` : ''})`);
|
|
157
163
|
}
|
|
158
164
|
return formatter.format();
|
|
159
165
|
}
|
|
@@ -205,24 +211,15 @@ function formatOptions(value, hasArguments, asDict) {
|
|
|
205
211
|
return `${(0, _utils.toSnakeCase)(key)}=${formatValue(value[key])}`;
|
|
206
212
|
}).join(', ');
|
|
207
213
|
}
|
|
208
|
-
function convertContextOptions(options) {
|
|
209
|
-
const result = {
|
|
210
|
-
...options
|
|
211
|
-
};
|
|
212
|
-
if (options.recordHar) {
|
|
213
|
-
result['record_har_path'] = options.recordHar.path;
|
|
214
|
-
result['record_har_content'] = options.recordHar.content;
|
|
215
|
-
result['record_har_mode'] = options.recordHar.mode;
|
|
216
|
-
result['record_har_omit_content'] = options.recordHar.omitContent;
|
|
217
|
-
result['record_har_url_filter'] = options.recordHar.urlFilter;
|
|
218
|
-
delete result.recordHar;
|
|
219
|
-
}
|
|
220
|
-
return result;
|
|
221
|
-
}
|
|
222
214
|
function formatContextOptions(options, deviceName, asDict) {
|
|
215
|
+
// recordHAR is replaced with routeFromHAR in the generated code.
|
|
216
|
+
options = {
|
|
217
|
+
...options,
|
|
218
|
+
recordHar: undefined
|
|
219
|
+
};
|
|
223
220
|
const device = deviceName && _deviceDescriptors.deviceDescriptors[deviceName];
|
|
224
|
-
if (!device) return formatOptions(
|
|
225
|
-
return `**playwright.devices[${quote(deviceName)}]` + formatOptions(
|
|
221
|
+
if (!device) return formatOptions(options, false, asDict);
|
|
222
|
+
return `**playwright.devices[${quote(deviceName)}]` + formatOptions((0, _language.sanitizeDeviceOptions)(device, options), true, asDict);
|
|
226
223
|
}
|
|
227
224
|
class PythonFormatter {
|
|
228
225
|
constructor(offset = 0) {
|
|
@@ -4,11 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.DebugController = void 0;
|
|
7
|
-
var _processLauncher = require("../utils/processLauncher");
|
|
8
7
|
var _instrumentation = require("./instrumentation");
|
|
8
|
+
var _processLauncher = require("./utils/processLauncher");
|
|
9
9
|
var _recorder = require("./recorder");
|
|
10
|
-
var _recorderApp = require("./recorder/recorderApp");
|
|
11
10
|
var _utils = require("../utils");
|
|
11
|
+
var _ariaSnapshot = require("../utils/isomorphic/ariaSnapshot");
|
|
12
|
+
var _utilsBundle = require("../utilsBundle");
|
|
13
|
+
var _recorderApp = require("./recorder/recorderApp");
|
|
14
|
+
var _locatorParser = require("../utils/isomorphic/locatorParser");
|
|
12
15
|
/**
|
|
13
16
|
* Copyright (c) Microsoft Corporation.
|
|
14
17
|
*
|
|
@@ -34,9 +37,6 @@ class DebugController extends _instrumentation.SdkObject {
|
|
|
34
37
|
},
|
|
35
38
|
instrumentation: (0, _instrumentation.createInstrumentation)()
|
|
36
39
|
}, undefined, 'DebugController');
|
|
37
|
-
this._autoCloseTimer = void 0;
|
|
38
|
-
// TODO: remove in 1.27
|
|
39
|
-
this._autoCloseAllowed = false;
|
|
40
40
|
this._trackHierarchyListener = void 0;
|
|
41
41
|
this._playwright = void 0;
|
|
42
42
|
this._sdkLanguage = 'javascript';
|
|
@@ -47,20 +47,17 @@ class DebugController extends _instrumentation.SdkObject {
|
|
|
47
47
|
this._codegenId = codegenId;
|
|
48
48
|
this._sdkLanguage = sdkLanguage;
|
|
49
49
|
}
|
|
50
|
-
setAutoCloseAllowed(allowed) {
|
|
51
|
-
this._autoCloseAllowed = allowed;
|
|
52
|
-
}
|
|
53
50
|
dispose() {
|
|
54
51
|
this.setReportStateChanged(false);
|
|
55
|
-
this.setAutoCloseAllowed(false);
|
|
56
52
|
}
|
|
57
53
|
setReportStateChanged(enabled) {
|
|
58
54
|
if (enabled && !this._trackHierarchyListener) {
|
|
59
55
|
this._trackHierarchyListener = {
|
|
60
|
-
onPageOpen: () => this._emitSnapshot(),
|
|
61
|
-
onPageClose: () => this._emitSnapshot()
|
|
56
|
+
onPageOpen: () => this._emitSnapshot(false),
|
|
57
|
+
onPageClose: () => this._emitSnapshot(false)
|
|
62
58
|
};
|
|
63
59
|
this._playwright.instrumentation.addListener(this._trackHierarchyListener, null);
|
|
60
|
+
this._emitSnapshot(true);
|
|
64
61
|
} else if (!enabled && this._trackHierarchyListener) {
|
|
65
62
|
this._playwright.instrumentation.removeListener(this._trackHierarchyListener);
|
|
66
63
|
this._trackHierarchyListener = undefined;
|
|
@@ -82,7 +79,6 @@ class DebugController extends _instrumentation.SdkObject {
|
|
|
82
79
|
recorder.hideHighlightedSelector();
|
|
83
80
|
recorder.setMode('none');
|
|
84
81
|
}
|
|
85
|
-
this.setAutoCloseEnabled(true);
|
|
86
82
|
return;
|
|
87
83
|
}
|
|
88
84
|
if (!this._playwright.allBrowsers().length) await this._playwright.chromium.launch(internalMetadata, {
|
|
@@ -107,19 +103,14 @@ class DebugController extends _instrumentation.SdkObject {
|
|
|
107
103
|
if (params.mode !== 'inspecting') recorder.setOutput(this._codegenId, params.file);
|
|
108
104
|
recorder.setMode(params.mode);
|
|
109
105
|
}
|
|
110
|
-
this.setAutoCloseEnabled(true);
|
|
111
|
-
}
|
|
112
|
-
async setAutoCloseEnabled(enabled) {
|
|
113
|
-
if (!this._autoCloseAllowed) return;
|
|
114
|
-
if (this._autoCloseTimer) clearTimeout(this._autoCloseTimer);
|
|
115
|
-
if (!enabled) return;
|
|
116
|
-
const heartBeat = () => {
|
|
117
|
-
if (!this._playwright.allPages().length) (0, _processLauncher.gracefullyProcessExitDoNotHang)(0);else this._autoCloseTimer = setTimeout(heartBeat, 5000);
|
|
118
|
-
};
|
|
119
|
-
this._autoCloseTimer = setTimeout(heartBeat, 30000);
|
|
120
106
|
}
|
|
121
|
-
async highlight(
|
|
122
|
-
|
|
107
|
+
async highlight(params) {
|
|
108
|
+
// Assert parameters validity.
|
|
109
|
+
if (params.selector) (0, _locatorParser.unsafeLocatorOrSelectorAsSelector)(this._sdkLanguage, params.selector, 'data-testid');
|
|
110
|
+
const ariaTemplate = params.ariaTemplate ? (0, _ariaSnapshot.parseAriaSnapshotUnsafe)(_utilsBundle.yaml, params.ariaTemplate) : undefined;
|
|
111
|
+
for (const recorder of await this._allRecorders()) {
|
|
112
|
+
if (ariaTemplate) recorder.setHighlightedAriaTemplate(ariaTemplate);else if (params.selector) recorder.setHighlightedSelector(this._sdkLanguage, params.selector);
|
|
113
|
+
}
|
|
123
114
|
}
|
|
124
115
|
async hideHighlight() {
|
|
125
116
|
// Hide all active recorder highlights.
|
|
@@ -141,23 +132,9 @@ class DebugController extends _instrumentation.SdkObject {
|
|
|
141
132
|
reason: 'Close all browsers requested'
|
|
142
133
|
})));
|
|
143
134
|
}
|
|
144
|
-
_emitSnapshot() {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
for (const browser of this._playwright.allBrowsers()) {
|
|
148
|
-
const b = {
|
|
149
|
-
contexts: []
|
|
150
|
-
};
|
|
151
|
-
browsers.push(b);
|
|
152
|
-
for (const context of browser.contexts()) {
|
|
153
|
-
const c = {
|
|
154
|
-
pages: []
|
|
155
|
-
};
|
|
156
|
-
b.contexts.push(c);
|
|
157
|
-
for (const page of context.pages()) c.pages.push(page.mainFrame().url());
|
|
158
|
-
pageCount += context.pages().length;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
135
|
+
_emitSnapshot(initial) {
|
|
136
|
+
const pageCount = this._playwright.allPages().length;
|
|
137
|
+
if (initial && !pageCount) return;
|
|
161
138
|
this.emit(DebugController.Events.StateChanged, {
|
|
162
139
|
pageCount
|
|
163
140
|
});
|
|
@@ -197,11 +174,12 @@ class InspectingRecorderApp extends _recorderApp.EmptyRecorderApp {
|
|
|
197
174
|
this._debugController = void 0;
|
|
198
175
|
this._debugController = debugController;
|
|
199
176
|
}
|
|
200
|
-
async
|
|
201
|
-
const locator = (0, _utils.asLocator)(this._debugController._sdkLanguage, selector);
|
|
177
|
+
async elementPicked(elementInfo) {
|
|
178
|
+
const locator = (0, _utils.asLocator)(this._debugController._sdkLanguage, elementInfo.selector);
|
|
202
179
|
this._debugController.emit(DebugController.Events.InspectRequested, {
|
|
203
|
-
selector,
|
|
204
|
-
locator
|
|
180
|
+
selector: elementInfo.selector,
|
|
181
|
+
locator,
|
|
182
|
+
ariaSnapshot: elementInfo.ariaSnapshot
|
|
205
183
|
});
|
|
206
184
|
}
|
|
207
185
|
async setSources(sources) {
|
package/lib/server/debugger.js
CHANGED
|
@@ -121,7 +121,7 @@ function shouldPauseBeforeStep(metadata) {
|
|
|
121
121
|
if (!metadata.apiName) return false;
|
|
122
122
|
// Always stop on 'close'
|
|
123
123
|
if (metadata.method === 'close') return true;
|
|
124
|
-
if (metadata.method === 'waitForSelector' || metadata.method === 'waitForEventInfo') return false; // Never stop on those, primarily for the test harness.
|
|
124
|
+
if (metadata.method === 'waitForSelector' || metadata.method === 'waitForEventInfo' || metadata.method === 'querySelector' || metadata.method === 'querySelectorAll') return false; // Never stop on those, primarily for the test harness.
|
|
125
125
|
const step = metadata.type + '.' + metadata.method;
|
|
126
126
|
// Stop before everything that generates snapshot. But don't stop before those marked as pausesBeforeInputActions
|
|
127
127
|
// since we stop in them on a separate instrumentation signal.
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.deviceDescriptors = void 0;
|
|
7
7
|
var _deviceDescriptorsSource = _interopRequireDefault(require("./deviceDescriptorsSource.json"));
|
|
8
|
-
function _interopRequireDefault(
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
9
|
/**
|
|
10
10
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
11
11
|
* Modifications copyright (c) Microsoft Corporation.
|