patchright-core 1.48.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/README.md +3 -0
- package/ThirdPartyNotices.txt +1548 -0
- package/bin/PrintDeps.exe +0 -0
- package/bin/README.md +2 -0
- package/bin/install_media_pack.ps1 +5 -0
- package/bin/reinstall_chrome_beta_linux.sh +40 -0
- package/bin/reinstall_chrome_beta_mac.sh +13 -0
- package/bin/reinstall_chrome_beta_win.ps1 +24 -0
- package/bin/reinstall_chrome_stable_linux.sh +40 -0
- package/bin/reinstall_chrome_stable_mac.sh +12 -0
- package/bin/reinstall_chrome_stable_win.ps1 +24 -0
- package/bin/reinstall_msedge_beta_linux.sh +40 -0
- package/bin/reinstall_msedge_beta_mac.sh +11 -0
- package/bin/reinstall_msedge_beta_win.ps1 +23 -0
- package/bin/reinstall_msedge_dev_linux.sh +40 -0
- package/bin/reinstall_msedge_dev_mac.sh +11 -0
- package/bin/reinstall_msedge_dev_win.ps1 +23 -0
- package/bin/reinstall_msedge_stable_linux.sh +40 -0
- package/bin/reinstall_msedge_stable_mac.sh +11 -0
- package/bin/reinstall_msedge_stable_win.ps1 +24 -0
- package/browsers.json +57 -0
- package/cli.js +18 -0
- package/index.d.ts +17 -0
- package/index.js +33 -0
- package/index.mjs +28 -0
- package/lib/androidServerImpl.js +69 -0
- package/lib/browserServerImpl.js +92 -0
- package/lib/cli/driver.js +95 -0
- package/lib/cli/program.js +589 -0
- package/lib/cli/programWithTestStub.js +67 -0
- package/lib/client/accessibility.js +50 -0
- package/lib/client/android.js +473 -0
- package/lib/client/api.js +285 -0
- package/lib/client/artifact.js +79 -0
- package/lib/client/browser.js +145 -0
- package/lib/client/browserContext.js +583 -0
- package/lib/client/browserType.js +241 -0
- package/lib/client/cdpSession.js +53 -0
- package/lib/client/channelOwner.js +235 -0
- package/lib/client/clientHelper.js +57 -0
- package/lib/client/clientInstrumentation.js +50 -0
- package/lib/client/clock.js +69 -0
- package/lib/client/connection.js +333 -0
- package/lib/client/consoleMessage.js +55 -0
- package/lib/client/coverage.js +41 -0
- package/lib/client/dialog.js +57 -0
- package/lib/client/download.js +62 -0
- package/lib/client/electron.js +135 -0
- package/lib/client/elementHandle.js +321 -0
- package/lib/client/errors.js +77 -0
- package/lib/client/eventEmitter.js +314 -0
- package/lib/client/events.js +94 -0
- package/lib/client/fetch.js +391 -0
- package/lib/client/fileChooser.js +45 -0
- package/lib/client/frame.js +504 -0
- package/lib/client/harRouter.js +99 -0
- package/lib/client/input.js +111 -0
- package/lib/client/jsHandle.js +121 -0
- package/lib/client/jsonPipe.js +35 -0
- package/lib/client/localUtils.js +36 -0
- package/lib/client/locator.js +441 -0
- package/lib/client/network.js +762 -0
- package/lib/client/page.js +770 -0
- package/lib/client/playwright.js +80 -0
- package/lib/client/selectors.js +67 -0
- package/lib/client/stream.js +54 -0
- package/lib/client/tracing.js +134 -0
- package/lib/client/types.js +24 -0
- package/lib/client/video.js +51 -0
- package/lib/client/waiter.js +158 -0
- package/lib/client/webError.js +37 -0
- package/lib/client/worker.js +71 -0
- package/lib/client/writableStream.js +54 -0
- package/lib/common/socksProxy.js +569 -0
- package/lib/common/timeoutSettings.js +73 -0
- package/lib/common/types.js +5 -0
- package/lib/generated/clockSource.js +7 -0
- package/lib/generated/consoleApiSource.js +7 -0
- package/lib/generated/injectedScriptSource.js +7 -0
- package/lib/generated/pollingRecorderSource.js +7 -0
- package/lib/generated/utilityScriptSource.js +7 -0
- package/lib/generated/webSocketMockSource.js +7 -0
- package/lib/image_tools/colorUtils.js +98 -0
- package/lib/image_tools/compare.js +108 -0
- package/lib/image_tools/imageChannel.js +70 -0
- package/lib/image_tools/stats.js +102 -0
- package/lib/inProcessFactory.js +54 -0
- package/lib/inprocess.js +20 -0
- package/lib/outofprocess.js +67 -0
- package/lib/protocol/debug.js +27 -0
- package/lib/protocol/serializers.js +173 -0
- package/lib/protocol/transport.js +82 -0
- package/lib/protocol/validator.js +2760 -0
- package/lib/protocol/validatorPrimitives.js +139 -0
- package/lib/remote/playwrightConnection.js +274 -0
- package/lib/remote/playwrightServer.js +110 -0
- package/lib/server/accessibility.js +62 -0
- package/lib/server/android/android.js +441 -0
- package/lib/server/android/backendAdb.js +172 -0
- package/lib/server/artifact.js +104 -0
- package/lib/server/bidi/bidiBrowser.js +311 -0
- package/lib/server/bidi/bidiChromium.js +124 -0
- package/lib/server/bidi/bidiConnection.js +206 -0
- package/lib/server/bidi/bidiExecutionContext.js +159 -0
- package/lib/server/bidi/bidiFirefox.js +104 -0
- package/lib/server/bidi/bidiInput.js +158 -0
- package/lib/server/bidi/bidiNetworkManager.js +338 -0
- package/lib/server/bidi/bidiOverCdp.js +103 -0
- package/lib/server/bidi/bidiPage.js +529 -0
- package/lib/server/bidi/bidiPdf.js +140 -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/bidi/third_party/firefoxPrefs.js +221 -0
- package/lib/server/browser.js +148 -0
- package/lib/server/browserContext.js +666 -0
- package/lib/server/browserType.js +335 -0
- package/lib/server/chromium/appIcon.png +0 -0
- package/lib/server/chromium/chromium.js +350 -0
- package/lib/server/chromium/chromiumSwitches.js +36 -0
- package/lib/server/chromium/crAccessibility.js +237 -0
- package/lib/server/chromium/crBrowser.js +522 -0
- package/lib/server/chromium/crConnection.js +228 -0
- package/lib/server/chromium/crCoverage.js +246 -0
- package/lib/server/chromium/crDevTools.js +104 -0
- package/lib/server/chromium/crDragDrop.js +143 -0
- package/lib/server/chromium/crExecutionContext.js +149 -0
- package/lib/server/chromium/crInput.js +171 -0
- package/lib/server/chromium/crNetworkManager.js +809 -0
- package/lib/server/chromium/crPage.js +1235 -0
- package/lib/server/chromium/crPdf.js +153 -0
- package/lib/server/chromium/crProtocolHelper.js +133 -0
- package/lib/server/chromium/crServiceWorker.js +111 -0
- package/lib/server/chromium/defaultFontFamilies.js +145 -0
- package/lib/server/chromium/videoRecorder.js +155 -0
- package/lib/server/clock.js +133 -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 +88 -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/console.js +57 -0
- package/lib/server/cookieStore.js +185 -0
- package/lib/server/debugController.js +234 -0
- package/lib/server/debugger.js +132 -0
- package/lib/server/deviceDescriptors.js +26 -0
- package/lib/server/deviceDescriptorsSource.json +1669 -0
- package/lib/server/dialog.js +71 -0
- package/lib/server/dispatchers/androidDispatcher.js +193 -0
- package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- package/lib/server/dispatchers/browserContextDispatcher.js +368 -0
- package/lib/server/dispatchers/browserDispatcher.js +170 -0
- package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- package/lib/server/dispatchers/dispatcher.js +395 -0
- package/lib/server/dispatchers/electronDispatcher.js +93 -0
- package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- package/lib/server/dispatchers/frameDispatcher.js +286 -0
- package/lib/server/dispatchers/jsHandleDispatcher.js +97 -0
- package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
- package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
- package/lib/server/dispatchers/networkDispatchers.js +221 -0
- package/lib/server/dispatchers/pageDispatcher.js +367 -0
- package/lib/server/dispatchers/playwrightDispatcher.js +107 -0
- package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- package/lib/server/dispatchers/streamDispatcher.js +62 -0
- package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
- package/lib/server/dispatchers/writableStreamDispatcher.js +58 -0
- package/lib/server/dom.js +845 -0
- package/lib/server/download.js +60 -0
- package/lib/server/electron/electron.js +296 -0
- package/lib/server/electron/loader.js +57 -0
- package/lib/server/errors.js +68 -0
- package/lib/server/fetch.js +656 -0
- package/lib/server/fileChooser.js +42 -0
- package/lib/server/fileUploadUtils.js +75 -0
- package/lib/server/firefox/ffAccessibility.js +216 -0
- package/lib/server/firefox/ffBrowser.js +460 -0
- package/lib/server/firefox/ffConnection.js +168 -0
- package/lib/server/firefox/ffExecutionContext.js +135 -0
- package/lib/server/firefox/ffInput.js +150 -0
- package/lib/server/firefox/ffNetworkManager.js +233 -0
- package/lib/server/firefox/ffPage.js +559 -0
- package/lib/server/firefox/firefox.js +99 -0
- package/lib/server/formData.js +75 -0
- package/lib/server/frameSelectors.js +171 -0
- package/lib/server/frames.js +1808 -0
- package/lib/server/har/harRecorder.js +139 -0
- package/lib/server/har/harTracer.js +542 -0
- package/lib/server/helper.js +103 -0
- package/lib/server/index.js +114 -0
- package/lib/server/input.js +310 -0
- package/lib/server/instrumentation.js +70 -0
- package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
- package/lib/server/javascript.js +299 -0
- package/lib/server/launchApp.js +91 -0
- package/lib/server/macEditingCommands.js +139 -0
- package/lib/server/network.js +617 -0
- package/lib/server/page.js +819 -0
- package/lib/server/pipeTransport.js +85 -0
- package/lib/server/playwright.js +88 -0
- package/lib/server/progress.js +102 -0
- package/lib/server/protocolError.js +49 -0
- package/lib/server/recorder/contextRecorder.js +299 -0
- package/lib/server/recorder/recorderApp.js +196 -0
- package/lib/server/recorder/recorderCollection.js +116 -0
- package/lib/server/recorder/recorderFrontend.js +5 -0
- package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- package/lib/server/recorder/recorderRunner.js +155 -0
- package/lib/server/recorder/recorderUtils.js +112 -0
- package/lib/server/recorder/throttledFile.js +46 -0
- package/lib/server/recorder.js +329 -0
- package/lib/server/registry/browserFetcher.js +168 -0
- package/lib/server/registry/dependencies.js +322 -0
- package/lib/server/registry/index.js +1005 -0
- package/lib/server/registry/nativeDeps.js +490 -0
- package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- package/lib/server/screenshotter.js +348 -0
- package/lib/server/selectors.js +73 -0
- package/lib/server/socksClientCertificatesInterceptor.js +340 -0
- package/lib/server/socksInterceptor.js +100 -0
- package/lib/server/trace/recorder/snapshotter.js +172 -0
- package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- package/lib/server/trace/recorder/tracing.js +542 -0
- package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- package/lib/server/trace/viewer/traceViewer.js +213 -0
- package/lib/server/transport.js +191 -0
- package/lib/server/types.js +24 -0
- package/lib/server/usKeyboardLayout.js +555 -0
- package/lib/server/webkit/webkit.js +87 -0
- package/lib/server/webkit/wkAccessibility.js +194 -0
- package/lib/server/webkit/wkBrowser.js +329 -0
- package/lib/server/webkit/wkConnection.js +173 -0
- package/lib/server/webkit/wkExecutionContext.js +143 -0
- package/lib/server/webkit/wkInput.js +169 -0
- package/lib/server/webkit/wkInterceptableRequest.js +162 -0
- package/lib/server/webkit/wkPage.js +1219 -0
- package/lib/server/webkit/wkProvisionalPage.js +94 -0
- package/lib/server/webkit/wkWorkers.js +104 -0
- package/lib/third_party/diff_match_patch.js +2222 -0
- package/lib/third_party/pixelmatch.js +255 -0
- package/lib/utils/ascii.js +31 -0
- package/lib/utils/comparators.js +171 -0
- package/lib/utils/crypto.js +174 -0
- package/lib/utils/debug.js +46 -0
- package/lib/utils/debugLogger.js +91 -0
- package/lib/utils/env.js +49 -0
- package/lib/utils/eventsHelper.js +38 -0
- package/lib/utils/expectUtils.js +33 -0
- package/lib/utils/fileUtils.js +205 -0
- package/lib/utils/happy-eyeballs.js +194 -0
- package/lib/utils/headers.js +52 -0
- package/lib/utils/hostPlatform.js +133 -0
- package/lib/utils/httpServer.js +237 -0
- package/lib/utils/index.js +368 -0
- package/lib/utils/isomorphic/cssParser.js +250 -0
- package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- package/lib/utils/isomorphic/locatorGenerators.js +642 -0
- package/lib/utils/isomorphic/locatorParser.js +179 -0
- package/lib/utils/isomorphic/locatorUtils.js +62 -0
- package/lib/utils/isomorphic/mimeType.js +29 -0
- package/lib/utils/isomorphic/recorderUtils.js +195 -0
- package/lib/utils/isomorphic/selectorParser.js +397 -0
- package/lib/utils/isomorphic/stringUtils.js +139 -0
- package/lib/utils/isomorphic/traceUtils.js +39 -0
- package/lib/utils/isomorphic/urlMatch.js +120 -0
- package/lib/utils/linuxUtils.js +78 -0
- package/lib/utils/manualPromise.js +109 -0
- package/lib/utils/multimap.js +75 -0
- package/lib/utils/network.js +160 -0
- package/lib/utils/processLauncher.js +248 -0
- package/lib/utils/profiler.js +53 -0
- package/lib/utils/rtti.js +44 -0
- package/lib/utils/semaphore.js +51 -0
- package/lib/utils/spawnAsync.js +45 -0
- package/lib/utils/stackTrace.js +121 -0
- package/lib/utils/task.js +58 -0
- package/lib/utils/time.js +37 -0
- package/lib/utils/timeoutRunner.js +66 -0
- package/lib/utils/traceUtils.js +44 -0
- package/lib/utils/userAgent.js +105 -0
- package/lib/utils/wsServer.js +127 -0
- package/lib/utils/zipFile.js +75 -0
- package/lib/utils/zones.js +62 -0
- package/lib/utilsBundle.js +82 -0
- package/lib/utilsBundleImpl/index.js +53 -0
- package/lib/utilsBundleImpl/xdg-open +1066 -0
- package/lib/vite/htmlReport/index.html +66 -0
- package/lib/vite/recorder/assets/codeMirrorModule-baozm8ur.js +24 -0
- package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
- package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/recorder/assets/index-2ElAIWFB.js +42 -0
- package/lib/vite/recorder/assets/index-BW-aOBcL.css +1 -0
- package/lib/vite/recorder/index.html +29 -0
- package/lib/vite/recorder/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/assets/codeMirrorModule-Bh1rfd2w.js +24 -0
- package/lib/vite/traceViewer/assets/inspectorTab-7GHnKvSD.js +64 -0
- package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- package/lib/vite/traceViewer/assets/workbench-DPQnTHYP.js +9 -0
- package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
- package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/embedded.BlHoW5LY.js +2 -0
- package/lib/vite/traceViewer/embedded.html +18 -0
- package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
- package/lib/vite/traceViewer/index.DaWVfou1.js +2 -0
- package/lib/vite/traceViewer/index.html +29 -0
- package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
- package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- package/lib/vite/traceViewer/recorder.C4zxcvd2.js +2 -0
- package/lib/vite/traceViewer/recorder.html +17 -0
- package/lib/vite/traceViewer/snapshot.html +21 -0
- package/lib/vite/traceViewer/sw.bundle.js +3 -0
- package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
- package/lib/vite/traceViewer/uiMode.html +20 -0
- package/lib/vite/traceViewer/uiMode.mTXWniJb.js +5 -0
- package/lib/vite/traceViewer/workbench.D3JVcA9K.css +1 -0
- package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
- package/lib/zipBundle.js +25 -0
- package/lib/zipBundleImpl.js +5 -0
- package/package.json +44 -0
- package/types/protocol.d.ts +21571 -0
- package/types/structs.d.ts +45 -0
- package/types/types.d.ts +22519 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RecorderApp = exports.EmptyRecorderApp = void 0;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _progress = require("../progress");
|
|
10
|
+
var _events = require("events");
|
|
11
|
+
var _instrumentation = require("../instrumentation");
|
|
12
|
+
var _utils = require("../../utils");
|
|
13
|
+
var _utilsBundle = require("../../utilsBundle");
|
|
14
|
+
var _launchApp = require("../launchApp");
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
/**
|
|
17
|
+
* Copyright (c) Microsoft Corporation.
|
|
18
|
+
*
|
|
19
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
20
|
+
* you may not use this file except in compliance with the License.
|
|
21
|
+
* You may obtain a copy of the License at
|
|
22
|
+
*
|
|
23
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
24
|
+
*
|
|
25
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
26
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
27
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
28
|
+
* See the License for the specific language governing permissions and
|
|
29
|
+
* limitations under the License.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
class EmptyRecorderApp extends _events.EventEmitter {
|
|
33
|
+
constructor(...args) {
|
|
34
|
+
super(...args);
|
|
35
|
+
this.wsEndpointForTest = void 0;
|
|
36
|
+
}
|
|
37
|
+
async close() {}
|
|
38
|
+
async setPaused(paused) {}
|
|
39
|
+
async setMode(mode) {}
|
|
40
|
+
async setRunningFile(file) {}
|
|
41
|
+
async setSelector(selector, userGesture) {}
|
|
42
|
+
async updateCallLogs(callLogs) {}
|
|
43
|
+
async setSources(sources) {}
|
|
44
|
+
async setActions(actions, sources) {}
|
|
45
|
+
}
|
|
46
|
+
exports.EmptyRecorderApp = EmptyRecorderApp;
|
|
47
|
+
class RecorderApp extends _events.EventEmitter {
|
|
48
|
+
constructor(recorder, page, wsEndpoint) {
|
|
49
|
+
super();
|
|
50
|
+
this._page = void 0;
|
|
51
|
+
this.wsEndpointForTest = void 0;
|
|
52
|
+
this._recorder = void 0;
|
|
53
|
+
this.setMaxListeners(0);
|
|
54
|
+
this._recorder = recorder;
|
|
55
|
+
this._page = page;
|
|
56
|
+
this.wsEndpointForTest = wsEndpoint;
|
|
57
|
+
}
|
|
58
|
+
async close() {
|
|
59
|
+
await this._page.context().close({
|
|
60
|
+
reason: 'Recorder window closed'
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async _init() {
|
|
64
|
+
await (0, _launchApp.syncLocalStorageWithSettings)(this._page, 'recorder');
|
|
65
|
+
await this._page._setServerRequestInterceptor(route => {
|
|
66
|
+
if (!route.request().url().startsWith('https://playwright/')) return false;
|
|
67
|
+
const uri = route.request().url().substring('https://playwright/'.length);
|
|
68
|
+
const file = require.resolve('../../vite/recorder/' + uri);
|
|
69
|
+
_fs.default.promises.readFile(file).then(buffer => {
|
|
70
|
+
route.fulfill({
|
|
71
|
+
status: 200,
|
|
72
|
+
headers: [{
|
|
73
|
+
name: 'Content-Type',
|
|
74
|
+
value: _utilsBundle.mime.getType(_path.default.extname(file)) || 'application/octet-stream'
|
|
75
|
+
}],
|
|
76
|
+
body: buffer.toString('base64'),
|
|
77
|
+
isBase64: true
|
|
78
|
+
}).catch(() => {});
|
|
79
|
+
});
|
|
80
|
+
return true;
|
|
81
|
+
});
|
|
82
|
+
await this._page.exposeBinding('dispatch', false, (_, data) => this.emit('event', data));
|
|
83
|
+
this._page.once('close', () => {
|
|
84
|
+
this.emit('close');
|
|
85
|
+
this._page.context().close({
|
|
86
|
+
reason: 'Recorder window closed'
|
|
87
|
+
}).catch(() => {});
|
|
88
|
+
});
|
|
89
|
+
const mainFrame = this._page.mainFrame();
|
|
90
|
+
await mainFrame.goto((0, _instrumentation.serverSideCallMetadata)(), 'https://playwright/index.html');
|
|
91
|
+
}
|
|
92
|
+
static factory(context) {
|
|
93
|
+
return async recorder => {
|
|
94
|
+
if (process.env.PW_CODEGEN_NO_INSPECTOR) return new EmptyRecorderApp();
|
|
95
|
+
return await RecorderApp._open(recorder, context);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
static async _open(recorder, inspectedContext) {
|
|
99
|
+
const sdkLanguage = inspectedContext.attribution.playwright.options.sdkLanguage;
|
|
100
|
+
const headed = !!inspectedContext._browser.options.headful;
|
|
101
|
+
const recorderPlaywright = require('../playwright').createPlaywright({
|
|
102
|
+
sdkLanguage: 'javascript',
|
|
103
|
+
isInternalPlaywright: true
|
|
104
|
+
});
|
|
105
|
+
const {
|
|
106
|
+
context,
|
|
107
|
+
page
|
|
108
|
+
} = await (0, _launchApp.launchApp)(recorderPlaywright.chromium, {
|
|
109
|
+
sdkLanguage,
|
|
110
|
+
windowSize: {
|
|
111
|
+
width: 600,
|
|
112
|
+
height: 600
|
|
113
|
+
},
|
|
114
|
+
windowPosition: {
|
|
115
|
+
x: 1020,
|
|
116
|
+
y: 10
|
|
117
|
+
},
|
|
118
|
+
persistentContextOptions: {
|
|
119
|
+
noDefaultViewport: true,
|
|
120
|
+
headless: !!process.env.PWTEST_CLI_HEADLESS || (0, _utils.isUnderTest)() && !headed,
|
|
121
|
+
useWebSocket: (0, _utils.isUnderTest)(),
|
|
122
|
+
handleSIGINT: recorder.handleSIGINT,
|
|
123
|
+
executablePath: inspectedContext._browser.options.isChromium ? inspectedContext._browser.options.customExecutablePath : undefined
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
const controller = new _progress.ProgressController((0, _instrumentation.serverSideCallMetadata)(), context._browser);
|
|
127
|
+
await controller.run(async progress => {
|
|
128
|
+
await context._browser._defaultContext._loadDefaultContextAsIs(progress);
|
|
129
|
+
});
|
|
130
|
+
const result = new RecorderApp(recorder, page, context._browser.options.wsEndpoint);
|
|
131
|
+
await result._init();
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
async setMode(mode) {
|
|
135
|
+
await this._page.mainFrame().evaluateExpression((mode => {
|
|
136
|
+
window.playwrightSetMode(mode);
|
|
137
|
+
}).toString(), {
|
|
138
|
+
isFunction: true
|
|
139
|
+
}, mode).catch(() => {});
|
|
140
|
+
}
|
|
141
|
+
async setRunningFile(file) {
|
|
142
|
+
await this._page.mainFrame().evaluateExpression((file => {
|
|
143
|
+
window.playwrightSetRunningFile(file);
|
|
144
|
+
}).toString(), {
|
|
145
|
+
isFunction: true
|
|
146
|
+
}, file).catch(() => {});
|
|
147
|
+
}
|
|
148
|
+
async setPaused(paused) {
|
|
149
|
+
await this._page.mainFrame().evaluateExpression((paused => {
|
|
150
|
+
window.playwrightSetPaused(paused);
|
|
151
|
+
}).toString(), {
|
|
152
|
+
isFunction: true
|
|
153
|
+
}, paused).catch(() => {});
|
|
154
|
+
}
|
|
155
|
+
async setSources(sources) {
|
|
156
|
+
await this._page.mainFrame().evaluateExpression((sources => {
|
|
157
|
+
window.playwrightSetSources(sources);
|
|
158
|
+
}).toString(), {
|
|
159
|
+
isFunction: true
|
|
160
|
+
}, sources).catch(() => {});
|
|
161
|
+
|
|
162
|
+
// Testing harness for runCLI mode.
|
|
163
|
+
if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
|
|
164
|
+
if (process._didSetSourcesForTest(sources[0].text)) this.close();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async setActions(actions, sources) {}
|
|
168
|
+
async setSelector(selector, userGesture) {
|
|
169
|
+
if (userGesture) {
|
|
170
|
+
var _this$_recorder;
|
|
171
|
+
if (((_this$_recorder = this._recorder) === null || _this$_recorder === void 0 ? void 0 : _this$_recorder.mode()) === 'inspecting') {
|
|
172
|
+
this._recorder.setMode('standby');
|
|
173
|
+
this._page.bringToFront();
|
|
174
|
+
} else {
|
|
175
|
+
var _this$_recorder2;
|
|
176
|
+
(_this$_recorder2 = this._recorder) === null || _this$_recorder2 === void 0 || _this$_recorder2.setMode('recording');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
await this._page.mainFrame().evaluateExpression((data => {
|
|
180
|
+
window.playwrightSetSelector(data.selector, data.userGesture);
|
|
181
|
+
}).toString(), {
|
|
182
|
+
isFunction: true
|
|
183
|
+
}, {
|
|
184
|
+
selector,
|
|
185
|
+
userGesture
|
|
186
|
+
}).catch(() => {});
|
|
187
|
+
}
|
|
188
|
+
async updateCallLogs(callLogs) {
|
|
189
|
+
await this._page.mainFrame().evaluateExpression((callLogs => {
|
|
190
|
+
window.playwrightUpdateLogs(callLogs);
|
|
191
|
+
}).toString(), {
|
|
192
|
+
isFunction: true
|
|
193
|
+
}, callLogs).catch(() => {});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.RecorderApp = RecorderApp;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RecorderCollection = void 0;
|
|
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");
|
|
13
|
+
/**
|
|
14
|
+
* Copyright (c) Microsoft Corporation.
|
|
15
|
+
*
|
|
16
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
17
|
+
* you may not use this file except in compliance with the License.
|
|
18
|
+
* You may obtain a copy of the License at
|
|
19
|
+
*
|
|
20
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
21
|
+
*
|
|
22
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
23
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
24
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
25
|
+
* See the License for the specific language governing permissions and
|
|
26
|
+
* limitations under the License.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
class RecorderCollection extends _events.EventEmitter {
|
|
30
|
+
constructor(pageAliases) {
|
|
31
|
+
super();
|
|
32
|
+
this._actions = [];
|
|
33
|
+
this._enabled = false;
|
|
34
|
+
this._pageAliases = void 0;
|
|
35
|
+
this._pageAliases = pageAliases;
|
|
36
|
+
}
|
|
37
|
+
restart() {
|
|
38
|
+
this._actions = [];
|
|
39
|
+
this._fireChange();
|
|
40
|
+
}
|
|
41
|
+
setEnabled(enabled) {
|
|
42
|
+
this._enabled = enabled;
|
|
43
|
+
}
|
|
44
|
+
async performAction(actionInContext) {
|
|
45
|
+
await this._addAction(actionInContext, async callMetadata => {
|
|
46
|
+
await (0, _recorderRunner.performAction)(callMetadata, this._pageAliases, actionInContext);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
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(() => {});
|
|
56
|
+
}
|
|
57
|
+
async _addAction(actionInContext, callback) {
|
|
58
|
+
if (!this._enabled) return;
|
|
59
|
+
if (actionInContext.action.name === 'openPage' || actionInContext.action.name === 'closePage') {
|
|
60
|
+
this._actions.push(actionInContext);
|
|
61
|
+
this._fireChange();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const {
|
|
65
|
+
callMetadata,
|
|
66
|
+
mainFrame
|
|
67
|
+
} = (0, _recorderUtils.callMetadataForAction)(this._pageAliases, actionInContext);
|
|
68
|
+
await mainFrame.instrumentation.onBeforeCall(mainFrame, callMetadata);
|
|
69
|
+
this._actions.push(actionInContext);
|
|
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(() => {});
|
|
79
|
+
}
|
|
80
|
+
signal(pageAlias, frame, signal) {
|
|
81
|
+
if (!this._enabled) return;
|
|
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
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (this._actions.length) {
|
|
106
|
+
this._actions[this._actions.length - 1].action.signals.push(signal);
|
|
107
|
+
this._fireChange();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
_fireChange() {
|
|
112
|
+
if (!this._enabled) return;
|
|
113
|
+
this.emit('change', (0, _recorderUtils.collapseActions)(this._actions));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.RecorderCollection = RecorderCollection;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RecorderInTraceViewer = void 0;
|
|
7
|
+
var _path = _interopRequireDefault(require("path"));
|
|
8
|
+
var _events = require("events");
|
|
9
|
+
var _traceViewer = require("../trace/viewer/traceViewer");
|
|
10
|
+
var _manualPromise = require("../../utils/manualPromise");
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
/**
|
|
13
|
+
* Copyright (c) Microsoft Corporation.
|
|
14
|
+
*
|
|
15
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
16
|
+
* you may not use this file except in compliance with the License.
|
|
17
|
+
* You may obtain a copy of the License at
|
|
18
|
+
*
|
|
19
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
20
|
+
*
|
|
21
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
22
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
23
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
24
|
+
* See the License for the specific language governing permissions and
|
|
25
|
+
* limitations under the License.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
class RecorderInTraceViewer extends _events.EventEmitter {
|
|
29
|
+
static factory(context) {
|
|
30
|
+
return async recorder => {
|
|
31
|
+
const transport = new RecorderTransport();
|
|
32
|
+
const trace = _path.default.join(context._browser.options.tracesDir, 'trace');
|
|
33
|
+
const {
|
|
34
|
+
wsEndpointForTest,
|
|
35
|
+
tracePage,
|
|
36
|
+
traceServer
|
|
37
|
+
} = await openApp(trace, {
|
|
38
|
+
transport,
|
|
39
|
+
headless: !context._browser.options.headful
|
|
40
|
+
});
|
|
41
|
+
return new RecorderInTraceViewer(transport, tracePage, traceServer, wsEndpointForTest);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
constructor(transport, tracePage, traceServer, wsEndpointForTest) {
|
|
45
|
+
super();
|
|
46
|
+
this.wsEndpointForTest = void 0;
|
|
47
|
+
this._transport = void 0;
|
|
48
|
+
this._tracePage = void 0;
|
|
49
|
+
this._traceServer = void 0;
|
|
50
|
+
this._transport = transport;
|
|
51
|
+
this._transport.eventSink.resolve(this);
|
|
52
|
+
this._tracePage = tracePage;
|
|
53
|
+
this._traceServer = traceServer;
|
|
54
|
+
this.wsEndpointForTest = wsEndpointForTest;
|
|
55
|
+
this._tracePage.once('close', () => {
|
|
56
|
+
this.close();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async close() {
|
|
60
|
+
await this._tracePage.context().close({
|
|
61
|
+
reason: 'Recorder window closed'
|
|
62
|
+
});
|
|
63
|
+
await this._traceServer.stop();
|
|
64
|
+
}
|
|
65
|
+
async setPaused(paused) {
|
|
66
|
+
this._transport.deliverEvent('setPaused', {
|
|
67
|
+
paused
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async setMode(mode) {
|
|
71
|
+
this._transport.deliverEvent('setMode', {
|
|
72
|
+
mode
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async setRunningFile(file) {
|
|
76
|
+
this._transport.deliverEvent('setRunningFile', {
|
|
77
|
+
file
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async setSelector(selector, userGesture) {
|
|
81
|
+
this._transport.deliverEvent('setSelector', {
|
|
82
|
+
selector,
|
|
83
|
+
userGesture
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async updateCallLogs(callLogs) {
|
|
87
|
+
this._transport.deliverEvent('updateCallLogs', {
|
|
88
|
+
callLogs
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async setSources(sources) {
|
|
92
|
+
this._transport.deliverEvent('setSources', {
|
|
93
|
+
sources
|
|
94
|
+
});
|
|
95
|
+
if (process.env.PWTEST_CLI_IS_UNDER_TEST && sources.length) {
|
|
96
|
+
if (process._didSetSourcesForTest(sources[0].text)) this.close();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async setActions(actions, sources) {
|
|
100
|
+
this._transport.deliverEvent('setActions', {
|
|
101
|
+
actions,
|
|
102
|
+
sources
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.RecorderInTraceViewer = RecorderInTraceViewer;
|
|
107
|
+
async function openApp(trace, options) {
|
|
108
|
+
const traceServer = await (0, _traceViewer.startTraceViewerServer)(options);
|
|
109
|
+
await (0, _traceViewer.installRootRedirect)(traceServer, [trace], {
|
|
110
|
+
...options,
|
|
111
|
+
webApp: 'recorder.html'
|
|
112
|
+
});
|
|
113
|
+
const page = await (0, _traceViewer.openTraceViewerApp)(traceServer.urlPrefix('precise'), 'chromium', options);
|
|
114
|
+
return {
|
|
115
|
+
wsEndpointForTest: page.context()._browser.options.wsEndpoint,
|
|
116
|
+
tracePage: page,
|
|
117
|
+
traceServer
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
class RecorderTransport {
|
|
121
|
+
constructor() {
|
|
122
|
+
this._connected = new _manualPromise.ManualPromise();
|
|
123
|
+
this.eventSink = new _manualPromise.ManualPromise();
|
|
124
|
+
this.sendEvent = void 0;
|
|
125
|
+
this.close = void 0;
|
|
126
|
+
}
|
|
127
|
+
onconnect() {
|
|
128
|
+
this._connected.resolve();
|
|
129
|
+
}
|
|
130
|
+
async dispatch(method, params) {
|
|
131
|
+
const eventSink = await this.eventSink;
|
|
132
|
+
eventSink.emit('event', {
|
|
133
|
+
event: method,
|
|
134
|
+
params
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
onclose() {}
|
|
138
|
+
deliverEvent(method, params) {
|
|
139
|
+
this._connected.then(() => {
|
|
140
|
+
var _this$sendEvent;
|
|
141
|
+
return (_this$sendEvent = this.sendEvent) === null || _this$sendEvent === void 0 ? void 0 : _this$sendEvent.call(this, method, params);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.performAction = performAction;
|
|
7
|
+
exports.toClickOptions = toClickOptions;
|
|
8
|
+
var _utils = require("../../utils");
|
|
9
|
+
var _language = require("../codegen/language");
|
|
10
|
+
var _recorderUtils = require("./recorderUtils");
|
|
11
|
+
var _recorderUtils2 = require("../../utils/isomorphic/recorderUtils");
|
|
12
|
+
/**
|
|
13
|
+
* Copyright (c) Microsoft Corporation.
|
|
14
|
+
*
|
|
15
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
16
|
+
* you may not use this file except in compliance with the License.
|
|
17
|
+
* You may obtain a copy of the License at
|
|
18
|
+
*
|
|
19
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
20
|
+
*
|
|
21
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
22
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
23
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
24
|
+
* See the License for the specific language governing permissions and
|
|
25
|
+
* limitations under the License.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
async function performAction(callMetadata, pageAliases, actionInContext) {
|
|
29
|
+
const mainFrame = (0, _recorderUtils.mainFrameForAction)(pageAliases, actionInContext);
|
|
30
|
+
const {
|
|
31
|
+
action
|
|
32
|
+
} = actionInContext;
|
|
33
|
+
const kActionTimeout = 5000;
|
|
34
|
+
if (action.name === 'navigate') {
|
|
35
|
+
await mainFrame.goto(callMetadata, action.url, {
|
|
36
|
+
timeout: kActionTimeout
|
|
37
|
+
});
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (action.name === 'openPage') throw Error('Not reached');
|
|
41
|
+
if (action.name === 'closePage') {
|
|
42
|
+
await mainFrame._page.close(callMetadata);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const selector = (0, _recorderUtils2.buildFullSelector)(actionInContext.frame.framePath, action.selector);
|
|
46
|
+
if (action.name === 'click') {
|
|
47
|
+
const options = toClickOptions(action);
|
|
48
|
+
await mainFrame.click(callMetadata, selector, {
|
|
49
|
+
...options,
|
|
50
|
+
timeout: kActionTimeout,
|
|
51
|
+
strict: true
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (action.name === 'press') {
|
|
56
|
+
const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
|
|
57
|
+
const shortcut = [...modifiers, action.key].join('+');
|
|
58
|
+
await mainFrame.press(callMetadata, selector, shortcut, {
|
|
59
|
+
timeout: kActionTimeout,
|
|
60
|
+
strict: true
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (action.name === 'fill') {
|
|
65
|
+
await mainFrame.fill(callMetadata, selector, action.text, {
|
|
66
|
+
timeout: kActionTimeout,
|
|
67
|
+
strict: true
|
|
68
|
+
});
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (action.name === 'setInputFiles') {
|
|
72
|
+
await mainFrame.setInputFiles(callMetadata, selector, {
|
|
73
|
+
selector,
|
|
74
|
+
payloads: [],
|
|
75
|
+
timeout: kActionTimeout,
|
|
76
|
+
strict: true
|
|
77
|
+
});
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (action.name === 'check') {
|
|
81
|
+
await mainFrame.check(callMetadata, selector, {
|
|
82
|
+
timeout: kActionTimeout,
|
|
83
|
+
strict: true
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (action.name === 'uncheck') {
|
|
88
|
+
await mainFrame.uncheck(callMetadata, selector, {
|
|
89
|
+
timeout: kActionTimeout,
|
|
90
|
+
strict: true
|
|
91
|
+
});
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (action.name === 'select') {
|
|
95
|
+
const values = action.options.map(value => ({
|
|
96
|
+
value
|
|
97
|
+
}));
|
|
98
|
+
await mainFrame.selectOption(callMetadata, selector, [], values, {
|
|
99
|
+
timeout: kActionTimeout,
|
|
100
|
+
strict: true
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (action.name === 'assertChecked') {
|
|
105
|
+
await mainFrame.expect(callMetadata, selector, {
|
|
106
|
+
selector,
|
|
107
|
+
expression: 'to.be.checked',
|
|
108
|
+
isNot: !action.checked,
|
|
109
|
+
timeout: kActionTimeout
|
|
110
|
+
});
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (action.name === 'assertText') {
|
|
114
|
+
await mainFrame.expect(callMetadata, selector, {
|
|
115
|
+
selector,
|
|
116
|
+
expression: 'to.have.text',
|
|
117
|
+
expectedText: (0, _utils.serializeExpectedTextValues)([action.text], {
|
|
118
|
+
matchSubstring: true,
|
|
119
|
+
normalizeWhiteSpace: true
|
|
120
|
+
}),
|
|
121
|
+
isNot: false,
|
|
122
|
+
timeout: kActionTimeout
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (action.name === 'assertValue') {
|
|
127
|
+
await mainFrame.expect(callMetadata, selector, {
|
|
128
|
+
selector,
|
|
129
|
+
expression: 'to.have.value',
|
|
130
|
+
expectedValue: action.value,
|
|
131
|
+
isNot: false,
|
|
132
|
+
timeout: kActionTimeout
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (action.name === 'assertVisible') {
|
|
137
|
+
await mainFrame.expect(callMetadata, selector, {
|
|
138
|
+
selector,
|
|
139
|
+
expression: 'to.be.visible',
|
|
140
|
+
isNot: false,
|
|
141
|
+
timeout: kActionTimeout
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
throw new Error('Internal error: unexpected action ' + action.name);
|
|
146
|
+
}
|
|
147
|
+
function toClickOptions(action) {
|
|
148
|
+
const modifiers = (0, _language.toKeyboardModifiers)(action.modifiers);
|
|
149
|
+
const options = {};
|
|
150
|
+
if (action.button !== 'left') options.button = action.button;
|
|
151
|
+
if (modifiers.length) options.modifiers = modifiers;
|
|
152
|
+
if (action.clickCount > 1) options.clickCount = action.clickCount;
|
|
153
|
+
if (action.position) options.position = action.position;
|
|
154
|
+
return options;
|
|
155
|
+
}
|