@checkly/playwright-core 1.51.17-beta.1 → 1.54.2-beta.0
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 +65 -123
- package/browsers.json +16 -14
- package/index.js +1 -1
- package/lib/androidServerImpl.js +47 -50
- package/lib/browserServerImpl.js +89 -69
- package/lib/checkly/escapeRegExp.js +23 -27
- package/lib/checkly/fetch.js +64 -46
- package/lib/checkly/secretsFilter.js +49 -36
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +400 -359
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +151 -242
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +96 -71
- package/lib/client/browserContext.js +314 -345
- package/lib/client/browserType.js +103 -127
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +90 -113
- package/lib/client/clientHelper.js +48 -39
- package/lib/client/clientInstrumentation.js +40 -37
- package/lib/client/clientStackTrace.js +41 -37
- package/lib/client/clock.js +36 -36
- package/lib/client/connection.js +188 -214
- package/lib/client/consoleMessage.js +31 -28
- package/lib/client/coverage.js +25 -22
- package/lib/client/dialog.js +30 -31
- package/lib/client/download.js +25 -25
- package/lib/client/electron.js +80 -77
- package/lib/client/elementHandle.js +120 -159
- package/lib/client/errors.js +53 -53
- package/lib/client/eventEmitter.js +124 -121
- package/lib/client/events.js +72 -68
- package/lib/client/fetch.js +166 -190
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +207 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +42 -69
- package/lib/client/jsHandle.js +54 -69
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -29
- package/lib/client/locator.js +145 -237
- package/lib/client/network.js +282 -307
- package/lib/client/page.js +269 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -76
- package/lib/client/selectors.js +45 -63
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +55 -41
- package/lib/client/tracing.js +49 -96
- package/lib/client/types.js +26 -22
- package/lib/client/video.js +35 -27
- package/lib/client/waiter.js +69 -88
- package/lib/client/webError.js +25 -23
- package/lib/client/webSocket.js +43 -56
- package/lib/client/worker.js +48 -56
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/bindingsControllerSource.js +28 -0
- package/lib/generated/clockSource.js +26 -6
- package/lib/generated/consoleApiSource.js +26 -6
- package/lib/generated/injectedScriptSource.js +26 -6
- package/lib/generated/pollingRecorderSource.js +26 -6
- package/lib/generated/storageScriptSource.js +28 -0
- package/lib/generated/utilityScriptSource.js +26 -6
- package/lib/generated/webSocketMockSource.js +333 -5
- package/lib/inProcessFactory.js +51 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +51 -46
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2807 -2739
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +88 -242
- package/lib/remote/playwrightServer.js +305 -92
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +251 -241
- package/lib/server/android/backendAdb.js +87 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +297 -158
- package/lib/server/bidi/bidiChromium.js +119 -89
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +129 -113
- package/lib/server/bidi/bidiFirefox.js +86 -76
- package/lib/server/bidi/bidiInput.js +106 -117
- package/lib/server/bidi/bidiNetworkManager.js +142 -159
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +260 -260
- package/lib/server/bidi/bidiPdf.js +52 -86
- package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
- package/lib/server/bidi/third_party/bidiDeserializer.js +55 -50
- package/lib/server/bidi/third_party/bidiKeyboard.js +236 -220
- package/lib/server/bidi/third_party/bidiProtocol.js +22 -137
- package/lib/server/bidi/third_party/bidiProtocolCore.js +152 -0
- package/lib/server/bidi/third_party/bidiProtocolPermissions.js +42 -0
- package/lib/server/bidi/third_party/bidiSerializer.js +67 -63
- package/lib/server/bidi/third_party/firefoxPrefs.js +141 -119
- package/lib/server/browser.js +93 -95
- package/lib/server/browserContext.js +419 -429
- package/lib/server/browserType.js +186 -216
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +235 -203
- package/lib/server/chromium/chromiumSwitches.js +100 -67
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +310 -292
- package/lib/server/chromium/crConnection.js +95 -121
- package/lib/server/chromium/crCoverage.js +121 -131
- package/lib/server/chromium/crDevTools.js +60 -51
- package/lib/server/chromium/crDragDrop.js +68 -84
- package/lib/server/chromium/crExecutionContext.js +89 -83
- package/lib/server/chromium/crInput.js +118 -113
- package/lib/server/chromium/crNetworkManager.js +274 -375
- package/lib/server/chromium/crPage.js +536 -593
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +84 -73
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +66 -99
- package/lib/server/clock.js +107 -83
- package/lib/server/codegen/csharp.js +192 -162
- package/lib/server/codegen/java.js +156 -129
- package/lib/server/codegen/javascript.js +163 -148
- package/lib/server/codegen/jsonl.js +32 -28
- package/lib/server/codegen/language.js +75 -52
- package/lib/server/codegen/languages.js +65 -27
- package/lib/server/codegen/python.js +141 -126
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +108 -86
- package/lib/server/debugController.js +147 -151
- package/lib/server/debugger.js +86 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +238 -128
- package/lib/server/dialog.js +84 -39
- package/lib/server/dispatchers/androidDispatcher.js +257 -148
- package/lib/server/dispatchers/artifactDispatcher.js +79 -79
- package/lib/server/dispatchers/browserContextDispatcher.js +289 -259
- package/lib/server/dispatchers/browserDispatcher.js +96 -148
- package/lib/server/dispatchers/browserTypeDispatcher.js +50 -41
- package/lib/server/dispatchers/cdpSessionDispatcher.js +35 -39
- package/lib/server/dispatchers/debugControllerDispatcher.js +65 -83
- package/lib/server/dispatchers/dialogDispatcher.js +34 -31
- package/lib/server/dispatchers/dispatcher.js +208 -248
- package/lib/server/dispatchers/electronDispatcher.js +66 -70
- package/lib/server/dispatchers/elementHandlerDispatcher.js +164 -216
- package/lib/server/dispatchers/frameDispatcher.js +211 -272
- package/lib/server/dispatchers/jsHandleDispatcher.js +63 -75
- package/lib/server/dispatchers/jsonPipeDispatcher.js +37 -38
- package/lib/server/dispatchers/localUtilsDispatcher.js +121 -119
- package/lib/server/dispatchers/networkDispatchers.js +117 -128
- package/lib/server/dispatchers/pageDispatcher.js +256 -248
- package/lib/server/dispatchers/playwrightDispatcher.js +92 -87
- package/lib/server/dispatchers/streamDispatcher.js +52 -48
- package/lib/server/dispatchers/tracingDispatcher.js +47 -52
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +126 -150
- package/lib/server/dispatchers/writableStreamDispatcher.js +65 -43
- package/lib/server/dom.js +485 -582
- package/lib/server/download.js +47 -37
- package/lib/server/electron/electron.js +216 -243
- package/lib/server/electron/loader.js +9 -37
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +317 -360
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +66 -60
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +268 -305
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +92 -73
- package/lib/server/firefox/ffInput.js +82 -84
- package/lib/server/firefox/ffNetworkManager.js +137 -114
- package/lib/server/firefox/ffPage.js +261 -293
- package/lib/server/firefox/firefox.js +80 -72
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +98 -114
- package/lib/server/frames.js +845 -1055
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +290 -223
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +55 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +151 -189
- package/lib/server/instrumentation.js +57 -44
- package/lib/server/javascript.js +133 -134
- package/lib/server/launchApp.js +113 -75
- package/lib/server/localUtils.js +150 -142
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +299 -303
- package/lib/server/page.js +513 -544
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +58 -67
- package/lib/server/progress.js +137 -68
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/recorderApp.js +341 -176
- package/lib/server/recorder/recorderInTraceViewer.js +65 -94
- package/lib/server/recorder/recorderRunner.js +93 -116
- package/lib/server/recorder/recorderSignalProcessor.js +83 -0
- package/lib/server/recorder/recorderUtils.js +104 -47
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +395 -275
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +930 -803
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +160 -191
- package/lib/server/selectors.js +90 -51
- package/lib/server/socksClientCertificatesInterceptor.js +171 -186
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/trace/recorder/snapshotter.js +76 -102
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +354 -362
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +160 -147
- package/lib/server/transport.js +119 -134
- package/lib/server/types.js +26 -22
- package/lib/server/usKeyboardLayout.js +135 -545
- package/lib/server/utils/ascii.js +39 -26
- package/lib/server/utils/comparators.js +105 -103
- package/lib/server/utils/crypto.js +157 -112
- package/lib/server/utils/debug.js +36 -32
- package/lib/server/utils/debugLogger.js +77 -48
- package/lib/server/utils/env.js +52 -37
- package/lib/server/utils/eventsHelper.js +29 -28
- package/lib/server/utils/expectUtils.js +31 -26
- package/lib/server/utils/fileUtils.js +123 -136
- package/lib/server/utils/happyEyeballs.js +141 -126
- package/lib/server/utils/hostPlatform.js +84 -120
- package/lib/server/utils/httpServer.js +106 -121
- package/lib/server/utils/image_tools/colorUtils.js +42 -51
- package/lib/server/utils/image_tools/compare.js +44 -43
- package/lib/server/utils/image_tools/imageChannel.js +38 -30
- package/lib/server/utils/image_tools/stats.js +40 -40
- package/lib/server/utils/linuxUtils.js +50 -37
- package/lib/server/utils/network.js +152 -96
- package/lib/server/utils/nodePlatform.js +87 -79
- package/lib/server/utils/pipeTransport.js +44 -42
- package/lib/server/utils/processLauncher.js +111 -121
- package/lib/server/utils/profiler.js +52 -39
- package/lib/server/utils/socksProxy.js +280 -339
- package/lib/server/utils/spawnAsync.js +37 -41
- package/lib/server/utils/task.js +31 -38
- package/lib/server/utils/userAgent.js +73 -66
- package/lib/server/utils/wsServer.js +68 -75
- package/lib/server/utils/zipFile.js +36 -37
- package/lib/server/utils/zones.js +37 -34
- package/lib/server/webkit/protocol.d.js +16 -0
- package/lib/server/webkit/webkit.js +77 -61
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +193 -184
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +85 -70
- package/lib/server/webkit/wkInput.js +97 -95
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +568 -667
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +79 -79
- package/lib/utils/expectUtils.js +31 -26
- package/lib/utils/isomorphic/ariaSnapshot.js +149 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +120 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +358 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +46 -39
- package/lib/utils/isomorphic/mimeType.js +447 -25
- package/lib/utils/isomorphic/multimap.js +34 -27
- package/lib/utils/isomorphic/protocolFormatter.js +68 -0
- package/lib/utils/isomorphic/protocolMetainfo.js +321 -0
- package/lib/utils/isomorphic/recorderUtils.js +140 -181
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +182 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +98 -112
- package/lib/utils/isomorphic/time.js +46 -22
- package/lib/utils/isomorphic/timeoutRunner.js +53 -53
- package/lib/utils/isomorphic/traceUtils.js +37 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +113 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +251 -0
- package/lib/utils.js +101 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/utilsBundleImpl/index.js +160 -150
- package/lib/zipBundle.js +32 -23
- package/lib/zipBundleImpl.js +4 -4
- package/package.json +1 -1
- package/types/protocol.d.ts +1267 -1057
- package/types/types.d.ts +131 -29
- package/lib/common/socksProxy.js +0 -569
- package/lib/common/timeoutSettings.js +0 -73
- package/lib/common/types.js +0 -5
- package/lib/image_tools/colorUtils.js +0 -98
- package/lib/image_tools/compare.js +0 -108
- package/lib/image_tools/imageChannel.js +0 -70
- package/lib/image_tools/stats.js +0 -102
- package/lib/protocol/debug.js +0 -27
- package/lib/protocol/transport.js +0 -82
- package/lib/server/dispatchers/selectorsDispatcher.js +0 -36
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/server/recorder/contextRecorder.js +0 -290
- package/lib/server/recorder/recorderCollection.js +0 -104
- package/lib/server/recorder/recorderFrontend.js +0 -5
- package/lib/server/storageScript.js +0 -160
- package/lib/server/timeoutSettings.js +0 -74
- package/lib/third_party/diff_match_patch.js +0 -2222
- package/lib/utils/ascii.js +0 -31
- package/lib/utils/comparators.js +0 -171
- package/lib/utils/crypto.js +0 -174
- package/lib/utils/debug.js +0 -46
- package/lib/utils/debugLogger.js +0 -91
- package/lib/utils/env.js +0 -49
- package/lib/utils/eventsHelper.js +0 -38
- package/lib/utils/fileUtils.js +0 -205
- package/lib/utils/happy-eyeballs.js +0 -210
- package/lib/utils/headers.js +0 -52
- package/lib/utils/hostPlatform.js +0 -133
- package/lib/utils/httpServer.js +0 -237
- package/lib/utils/index.js +0 -368
- package/lib/utils/linuxUtils.js +0 -78
- package/lib/utils/manualPromise.js +0 -109
- package/lib/utils/multimap.js +0 -75
- package/lib/utils/network.js +0 -160
- package/lib/utils/processLauncher.js +0 -248
- package/lib/utils/profiler.js +0 -53
- package/lib/utils/rtti.js +0 -44
- package/lib/utils/semaphore.js +0 -51
- package/lib/utils/spawnAsync.js +0 -45
- package/lib/utils/stackTrace.js +0 -121
- package/lib/utils/task.js +0 -58
- package/lib/utils/time.js +0 -37
- package/lib/utils/timeoutRunner.js +0 -66
- package/lib/utils/traceUtils.js +0 -44
- package/lib/utils/userAgent.js +0 -105
- package/lib/utils/wsServer.js +0 -127
- package/lib/utils/zipFile.js +0 -75
- package/lib/utils/zones.js +0 -62
- package/lib/vite/htmlReport/index.html +0 -69
- package/lib/vite/recorder/assets/codeMirrorModule-DrMbgOIo.js +0 -16684
- package/lib/vite/recorder/assets/codeMirrorModule-DuST8d_k.css +0 -344
- package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- package/lib/vite/recorder/assets/index-5NM3V7eb.css +0 -2524
- package/lib/vite/recorder/assets/index-CT-scFHn.js +0 -16848
- package/lib/vite/recorder/index.html +0 -29
- package/lib/vite/recorder/playwright-logo.svg +0 -9
- package/lib/vite/traceViewer/assets/codeMirrorModule-CB-2okZ8.js +0 -16684
- package/lib/vite/traceViewer/assets/defaultSettingsView-CBiB4avC.js +0 -217
- package/lib/vite/traceViewer/assets/inspectorTab-CwgfffWb.js +0 -25143
- package/lib/vite/traceViewer/assets/workbench-CWZselvp.js +0 -2470
- package/lib/vite/traceViewer/assets/xtermModule-Es_gt_u7.js +0 -5994
- package/lib/vite/traceViewer/codeMirrorModule.DuST8d_k.css +0 -344
- package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- package/lib/vite/traceViewer/defaultSettingsView.Dp3b_92q.css +0 -41
- package/lib/vite/traceViewer/embedded.BeldSa2G.css +0 -68
- package/lib/vite/traceViewer/embedded.gzudoghF.js +0 -106
- package/lib/vite/traceViewer/embedded.html +0 -18
- package/lib/vite/traceViewer/index.DilotR1h.js +0 -314
- package/lib/vite/traceViewer/index.QewjJ85u.css +0 -131
- package/lib/vite/traceViewer/index.html +0 -47
- package/lib/vite/traceViewer/inspectorTab.DnGm18kV.css +0 -3178
- package/lib/vite/traceViewer/playwright-logo.svg +0 -9
- package/lib/vite/traceViewer/recorder.DLgqV9db.css +0 -15
- package/lib/vite/traceViewer/recorder.DVrkq3Um.js +0 -551
- package/lib/vite/traceViewer/recorder.html +0 -17
- package/lib/vite/traceViewer/snapshot.html +0 -21
- package/lib/vite/traceViewer/sw.bundle.js +0 -3
- package/lib/vite/traceViewer/uiMode.C9_OcpPU.js +0 -1756
- package/lib/vite/traceViewer/uiMode.c5ORgcrX.css +0 -1424
- package/lib/vite/traceViewer/uiMode.html +0 -21
- package/lib/vite/traceViewer/workbench.xUZSA8PY.css +0 -787
- package/lib/vite/traceViewer/xtermModule.EsaqrrTX.css +0 -209
package/lib/server/dom.js
CHANGED
|
@@ -1,121 +1,118 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty
|
|
4
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var dom_exports = {};
|
|
30
|
+
__export(dom_exports, {
|
|
31
|
+
ElementHandle: () => ElementHandle,
|
|
32
|
+
FrameExecutionContext: () => FrameExecutionContext,
|
|
33
|
+
NonRecoverableDOMError: () => NonRecoverableDOMError,
|
|
34
|
+
assertDone: () => assertDone,
|
|
35
|
+
isNonRecoverableDOMError: () => isNonRecoverableDOMError,
|
|
36
|
+
kUnableToAdoptErrorMessage: () => kUnableToAdoptErrorMessage,
|
|
37
|
+
throwElementIsNotAttached: () => throwElementIsNotAttached,
|
|
38
|
+
throwRetargetableDOMError: () => throwRetargetableDOMError
|
|
5
39
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
var _progress = require("./progress");
|
|
15
|
-
var _utils = require("../utils");
|
|
16
|
-
var _fileUploadUtils = require("./fileUploadUtils");
|
|
17
|
-
var _protocolError = require("./protocolError");
|
|
18
|
-
var injectedScriptSource = _interopRequireWildcard(require("../generated/injectedScriptSource"));
|
|
19
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
20
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
|
-
/**
|
|
23
|
-
* Copyright (c) Microsoft Corporation.
|
|
24
|
-
*
|
|
25
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
26
|
-
* you may not use this file except in compliance with the License.
|
|
27
|
-
* You may obtain a copy of the License at
|
|
28
|
-
*
|
|
29
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
30
|
-
*
|
|
31
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
32
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
33
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
34
|
-
* See the License for the specific language governing permissions and
|
|
35
|
-
* limitations under the License.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
class NonRecoverableDOMError extends Error {}
|
|
39
|
-
exports.NonRecoverableDOMError = NonRecoverableDOMError;
|
|
40
|
+
module.exports = __toCommonJS(dom_exports);
|
|
41
|
+
var import_fs = __toESM(require("fs"));
|
|
42
|
+
var js = __toESM(require("./javascript"));
|
|
43
|
+
var import_utils = require("../utils");
|
|
44
|
+
var import_fileUploadUtils = require("./fileUploadUtils");
|
|
45
|
+
var rawInjectedScriptSource = __toESM(require("../generated/injectedScriptSource"));
|
|
46
|
+
class NonRecoverableDOMError extends Error {
|
|
47
|
+
}
|
|
40
48
|
function isNonRecoverableDOMError(error) {
|
|
41
49
|
return error instanceof NonRecoverableDOMError;
|
|
42
50
|
}
|
|
43
51
|
class FrameExecutionContext extends js.ExecutionContext {
|
|
44
52
|
constructor(delegate, frame, world) {
|
|
45
|
-
super(frame, delegate, world ||
|
|
46
|
-
this.frame = void 0;
|
|
47
|
-
this._injectedScriptPromise = void 0;
|
|
48
|
-
this.world = void 0;
|
|
53
|
+
super(frame, delegate, world || "content-script");
|
|
49
54
|
this.frame = frame;
|
|
50
55
|
this.world = world;
|
|
51
56
|
}
|
|
52
57
|
adoptIfNeeded(handle) {
|
|
53
|
-
if (handle instanceof ElementHandle && handle._context !== this)
|
|
58
|
+
if (handle instanceof ElementHandle && handle._context !== this)
|
|
59
|
+
return this.frame._page.delegate.adoptElementHandle(handle, this);
|
|
54
60
|
return null;
|
|
55
61
|
}
|
|
56
62
|
async evaluate(pageFunction, arg) {
|
|
57
|
-
return js.evaluate(this, true
|
|
63
|
+
return js.evaluate(this, true, pageFunction, arg);
|
|
58
64
|
}
|
|
59
65
|
async evaluateHandle(pageFunction, arg) {
|
|
60
|
-
return js.evaluate(this, false
|
|
66
|
+
return js.evaluate(this, false, pageFunction, arg);
|
|
61
67
|
}
|
|
62
68
|
async evaluateExpression(expression, options, arg) {
|
|
63
|
-
return js.evaluateExpression(this, expression, {
|
|
64
|
-
...options,
|
|
65
|
-
returnByValue: true
|
|
66
|
-
}, arg);
|
|
69
|
+
return js.evaluateExpression(this, expression, { ...options, returnByValue: true }, arg);
|
|
67
70
|
}
|
|
68
71
|
async evaluateExpressionHandle(expression, options, arg) {
|
|
69
|
-
return js.evaluateExpression(this, expression, {
|
|
70
|
-
...options,
|
|
71
|
-
returnByValue: false
|
|
72
|
-
}, arg);
|
|
72
|
+
return js.evaluateExpression(this, expression, { ...options, returnByValue: false }, arg);
|
|
73
73
|
}
|
|
74
74
|
injectedScript() {
|
|
75
75
|
if (!this._injectedScriptPromise) {
|
|
76
|
-
const
|
|
77
|
-
const selectorsRegistry = this.frame._page.
|
|
78
|
-
for (const [name, {
|
|
79
|
-
source
|
|
80
|
-
|
|
81
|
-
const
|
|
76
|
+
const customEngines = [];
|
|
77
|
+
const selectorsRegistry = this.frame._page.browserContext.selectors();
|
|
78
|
+
for (const [name, { source: source2 }] of selectorsRegistry._engines)
|
|
79
|
+
customEngines.push({ name, source: `(${source2})` });
|
|
80
|
+
const sdkLanguage = this.frame._page.browserContext._browser.sdkLanguage();
|
|
81
|
+
const options = {
|
|
82
|
+
isUnderTest: (0, import_utils.isUnderTest)(),
|
|
83
|
+
sdkLanguage,
|
|
84
|
+
testIdAttributeName: selectorsRegistry.testIdAttributeName(),
|
|
85
|
+
stableRafCount: this.frame._page.delegate.rafCountForStablePosition(),
|
|
86
|
+
browserName: this.frame._page.browserContext._browser.options.name,
|
|
87
|
+
customEngines
|
|
88
|
+
};
|
|
82
89
|
const source = `
|
|
83
90
|
(() => {
|
|
84
91
|
const module = {};
|
|
85
|
-
${
|
|
86
|
-
return new (module.exports.InjectedScript())(
|
|
87
|
-
globalThis,
|
|
88
|
-
${(0, _utils.isUnderTest)()},
|
|
89
|
-
"${sdkLanguage}",
|
|
90
|
-
${JSON.stringify(selectorsRegistry.testIdAttributeName())},
|
|
91
|
-
${this.frame._page._delegate.rafCountForStablePosition()},
|
|
92
|
-
"${this.frame._page._browserContext._browser.options.name}",
|
|
93
|
-
[${custom.join(',\n')}]
|
|
94
|
-
);
|
|
92
|
+
${rawInjectedScriptSource.source}
|
|
93
|
+
return new (module.exports.InjectedScript())(globalThis, ${JSON.stringify(options)});
|
|
95
94
|
})();
|
|
96
95
|
`;
|
|
97
|
-
this._injectedScriptPromise = this.rawEvaluateHandle(source).then(handle => {
|
|
98
|
-
handle._setPreview(
|
|
96
|
+
this._injectedScriptPromise = this.rawEvaluateHandle(source).then((handle) => {
|
|
97
|
+
handle._setPreview("InjectedScript");
|
|
99
98
|
return handle;
|
|
100
99
|
});
|
|
101
100
|
}
|
|
102
101
|
return this._injectedScriptPromise;
|
|
103
102
|
}
|
|
104
103
|
}
|
|
105
|
-
exports.FrameExecutionContext = FrameExecutionContext;
|
|
106
104
|
class ElementHandle extends js.JSHandle {
|
|
107
105
|
constructor(context, objectId) {
|
|
108
|
-
super(context,
|
|
106
|
+
super(context, "node", void 0, objectId);
|
|
109
107
|
this.__elementhandle = true;
|
|
110
|
-
this._page = void 0;
|
|
111
|
-
this._frame = void 0;
|
|
112
108
|
this._page = context.frame._page;
|
|
113
109
|
this._frame = context.frame;
|
|
114
|
-
this._initializePreview().catch(e => {
|
|
110
|
+
this._initializePreview().catch((e) => {
|
|
111
|
+
});
|
|
115
112
|
}
|
|
116
113
|
async _initializePreview() {
|
|
117
114
|
const utility = await this._context.injectedScript();
|
|
118
|
-
this._setPreview(await utility.evaluate((injected, e) =>
|
|
115
|
+
this._setPreview(await utility.evaluate((injected, e) => "JSHandle@" + injected.previewNode(e), this));
|
|
119
116
|
}
|
|
120
117
|
asElement() {
|
|
121
118
|
return this;
|
|
@@ -125,8 +122,9 @@ class ElementHandle extends js.JSHandle {
|
|
|
125
122
|
const utility = await this._frame._utilityContext();
|
|
126
123
|
return await utility.evaluate(pageFunction, [await utility.injectedScript(), this, arg]);
|
|
127
124
|
} catch (e) {
|
|
128
|
-
if (
|
|
129
|
-
|
|
125
|
+
if (this._frame.isNonRetriableError(e))
|
|
126
|
+
throw e;
|
|
127
|
+
return "error:notconnected";
|
|
130
128
|
}
|
|
131
129
|
}
|
|
132
130
|
async evaluateHandleInUtility(pageFunction, arg) {
|
|
@@ -134,86 +132,82 @@ class ElementHandle extends js.JSHandle {
|
|
|
134
132
|
const utility = await this._frame._utilityContext();
|
|
135
133
|
return await utility.evaluateHandle(pageFunction, [await utility.injectedScript(), this, arg]);
|
|
136
134
|
} catch (e) {
|
|
137
|
-
if (
|
|
138
|
-
|
|
135
|
+
if (this._frame.isNonRetriableError(e))
|
|
136
|
+
throw e;
|
|
137
|
+
return "error:notconnected";
|
|
139
138
|
}
|
|
140
139
|
}
|
|
141
140
|
async ownerFrame() {
|
|
142
|
-
const frameId = await this._page.
|
|
143
|
-
if (!frameId)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
141
|
+
const frameId = await this._page.delegate.getOwnerFrame(this);
|
|
142
|
+
if (!frameId)
|
|
143
|
+
return null;
|
|
144
|
+
const frame = this._page.frameManager.frame(frameId);
|
|
145
|
+
if (frame)
|
|
146
|
+
return frame;
|
|
147
|
+
for (const page of this._page.browserContext.pages()) {
|
|
148
|
+
const frame2 = page.frameManager.frame(frameId);
|
|
149
|
+
if (frame2)
|
|
150
|
+
return frame2;
|
|
149
151
|
}
|
|
150
152
|
return null;
|
|
151
153
|
}
|
|
152
154
|
async isIframeElement() {
|
|
153
|
-
return this.evaluateInUtility(([injected, node]) => node && (node.nodeName ===
|
|
155
|
+
return this.evaluateInUtility(([injected, node]) => node && (node.nodeName === "IFRAME" || node.nodeName === "FRAME"), {});
|
|
154
156
|
}
|
|
155
157
|
async contentFrame() {
|
|
156
158
|
const isFrameElement = throwRetargetableDOMError(await this.isIframeElement());
|
|
157
|
-
if (!isFrameElement)
|
|
158
|
-
|
|
159
|
+
if (!isFrameElement)
|
|
160
|
+
return null;
|
|
161
|
+
return this._page.delegate.getContentFrame(this);
|
|
159
162
|
}
|
|
160
|
-
async
|
|
161
|
-
|
|
162
|
-
return injected.generateSelectorSimple(node);
|
|
163
|
-
}, {});
|
|
164
|
-
if (selector === 'error:notconnected') return;
|
|
165
|
-
return (0, _utils.asLocator)('javascript', selector);
|
|
166
|
-
}
|
|
167
|
-
async getAttribute(metadata, name) {
|
|
168
|
-
return this._frame.getAttribute(metadata, ':scope', name, {}, this);
|
|
163
|
+
async getAttribute(progress, name) {
|
|
164
|
+
return this._frame.getAttribute(progress, ":scope", name, {}, this);
|
|
169
165
|
}
|
|
170
|
-
async inputValue(
|
|
171
|
-
return this._frame.inputValue(
|
|
166
|
+
async inputValue(progress) {
|
|
167
|
+
return this._frame.inputValue(progress, ":scope", {}, this);
|
|
172
168
|
}
|
|
173
|
-
async textContent(
|
|
174
|
-
return this._frame.textContent(
|
|
169
|
+
async textContent(progress) {
|
|
170
|
+
return this._frame.textContent(progress, ":scope", {}, this);
|
|
175
171
|
}
|
|
176
|
-
async innerText(
|
|
177
|
-
return this._frame.innerText(
|
|
172
|
+
async innerText(progress) {
|
|
173
|
+
return this._frame.innerText(progress, ":scope", {}, this);
|
|
178
174
|
}
|
|
179
|
-
async innerHTML(
|
|
180
|
-
return this._frame.innerHTML(
|
|
175
|
+
async innerHTML(progress) {
|
|
176
|
+
return this._frame.innerHTML(progress, ":scope", {}, this);
|
|
181
177
|
}
|
|
182
|
-
async dispatchEvent(
|
|
183
|
-
return this._frame.dispatchEvent(
|
|
178
|
+
async dispatchEvent(progress, type, eventInit = {}) {
|
|
179
|
+
return this._frame.dispatchEvent(progress, ":scope", type, eventInit, {}, this);
|
|
184
180
|
}
|
|
185
|
-
async _scrollRectIntoViewIfNeeded(rect) {
|
|
186
|
-
return await this._page.
|
|
181
|
+
async _scrollRectIntoViewIfNeeded(progress, rect) {
|
|
182
|
+
return await progress.race(this._page.delegate.scrollRectIntoViewIfNeeded(this, rect));
|
|
187
183
|
}
|
|
188
184
|
async _waitAndScrollIntoViewIfNeeded(progress, waitForVisible) {
|
|
189
|
-
const result = await this._retryAction(progress,
|
|
185
|
+
const result = await this._retryAction(progress, "scroll into view", async () => {
|
|
190
186
|
progress.log(` waiting for element to be stable`);
|
|
191
|
-
const waitResult = await this.evaluateInUtility(async ([injected, node, {
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
});
|
|
198
|
-
if (waitResult) return waitResult;
|
|
199
|
-
return await this._scrollRectIntoViewIfNeeded();
|
|
187
|
+
const waitResult = await progress.race(this.evaluateInUtility(async ([injected, node, { waitForVisible: waitForVisible2 }]) => {
|
|
188
|
+
return await injected.checkElementStates(node, waitForVisible2 ? ["visible", "stable"] : ["stable"]);
|
|
189
|
+
}, { waitForVisible }));
|
|
190
|
+
if (waitResult)
|
|
191
|
+
return waitResult;
|
|
192
|
+
return await this._scrollRectIntoViewIfNeeded(progress);
|
|
200
193
|
}, {});
|
|
201
194
|
assertDone(throwRetargetableDOMError(result));
|
|
202
195
|
}
|
|
203
|
-
async scrollIntoViewIfNeeded(
|
|
204
|
-
|
|
205
|
-
|
|
196
|
+
async scrollIntoViewIfNeeded(progress) {
|
|
197
|
+
await this._waitAndScrollIntoViewIfNeeded(
|
|
198
|
+
progress,
|
|
199
|
+
false
|
|
200
|
+
/* waitForVisible */
|
|
201
|
+
);
|
|
206
202
|
}
|
|
207
203
|
async _clickablePoint() {
|
|
208
|
-
const intersectQuadWithViewport = quad => {
|
|
209
|
-
return quad.map(point => ({
|
|
204
|
+
const intersectQuadWithViewport = (quad) => {
|
|
205
|
+
return quad.map((point) => ({
|
|
210
206
|
x: Math.min(Math.max(point.x, 0), metrics.width),
|
|
211
207
|
y: Math.min(Math.max(point.y, 0), metrics.height)
|
|
212
208
|
}));
|
|
213
209
|
};
|
|
214
|
-
const computeQuadArea = quad => {
|
|
215
|
-
// Compute sum of all directed areas of adjacent triangles
|
|
216
|
-
// https://en.wikipedia.org/wiki/Polygon#Simple_polygons
|
|
210
|
+
const computeQuadArea = (quad) => {
|
|
217
211
|
let area = 0;
|
|
218
212
|
for (let i = 0; i < quad.length; ++i) {
|
|
219
213
|
const p1 = quad[i];
|
|
@@ -222,37 +216,36 @@ class ElementHandle extends js.JSHandle {
|
|
|
222
216
|
}
|
|
223
217
|
return Math.abs(area);
|
|
224
218
|
};
|
|
225
|
-
const [quads, metrics] = await Promise.all([
|
|
226
|
-
|
|
227
|
-
height: innerHeight
|
|
228
|
-
|
|
229
|
-
if (quads ===
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const filtered = quads.map(quad => intersectQuadWithViewport(quad)).filter(quad => computeQuadArea(quad) > 0.99);
|
|
234
|
-
if (!filtered.length)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
//
|
|
238
|
-
// This does not work nicely for small elements. For example, 1x1 square with corners
|
|
239
|
-
// (8;8) and (9;9) is targeted when clicking at (8;8) but not when clicking at (9;9).
|
|
240
|
-
// So, clicking at (8.x;8.y) will sometimes click at (9;9) and miss the target.
|
|
241
|
-
//
|
|
242
|
-
// Therefore, we try to find an integer point within a quad to make sure we click inside the element.
|
|
219
|
+
const [quads, metrics] = await Promise.all([
|
|
220
|
+
this._page.delegate.getContentQuads(this),
|
|
221
|
+
this._page.mainFrame()._utilityContext().then((utility) => utility.evaluate(() => ({ width: innerWidth, height: innerHeight })))
|
|
222
|
+
]);
|
|
223
|
+
if (quads === "error:notconnected")
|
|
224
|
+
return quads;
|
|
225
|
+
if (!quads || !quads.length)
|
|
226
|
+
return "error:notvisible";
|
|
227
|
+
const filtered = quads.map((quad) => intersectQuadWithViewport(quad)).filter((quad) => computeQuadArea(quad) > 0.99);
|
|
228
|
+
if (!filtered.length)
|
|
229
|
+
return "error:notinviewport";
|
|
230
|
+
if (this._page.browserContext._browser.options.name === "firefox") {
|
|
243
231
|
for (const quad of filtered) {
|
|
244
232
|
const integerPoint = findIntegerPointInsideQuad(quad);
|
|
245
|
-
if (integerPoint)
|
|
233
|
+
if (integerPoint)
|
|
234
|
+
return integerPoint;
|
|
246
235
|
}
|
|
247
236
|
}
|
|
248
|
-
// Return the middle point of the first quad.
|
|
249
237
|
return quadMiddlePoint(filtered[0]);
|
|
250
238
|
}
|
|
251
239
|
async _offsetPoint(offset) {
|
|
252
|
-
const [box, border] = await Promise.all([
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
240
|
+
const [box, border] = await Promise.all([
|
|
241
|
+
this.boundingBox(),
|
|
242
|
+
this.evaluateInUtility(([injected, node]) => injected.getElementBorderWidth(node), {}).catch((e) => {
|
|
243
|
+
})
|
|
244
|
+
]);
|
|
245
|
+
if (!box || !border)
|
|
246
|
+
return "error:notvisible";
|
|
247
|
+
if (border === "error:notconnected")
|
|
248
|
+
return border;
|
|
256
249
|
return {
|
|
257
250
|
x: box.x + border.left + offset.x,
|
|
258
251
|
y: box.y + border.top + offset.y
|
|
@@ -260,487 +253,411 @@ class ElementHandle extends js.JSHandle {
|
|
|
260
253
|
}
|
|
261
254
|
async _retryAction(progress, actionName, action, options) {
|
|
262
255
|
let retry = 0;
|
|
263
|
-
// We progressively wait longer between retries, up to 500ms.
|
|
264
256
|
const waitTime = [0, 20, 100, 100, 500];
|
|
265
|
-
while (
|
|
257
|
+
while (true) {
|
|
266
258
|
if (retry) {
|
|
267
|
-
progress.log(`retrying ${actionName} action${options.trial ?
|
|
259
|
+
progress.log(`retrying ${actionName} action${options.trial ? " (trial run)" : ""}`);
|
|
268
260
|
const timeout = waitTime[Math.min(retry - 1, waitTime.length - 1)];
|
|
269
261
|
if (timeout) {
|
|
270
262
|
progress.log(` waiting ${timeout}ms`);
|
|
271
|
-
const
|
|
272
|
-
if (
|
|
263
|
+
const result2 = await progress.race(this.evaluateInUtility(([injected, node, timeout2]) => new Promise((f) => setTimeout(f, timeout2)), timeout));
|
|
264
|
+
if (result2 === "error:notconnected")
|
|
265
|
+
return result2;
|
|
273
266
|
}
|
|
274
267
|
} else {
|
|
275
|
-
progress.log(`attempting ${actionName} action${options.trial ?
|
|
268
|
+
progress.log(`attempting ${actionName} action${options.trial ? " (trial run)" : ""}`);
|
|
276
269
|
}
|
|
277
|
-
if (!options.skipActionPreChecks && !options.force)
|
|
270
|
+
if (!options.skipActionPreChecks && !options.force)
|
|
271
|
+
await this._frame._page.performActionPreChecks(progress);
|
|
278
272
|
const result = await action(retry);
|
|
279
273
|
++retry;
|
|
280
|
-
if (result ===
|
|
281
|
-
if (options.force)
|
|
282
|
-
|
|
274
|
+
if (result === "error:notvisible") {
|
|
275
|
+
if (options.force)
|
|
276
|
+
throw new NonRecoverableDOMError("Element is not visible");
|
|
277
|
+
progress.log(" element is not visible");
|
|
283
278
|
continue;
|
|
284
279
|
}
|
|
285
|
-
if (result ===
|
|
286
|
-
if (options.force)
|
|
287
|
-
|
|
280
|
+
if (result === "error:notinviewport") {
|
|
281
|
+
if (options.force)
|
|
282
|
+
throw new NonRecoverableDOMError("Element is outside of the viewport");
|
|
283
|
+
progress.log(" element is outside of the viewport");
|
|
288
284
|
continue;
|
|
289
285
|
}
|
|
290
|
-
if (result ===
|
|
291
|
-
progress.log(
|
|
286
|
+
if (result === "error:optionsnotfound") {
|
|
287
|
+
progress.log(" did not find some options");
|
|
292
288
|
continue;
|
|
293
289
|
}
|
|
294
|
-
if (
|
|
290
|
+
if (result === "error:optionnotenabled") {
|
|
291
|
+
progress.log(" option being selected is not enabled");
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (typeof result === "object" && "hitTargetDescription" in result) {
|
|
295
295
|
progress.log(` ${result.hitTargetDescription} intercepts pointer events`);
|
|
296
296
|
continue;
|
|
297
297
|
}
|
|
298
|
-
if (typeof result ===
|
|
298
|
+
if (typeof result === "object" && "missingState" in result) {
|
|
299
299
|
progress.log(` element is not ${result.missingState}`);
|
|
300
300
|
continue;
|
|
301
301
|
}
|
|
302
302
|
return result;
|
|
303
303
|
}
|
|
304
|
-
return 'done';
|
|
305
304
|
}
|
|
306
305
|
async _retryPointerAction(progress, actionName, waitForEnabled, action, options) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
block: 'end',
|
|
316
|
-
inline: 'end'
|
|
317
|
-
}, {
|
|
318
|
-
block: 'center',
|
|
319
|
-
inline: 'center'
|
|
320
|
-
}, {
|
|
321
|
-
block: 'start',
|
|
322
|
-
inline: 'start'
|
|
323
|
-
}];
|
|
306
|
+
const skipActionPreChecks = actionName === "move and up";
|
|
307
|
+
return await this._retryAction(progress, actionName, async (retry) => {
|
|
308
|
+
const scrollOptions = [
|
|
309
|
+
void 0,
|
|
310
|
+
{ block: "end", inline: "end" },
|
|
311
|
+
{ block: "center", inline: "center" },
|
|
312
|
+
{ block: "start", inline: "start" }
|
|
313
|
+
];
|
|
324
314
|
const forceScrollOptions = scrollOptions[retry % scrollOptions.length];
|
|
325
315
|
return await this._performPointerAction(progress, actionName, waitForEnabled, action, forceScrollOptions, options);
|
|
326
|
-
}, {
|
|
327
|
-
...options,
|
|
328
|
-
skipActionPreChecks
|
|
329
|
-
});
|
|
316
|
+
}, { ...options, skipActionPreChecks });
|
|
330
317
|
}
|
|
331
318
|
async _performPointerAction(progress, actionName, waitForEnabled, action, forceScrollOptions, options) {
|
|
332
|
-
const {
|
|
333
|
-
force = false,
|
|
334
|
-
position
|
|
335
|
-
} = options;
|
|
319
|
+
const { force = false, position } = options;
|
|
336
320
|
const doScrollIntoView = async () => {
|
|
337
321
|
if (forceScrollOptions) {
|
|
338
|
-
return await this.evaluateInUtility(([injected, node,
|
|
339
|
-
if (node.nodeType === 1
|
|
340
|
-
|
|
322
|
+
return await this.evaluateInUtility(([injected, node, options2]) => {
|
|
323
|
+
if (node.nodeType === 1)
|
|
324
|
+
node.scrollIntoView(options2);
|
|
325
|
+
return "done";
|
|
341
326
|
}, forceScrollOptions);
|
|
342
327
|
}
|
|
343
|
-
return await this._scrollRectIntoViewIfNeeded(position ? {
|
|
344
|
-
x: position.x,
|
|
345
|
-
y: position.y,
|
|
346
|
-
width: 0,
|
|
347
|
-
height: 0
|
|
348
|
-
} : undefined);
|
|
328
|
+
return await this._scrollRectIntoViewIfNeeded(progress, position ? { x: position.x, y: position.y, width: 0, height: 0 } : void 0);
|
|
349
329
|
};
|
|
350
330
|
if (this._frame.parentFrame()) {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
// See https://github.com/microsoft/playwright/issues/27196 for an example.
|
|
354
|
-
progress.throwIfAborted(); // Avoid action that has side-effects.
|
|
355
|
-
await doScrollIntoView().catch(() => {});
|
|
331
|
+
await progress.race(doScrollIntoView().catch(() => {
|
|
332
|
+
}));
|
|
356
333
|
}
|
|
357
|
-
if (options.__testHookBeforeStable)
|
|
334
|
+
if (options.__testHookBeforeStable)
|
|
335
|
+
await progress.race(options.__testHookBeforeStable());
|
|
358
336
|
if (!force) {
|
|
359
|
-
const elementStates = waitForEnabled ? [
|
|
360
|
-
progress.log(` waiting for element to be ${waitForEnabled ?
|
|
361
|
-
const result = await this.evaluateInUtility(async ([injected, node, {
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
});
|
|
368
|
-
if (result) return result;
|
|
369
|
-
progress.log(` element is ${waitForEnabled ? 'visible, enabled and stable' : 'visible and stable'}`);
|
|
337
|
+
const elementStates = waitForEnabled ? ["visible", "enabled", "stable"] : ["visible", "stable"];
|
|
338
|
+
progress.log(` waiting for element to be ${waitForEnabled ? "visible, enabled and stable" : "visible and stable"}`);
|
|
339
|
+
const result = await progress.race(this.evaluateInUtility(async ([injected, node, { elementStates: elementStates2 }]) => {
|
|
340
|
+
return await injected.checkElementStates(node, elementStates2);
|
|
341
|
+
}, { elementStates }));
|
|
342
|
+
if (result)
|
|
343
|
+
return result;
|
|
344
|
+
progress.log(` element is ${waitForEnabled ? "visible, enabled and stable" : "visible and stable"}`);
|
|
370
345
|
}
|
|
371
|
-
if (options.__testHookAfterStable)
|
|
372
|
-
|
|
373
|
-
progress.
|
|
374
|
-
const scrolled = await doScrollIntoView();
|
|
375
|
-
if (scrolled !==
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
346
|
+
if (options.__testHookAfterStable)
|
|
347
|
+
await progress.race(options.__testHookAfterStable());
|
|
348
|
+
progress.log(" scrolling into view if needed");
|
|
349
|
+
const scrolled = await progress.race(doScrollIntoView());
|
|
350
|
+
if (scrolled !== "done")
|
|
351
|
+
return scrolled;
|
|
352
|
+
progress.log(" done scrolling");
|
|
353
|
+
const maybePoint = position ? await progress.race(this._offsetPoint(position)) : await progress.race(this._clickablePoint());
|
|
354
|
+
if (typeof maybePoint === "string")
|
|
355
|
+
return maybePoint;
|
|
379
356
|
const point = roundPoint(maybePoint);
|
|
380
357
|
progress.metadata.point = point;
|
|
381
|
-
await this.instrumentation.onBeforeInputAction(this, progress.metadata);
|
|
358
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
382
359
|
let hitTargetInterceptionHandle;
|
|
383
360
|
if (force) {
|
|
384
361
|
progress.log(` forcing action`);
|
|
385
362
|
} else {
|
|
386
|
-
if (options.__testHookBeforeHitTarget)
|
|
387
|
-
|
|
388
|
-
|
|
363
|
+
if (options.__testHookBeforeHitTarget)
|
|
364
|
+
await progress.race(options.__testHookBeforeHitTarget());
|
|
365
|
+
const frameCheckResult = await progress.race(this._checkFrameIsHitTarget(point));
|
|
366
|
+
if (frameCheckResult === "error:notconnected" || "hitTargetDescription" in frameCheckResult)
|
|
367
|
+
return frameCheckResult;
|
|
389
368
|
const hitPoint = frameCheckResult.framePoint;
|
|
390
|
-
const actionType = actionName ===
|
|
391
|
-
const handle = await this.evaluateHandleInUtility(([injected, node, {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
trial
|
|
395
|
-
}]) => injected.setupHitTargetInterceptor(node, actionType, hitPoint, trial), {
|
|
396
|
-
actionType,
|
|
397
|
-
hitPoint,
|
|
398
|
-
trial: !!options.trial
|
|
399
|
-
});
|
|
400
|
-
if (handle === 'error:notconnected') return handle;
|
|
369
|
+
const actionType = actionName === "move and up" ? "drag" : actionName === "hover" || actionName === "tap" ? actionName : "mouse";
|
|
370
|
+
const handle = await progress.race(this.evaluateHandleInUtility(([injected, node, { actionType: actionType2, hitPoint: hitPoint2, trial }]) => injected.setupHitTargetInterceptor(node, actionType2, hitPoint2, trial), { actionType, hitPoint, trial: !!options.trial }));
|
|
371
|
+
if (handle === "error:notconnected")
|
|
372
|
+
return handle;
|
|
401
373
|
if (!handle._objectId) {
|
|
402
374
|
const error = handle.rawValue();
|
|
403
|
-
if (error ===
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
};
|
|
375
|
+
if (error === "error:notconnected")
|
|
376
|
+
return error;
|
|
377
|
+
return { hitTargetDescription: error };
|
|
407
378
|
}
|
|
408
379
|
hitTargetInterceptionHandle = handle;
|
|
409
380
|
progress.cleanupWhenAborted(() => {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
hitTargetInterceptionHandle.evaluate(h => h.stop()).catch(e => {});
|
|
381
|
+
hitTargetInterceptionHandle.evaluate((h) => h.stop()).catch((e) => {
|
|
382
|
+
});
|
|
413
383
|
hitTargetInterceptionHandle.dispose();
|
|
414
384
|
});
|
|
415
385
|
}
|
|
416
|
-
const actionResult = await this._page.
|
|
417
|
-
if (options.__testHookBeforePointerAction)
|
|
418
|
-
|
|
386
|
+
const actionResult = await this._page.frameManager.waitForSignalsCreatedBy(progress, options.waitAfter === true, async () => {
|
|
387
|
+
if (options.__testHookBeforePointerAction)
|
|
388
|
+
await progress.race(options.__testHookBeforePointerAction());
|
|
419
389
|
let restoreModifiers;
|
|
420
|
-
if (options && options.modifiers)
|
|
390
|
+
if (options && options.modifiers)
|
|
391
|
+
restoreModifiers = await this._page.keyboard.ensureModifiers(progress, options.modifiers);
|
|
421
392
|
progress.log(` performing ${actionName} action`);
|
|
422
393
|
await action(point);
|
|
423
|
-
if (restoreModifiers)
|
|
394
|
+
if (restoreModifiers)
|
|
395
|
+
await this._page.keyboard.ensureModifiers(progress, restoreModifiers);
|
|
424
396
|
if (hitTargetInterceptionHandle) {
|
|
425
397
|
const stopHitTargetInterception = this._frame.raceAgainstEvaluationStallingEvents(() => {
|
|
426
|
-
return hitTargetInterceptionHandle.evaluate(h => h.stop());
|
|
427
|
-
}).catch(e =>
|
|
428
|
-
|
|
429
|
-
(_hitTargetInterceptio = hitTargetInterceptionHandle) === null || _hitTargetInterceptio === void 0 || _hitTargetInterceptio.dispose();
|
|
398
|
+
return hitTargetInterceptionHandle.evaluate((h) => h.stop());
|
|
399
|
+
}).catch((e) => "done").finally(() => {
|
|
400
|
+
hitTargetInterceptionHandle?.dispose();
|
|
430
401
|
});
|
|
431
402
|
if (options.waitAfter !== false) {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
if (hitTargetResult !== 'done') return hitTargetResult;
|
|
403
|
+
const hitTargetResult = await progress.race(stopHitTargetInterception);
|
|
404
|
+
if (hitTargetResult !== "done")
|
|
405
|
+
return hitTargetResult;
|
|
436
406
|
}
|
|
437
407
|
}
|
|
438
|
-
progress.log(` ${options.trial ?
|
|
439
|
-
progress.log(
|
|
440
|
-
if (options.__testHookAfterPointerAction)
|
|
441
|
-
|
|
408
|
+
progress.log(` ${options.trial ? "trial " : ""}${actionName} action done`);
|
|
409
|
+
progress.log(" waiting for scheduled navigations to finish");
|
|
410
|
+
if (options.__testHookAfterPointerAction)
|
|
411
|
+
await progress.race(options.__testHookAfterPointerAction());
|
|
412
|
+
return "done";
|
|
442
413
|
});
|
|
443
|
-
if (actionResult !==
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
414
|
+
if (actionResult !== "done")
|
|
415
|
+
return actionResult;
|
|
416
|
+
progress.log(" navigations have finished");
|
|
417
|
+
return "done";
|
|
418
|
+
}
|
|
419
|
+
async _markAsTargetElement(progress) {
|
|
420
|
+
if (!progress.metadata.id)
|
|
421
|
+
return;
|
|
422
|
+
await progress.race(this.evaluateInUtility(([injected, node, callId]) => {
|
|
423
|
+
if (node.nodeType === 1)
|
|
424
|
+
injected.markTargetElements(/* @__PURE__ */ new Set([node]), callId);
|
|
425
|
+
}, progress.metadata.id));
|
|
426
|
+
}
|
|
427
|
+
async hover(progress, options) {
|
|
428
|
+
await this._markAsTargetElement(progress);
|
|
429
|
+
const result = await this._hover(progress, options);
|
|
430
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
460
431
|
}
|
|
461
432
|
_hover(progress, options) {
|
|
462
|
-
return this._retryPointerAction(progress,
|
|
463
|
-
...options,
|
|
464
|
-
waitAfter: 'disabled'
|
|
465
|
-
});
|
|
433
|
+
return this._retryPointerAction(progress, "hover", false, (point) => this._page.mouse.move(progress, point.x, point.y), { ...options, waitAfter: "disabled" });
|
|
466
434
|
}
|
|
467
|
-
async click(
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
const result = await this._click(progress, {
|
|
472
|
-
...options,
|
|
473
|
-
waitAfter: !options.noWaitAfter
|
|
474
|
-
});
|
|
475
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
476
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
435
|
+
async click(progress, options) {
|
|
436
|
+
await this._markAsTargetElement(progress);
|
|
437
|
+
const result = await this._click(progress, { ...options, waitAfter: !options.noWaitAfter });
|
|
438
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
477
439
|
}
|
|
478
440
|
_click(progress, options) {
|
|
479
|
-
return this._retryPointerAction(progress,
|
|
441
|
+
return this._retryPointerAction(progress, "click", true, (point) => this._page.mouse.click(progress, point.x, point.y, options), options);
|
|
480
442
|
}
|
|
481
|
-
async dblclick(
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
const result = await this._dblclick(progress, options);
|
|
486
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
487
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
443
|
+
async dblclick(progress, options) {
|
|
444
|
+
await this._markAsTargetElement(progress);
|
|
445
|
+
const result = await this._dblclick(progress, options);
|
|
446
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
488
447
|
}
|
|
489
448
|
_dblclick(progress, options) {
|
|
490
|
-
return this._retryPointerAction(progress,
|
|
491
|
-
...options,
|
|
492
|
-
waitAfter: 'disabled'
|
|
493
|
-
});
|
|
449
|
+
return this._retryPointerAction(progress, "dblclick", true, (point) => this._page.mouse.click(progress, point.x, point.y, { ...options, clickCount: 2 }), { ...options, waitAfter: "disabled" });
|
|
494
450
|
}
|
|
495
|
-
async tap(
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
const result = await this._tap(progress, options);
|
|
500
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
501
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
451
|
+
async tap(progress, options) {
|
|
452
|
+
await this._markAsTargetElement(progress);
|
|
453
|
+
const result = await this._tap(progress, options);
|
|
454
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
502
455
|
}
|
|
503
456
|
_tap(progress, options) {
|
|
504
|
-
return this._retryPointerAction(progress,
|
|
505
|
-
...options,
|
|
506
|
-
waitAfter: 'disabled'
|
|
507
|
-
});
|
|
457
|
+
return this._retryPointerAction(progress, "tap", true, (point) => this._page.touchscreen.tap(progress, point.x, point.y), { ...options, waitAfter: "disabled" });
|
|
508
458
|
}
|
|
509
|
-
async selectOption(
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
const result = await this._selectOption(progress, elements, values, options);
|
|
514
|
-
return throwRetargetableDOMError(result);
|
|
515
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
459
|
+
async selectOption(progress, elements, values, options) {
|
|
460
|
+
await this._markAsTargetElement(progress);
|
|
461
|
+
const result = await this._selectOption(progress, elements, values, options);
|
|
462
|
+
return throwRetargetableDOMError(result);
|
|
516
463
|
}
|
|
517
464
|
async _selectOption(progress, elements, values, options) {
|
|
518
465
|
let resultingOptions = [];
|
|
519
|
-
await this._retryAction(progress,
|
|
520
|
-
await this.instrumentation.onBeforeInputAction(this, progress.metadata);
|
|
521
|
-
if (!options.force)
|
|
466
|
+
const result = await this._retryAction(progress, "select option", async () => {
|
|
467
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
468
|
+
if (!options.force)
|
|
469
|
+
progress.log(` waiting for element to be visible and enabled`);
|
|
522
470
|
const optionsToSelect = [...elements, ...values];
|
|
523
|
-
const
|
|
524
|
-
optionsToSelect,
|
|
525
|
-
force
|
|
526
|
-
}]) => {
|
|
471
|
+
const result2 = await progress.race(this.evaluateInUtility(async ([injected, node, { optionsToSelect: optionsToSelect2, force }]) => {
|
|
527
472
|
if (!force) {
|
|
528
|
-
const checkResult = await injected.checkElementStates(node, [
|
|
529
|
-
if (checkResult)
|
|
473
|
+
const checkResult = await injected.checkElementStates(node, ["visible", "enabled"]);
|
|
474
|
+
if (checkResult)
|
|
475
|
+
return checkResult;
|
|
530
476
|
}
|
|
531
|
-
return injected.selectOptions(node,
|
|
532
|
-
}, {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
progress.log(' selected specified option(s)');
|
|
538
|
-
resultingOptions = result;
|
|
539
|
-
return 'done';
|
|
477
|
+
return injected.selectOptions(node, optionsToSelect2);
|
|
478
|
+
}, { optionsToSelect, force: options.force }));
|
|
479
|
+
if (Array.isArray(result2)) {
|
|
480
|
+
progress.log(" selected specified option(s)");
|
|
481
|
+
resultingOptions = result2;
|
|
482
|
+
return "done";
|
|
540
483
|
}
|
|
541
|
-
return
|
|
484
|
+
return result2;
|
|
542
485
|
}, options);
|
|
486
|
+
if (result === "error:notconnected")
|
|
487
|
+
return result;
|
|
543
488
|
return resultingOptions;
|
|
544
489
|
}
|
|
545
|
-
async fill(
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
const result = await this._fill(progress, value, options);
|
|
550
|
-
assertDone(throwRetargetableDOMError(result));
|
|
551
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
490
|
+
async fill(progress, value, options) {
|
|
491
|
+
await this._markAsTargetElement(progress);
|
|
492
|
+
const result = await this._fill(progress, value, options);
|
|
493
|
+
assertDone(throwRetargetableDOMError(result));
|
|
552
494
|
}
|
|
553
495
|
async _fill(progress, value, options) {
|
|
554
496
|
progress.log(` fill("${value}")`);
|
|
555
|
-
return await this._retryAction(progress,
|
|
556
|
-
await this.instrumentation.onBeforeInputAction(this, progress.metadata);
|
|
557
|
-
if (!options.force)
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
force
|
|
561
|
-
}]) => {
|
|
497
|
+
return await this._retryAction(progress, "fill", async () => {
|
|
498
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
499
|
+
if (!options.force)
|
|
500
|
+
progress.log(" waiting for element to be visible, enabled and editable");
|
|
501
|
+
const result = await progress.race(this.evaluateInUtility(async ([injected, node, { value: value2, force }]) => {
|
|
562
502
|
if (!force) {
|
|
563
|
-
const checkResult = await injected.checkElementStates(node, [
|
|
564
|
-
if (checkResult)
|
|
503
|
+
const checkResult = await injected.checkElementStates(node, ["visible", "enabled", "editable"]);
|
|
504
|
+
if (checkResult)
|
|
505
|
+
return checkResult;
|
|
565
506
|
}
|
|
566
|
-
return injected.fill(node,
|
|
567
|
-
}, {
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
return 'done';
|
|
507
|
+
return injected.fill(node, value2);
|
|
508
|
+
}, { value, force: options.force }));
|
|
509
|
+
if (result === "needsinput") {
|
|
510
|
+
if (value)
|
|
511
|
+
await this._page.keyboard.insertText(progress, value);
|
|
512
|
+
else
|
|
513
|
+
await this._page.keyboard.press(progress, "Delete");
|
|
514
|
+
return "done";
|
|
575
515
|
} else {
|
|
576
516
|
return result;
|
|
577
517
|
}
|
|
578
518
|
}, options);
|
|
579
519
|
}
|
|
580
|
-
async selectText(
|
|
581
|
-
const
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
async setInputFiles(metadata, params) {
|
|
601
|
-
const inputFileItems = await (0, _fileUploadUtils.prepareFilesForUpload)(this._frame, params);
|
|
602
|
-
const controller = new _progress.ProgressController(metadata, this);
|
|
603
|
-
return controller.run(async progress => {
|
|
604
|
-
await this._markAsTargetElement(metadata);
|
|
605
|
-
const result = await this._setInputFiles(progress, inputFileItems);
|
|
606
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
607
|
-
}, this._page._timeoutSettings.timeout(params));
|
|
520
|
+
async selectText(progress, options) {
|
|
521
|
+
const result = await this._retryAction(progress, "selectText", async () => {
|
|
522
|
+
if (!options.force)
|
|
523
|
+
progress.log(" waiting for element to be visible");
|
|
524
|
+
return await progress.race(this.evaluateInUtility(async ([injected, node, { force }]) => {
|
|
525
|
+
if (!force) {
|
|
526
|
+
const checkResult = await injected.checkElementStates(node, ["visible"]);
|
|
527
|
+
if (checkResult)
|
|
528
|
+
return checkResult;
|
|
529
|
+
}
|
|
530
|
+
return injected.selectText(node);
|
|
531
|
+
}, { force: options.force }));
|
|
532
|
+
}, options);
|
|
533
|
+
assertDone(throwRetargetableDOMError(result));
|
|
534
|
+
}
|
|
535
|
+
async setInputFiles(progress, params) {
|
|
536
|
+
const inputFileItems = await progress.race((0, import_fileUploadUtils.prepareFilesForUpload)(this._frame, params));
|
|
537
|
+
await this._markAsTargetElement(progress);
|
|
538
|
+
const result = await this._setInputFiles(progress, inputFileItems);
|
|
539
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
608
540
|
}
|
|
609
541
|
async _setInputFiles(progress, items) {
|
|
610
|
-
const {
|
|
611
|
-
filePayloads,
|
|
612
|
-
localPaths,
|
|
613
|
-
localDirectory
|
|
614
|
-
} = items;
|
|
542
|
+
const { filePayloads, localPaths, localDirectory } = items;
|
|
615
543
|
const multiple = filePayloads && filePayloads.length > 1 || localPaths && localPaths.length > 1;
|
|
616
|
-
const result = await this.evaluateHandleInUtility(([injected, node, {
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
if (element.tagName !== 'INPUT') throw injected.createStacklessError('Node is not an HTMLInputElement');
|
|
544
|
+
const result = await progress.race(this.evaluateHandleInUtility(([injected, node, { multiple: multiple2, directoryUpload }]) => {
|
|
545
|
+
const element = injected.retarget(node, "follow-label");
|
|
546
|
+
if (!element)
|
|
547
|
+
return;
|
|
548
|
+
if (element.tagName !== "INPUT")
|
|
549
|
+
throw injected.createStacklessError("Node is not an HTMLInputElement");
|
|
623
550
|
const inputElement = element;
|
|
624
|
-
if (
|
|
625
|
-
|
|
626
|
-
if (
|
|
551
|
+
if (multiple2 && !inputElement.multiple && !inputElement.webkitdirectory)
|
|
552
|
+
throw injected.createStacklessError("Non-multiple file input can only accept single file");
|
|
553
|
+
if (directoryUpload && !inputElement.webkitdirectory)
|
|
554
|
+
throw injected.createStacklessError("File input does not support directories, pass individual files instead");
|
|
555
|
+
if (!directoryUpload && inputElement.webkitdirectory)
|
|
556
|
+
throw injected.createStacklessError("[webkitdirectory] input requires passing a path to a directory");
|
|
627
557
|
return inputElement;
|
|
628
|
-
}, {
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
});
|
|
632
|
-
if (result === 'error:notconnected' || !result.asElement()) return 'error:notconnected';
|
|
558
|
+
}, { multiple, directoryUpload: !!localDirectory }));
|
|
559
|
+
if (result === "error:notconnected" || !result.asElement())
|
|
560
|
+
return "error:notconnected";
|
|
633
561
|
const retargeted = result.asElement();
|
|
634
|
-
await this.instrumentation.onBeforeInputAction(this, progress.metadata);
|
|
635
|
-
progress.throwIfAborted(); // Avoid action that has side-effects.
|
|
562
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
636
563
|
if (localPaths || localDirectory) {
|
|
637
564
|
const localPathsOrDirectory = localDirectory ? [localDirectory] : localPaths;
|
|
638
|
-
await Promise.all(localPathsOrDirectory.map(localPath =>
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
await this._page._delegate.setInputFilePaths(retargeted, localPathsOrDirectory);
|
|
646
|
-
await waitForInputEvent;
|
|
565
|
+
await progress.race(Promise.all(localPathsOrDirectory.map((localPath) => import_fs.default.promises.access(localPath, import_fs.default.constants.F_OK))));
|
|
566
|
+
const waitForInputEvent = localDirectory ? this.evaluate((node) => new Promise((fulfill) => {
|
|
567
|
+
node.addEventListener("input", fulfill, { once: true });
|
|
568
|
+
})).catch(() => {
|
|
569
|
+
}) : Promise.resolve();
|
|
570
|
+
await progress.race(this._page.delegate.setInputFilePaths(retargeted, localPathsOrDirectory));
|
|
571
|
+
await progress.race(waitForInputEvent);
|
|
647
572
|
} else {
|
|
648
|
-
await retargeted.evaluateInUtility(([injected, node, files]) => injected.setInputFiles(node, files), filePayloads);
|
|
573
|
+
await progress.race(retargeted.evaluateInUtility(([injected, node, files]) => injected.setInputFiles(node, files), filePayloads));
|
|
649
574
|
}
|
|
650
|
-
return
|
|
575
|
+
return "done";
|
|
651
576
|
}
|
|
652
|
-
async focus(
|
|
653
|
-
|
|
654
|
-
await
|
|
655
|
-
|
|
656
|
-
const result = await this._focus(progress);
|
|
657
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
658
|
-
}, 0);
|
|
577
|
+
async focus(progress) {
|
|
578
|
+
await this._markAsTargetElement(progress);
|
|
579
|
+
const result = await this._focus(progress);
|
|
580
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
659
581
|
}
|
|
660
582
|
async _focus(progress, resetSelectionIfNotFocused) {
|
|
661
|
-
progress.
|
|
662
|
-
return await this.evaluateInUtility(([injected, node, resetSelectionIfNotFocused]) => injected.focusNode(node, resetSelectionIfNotFocused), resetSelectionIfNotFocused);
|
|
583
|
+
return await progress.race(this.evaluateInUtility(([injected, node, resetSelectionIfNotFocused2]) => injected.focusNode(node, resetSelectionIfNotFocused2), resetSelectionIfNotFocused));
|
|
663
584
|
}
|
|
664
585
|
async _blur(progress) {
|
|
665
|
-
progress.
|
|
666
|
-
return await this.evaluateInUtility(([injected, node]) => injected.blurNode(node), {});
|
|
586
|
+
return await progress.race(this.evaluateInUtility(([injected, node]) => injected.blurNode(node), {}));
|
|
667
587
|
}
|
|
668
|
-
async type(
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
const result = await this._type(progress, text, options);
|
|
673
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
674
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
588
|
+
async type(progress, text, options) {
|
|
589
|
+
await this._markAsTargetElement(progress);
|
|
590
|
+
const result = await this._type(progress, text, options);
|
|
591
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
675
592
|
}
|
|
676
593
|
async _type(progress, text, options) {
|
|
677
594
|
progress.log(`elementHandle.type("${text}")`);
|
|
678
|
-
await this.instrumentation.onBeforeInputAction(this, progress.metadata);
|
|
679
|
-
const result = await this._focus(
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
return
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
595
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
596
|
+
const result = await this._focus(
|
|
597
|
+
progress,
|
|
598
|
+
true
|
|
599
|
+
/* resetSelectionIfNotFocused */
|
|
600
|
+
);
|
|
601
|
+
if (result !== "done")
|
|
602
|
+
return result;
|
|
603
|
+
await this._page.keyboard.type(progress, text, options);
|
|
604
|
+
return "done";
|
|
605
|
+
}
|
|
606
|
+
async press(progress, key, options) {
|
|
607
|
+
await this._markAsTargetElement(progress);
|
|
608
|
+
const result = await this._press(progress, key, options);
|
|
609
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
692
610
|
}
|
|
693
611
|
async _press(progress, key, options) {
|
|
694
612
|
progress.log(`elementHandle.press("${key}")`);
|
|
695
|
-
await this.instrumentation.onBeforeInputAction(this, progress.metadata);
|
|
696
|
-
return this._page.
|
|
697
|
-
const result = await this._focus(
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
613
|
+
await progress.race(this.instrumentation.onBeforeInputAction(this, progress.metadata));
|
|
614
|
+
return this._page.frameManager.waitForSignalsCreatedBy(progress, !options.noWaitAfter, async () => {
|
|
615
|
+
const result = await this._focus(
|
|
616
|
+
progress,
|
|
617
|
+
true
|
|
618
|
+
/* resetSelectionIfNotFocused */
|
|
619
|
+
);
|
|
620
|
+
if (result !== "done")
|
|
621
|
+
return result;
|
|
622
|
+
await this._page.keyboard.press(progress, key, options);
|
|
623
|
+
return "done";
|
|
702
624
|
});
|
|
703
625
|
}
|
|
704
|
-
async check(
|
|
705
|
-
const
|
|
706
|
-
return
|
|
707
|
-
const result = await this._setChecked(progress, true, options);
|
|
708
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
709
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
626
|
+
async check(progress, options) {
|
|
627
|
+
const result = await this._setChecked(progress, true, options);
|
|
628
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
710
629
|
}
|
|
711
|
-
async uncheck(
|
|
712
|
-
const
|
|
713
|
-
return
|
|
714
|
-
const result = await this._setChecked(progress, false, options);
|
|
715
|
-
return assertDone(throwRetargetableDOMError(result));
|
|
716
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
630
|
+
async uncheck(progress, options) {
|
|
631
|
+
const result = await this._setChecked(progress, false, options);
|
|
632
|
+
return assertDone(throwRetargetableDOMError(result));
|
|
717
633
|
}
|
|
718
634
|
async _setChecked(progress, state, options) {
|
|
719
635
|
const isChecked = async () => {
|
|
720
|
-
const
|
|
721
|
-
if (
|
|
722
|
-
|
|
636
|
+
const result2 = await progress.race(this.evaluateInUtility(([injected, node]) => injected.elementState(node, "checked"), {}));
|
|
637
|
+
if (result2 === "error:notconnected" || result2.received === "error:notconnected")
|
|
638
|
+
throwElementIsNotAttached();
|
|
639
|
+
return result2.matches;
|
|
723
640
|
};
|
|
724
|
-
await this._markAsTargetElement(progress
|
|
725
|
-
if (
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
if (
|
|
731
|
-
|
|
732
|
-
if (
|
|
733
|
-
|
|
641
|
+
await this._markAsTargetElement(progress);
|
|
642
|
+
if (await isChecked() === state)
|
|
643
|
+
return "done";
|
|
644
|
+
const result = await this._click(progress, { ...options, waitAfter: "disabled" });
|
|
645
|
+
if (result !== "done")
|
|
646
|
+
return result;
|
|
647
|
+
if (options.trial)
|
|
648
|
+
return "done";
|
|
649
|
+
if (await isChecked() !== state)
|
|
650
|
+
throw new NonRecoverableDOMError("Clicking the checkbox did not change its state");
|
|
651
|
+
return "done";
|
|
734
652
|
}
|
|
735
653
|
async boundingBox() {
|
|
736
|
-
return this._page.
|
|
654
|
+
return this._page.delegate.getBoundingBox(this);
|
|
737
655
|
}
|
|
738
656
|
async ariaSnapshot(options) {
|
|
739
|
-
return await this.evaluateInUtility(([injected, element,
|
|
657
|
+
return await this.evaluateInUtility(([injected, element, options2]) => injected.ariaSnapshot(element, options2), options);
|
|
740
658
|
}
|
|
741
|
-
async screenshot(
|
|
742
|
-
|
|
743
|
-
return controller.run(progress => this._page._screenshotter.screenshotElement(progress, this, options), this._page._timeoutSettings.timeout(options));
|
|
659
|
+
async screenshot(progress, options) {
|
|
660
|
+
return await this._page.screenshotter.screenshotElement(progress, this, options);
|
|
744
661
|
}
|
|
745
662
|
async querySelector(selector, options) {
|
|
746
663
|
return this._frame.selectors.query(selector, options, this);
|
|
@@ -754,42 +671,39 @@ class ElementHandle extends js.JSHandle {
|
|
|
754
671
|
async evalOnSelectorAll(selector, expression, isFunction, arg) {
|
|
755
672
|
return this._frame.evalOnSelectorAll(selector, expression, isFunction, arg, this);
|
|
756
673
|
}
|
|
757
|
-
async isVisible(
|
|
758
|
-
return this._frame.isVisible(
|
|
674
|
+
async isVisible(progress) {
|
|
675
|
+
return this._frame.isVisible(progress, ":scope", {}, this);
|
|
759
676
|
}
|
|
760
|
-
async isHidden(
|
|
761
|
-
return this._frame.isHidden(
|
|
677
|
+
async isHidden(progress) {
|
|
678
|
+
return this._frame.isHidden(progress, ":scope", {}, this);
|
|
762
679
|
}
|
|
763
|
-
async isEnabled(
|
|
764
|
-
return this._frame.isEnabled(
|
|
680
|
+
async isEnabled(progress) {
|
|
681
|
+
return this._frame.isEnabled(progress, ":scope", {}, this);
|
|
765
682
|
}
|
|
766
|
-
async isDisabled(
|
|
767
|
-
return this._frame.isDisabled(
|
|
683
|
+
async isDisabled(progress) {
|
|
684
|
+
return this._frame.isDisabled(progress, ":scope", {}, this);
|
|
768
685
|
}
|
|
769
|
-
async isEditable(
|
|
770
|
-
return this._frame.isEditable(
|
|
686
|
+
async isEditable(progress) {
|
|
687
|
+
return this._frame.isEditable(progress, ":scope", {}, this);
|
|
771
688
|
}
|
|
772
|
-
async isChecked(
|
|
773
|
-
return this._frame.isChecked(
|
|
689
|
+
async isChecked(progress) {
|
|
690
|
+
return this._frame.isChecked(progress, ":scope", {}, this);
|
|
774
691
|
}
|
|
775
|
-
async waitForElementState(
|
|
776
|
-
const
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
}, {});
|
|
784
|
-
assertDone(throwRetargetableDOMError(result));
|
|
785
|
-
}, this._page._timeoutSettings.timeout(options));
|
|
692
|
+
async waitForElementState(progress, state) {
|
|
693
|
+
const actionName = `wait for ${state}`;
|
|
694
|
+
const result = await this._retryAction(progress, actionName, async () => {
|
|
695
|
+
return await progress.race(this.evaluateInUtility(async ([injected, node, state2]) => {
|
|
696
|
+
return await injected.checkElementStates(node, [state2]) || "done";
|
|
697
|
+
}, state));
|
|
698
|
+
}, {});
|
|
699
|
+
assertDone(throwRetargetableDOMError(result));
|
|
786
700
|
}
|
|
787
|
-
async waitForSelector(
|
|
788
|
-
return this._frame.waitForSelector(
|
|
701
|
+
async waitForSelector(progress, selector, options) {
|
|
702
|
+
return await this._frame.waitForSelector(progress, selector, true, options, this);
|
|
789
703
|
}
|
|
790
704
|
async _adoptTo(context) {
|
|
791
705
|
if (this._context !== context) {
|
|
792
|
-
const adopted = await this._page.
|
|
706
|
+
const adopted = await this._page.delegate.adoptElementHandle(this, context);
|
|
793
707
|
this.dispose();
|
|
794
708
|
return adopted;
|
|
795
709
|
}
|
|
@@ -801,58 +715,38 @@ class ElementHandle extends js.JSHandle {
|
|
|
801
715
|
while (frame.parentFrame()) {
|
|
802
716
|
const frameElement = await frame.frameElement();
|
|
803
717
|
const box = await frameElement.boundingBox();
|
|
804
|
-
const style = await frameElement.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch(e =>
|
|
805
|
-
if (!box || style ===
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
// and solely rely on the event interceptor.
|
|
810
|
-
return {
|
|
811
|
-
framePoint: undefined
|
|
812
|
-
};
|
|
718
|
+
const style = await frameElement.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch((e) => "error:notconnected");
|
|
719
|
+
if (!box || style === "error:notconnected")
|
|
720
|
+
return "error:notconnected";
|
|
721
|
+
if (style === "transformed") {
|
|
722
|
+
return { framePoint: void 0 };
|
|
813
723
|
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
x: point.x - box.x - style.left,
|
|
817
|
-
y: point.y - box.y - style.top
|
|
818
|
-
};
|
|
819
|
-
data.push({
|
|
820
|
-
frame,
|
|
821
|
-
frameElement,
|
|
822
|
-
pointInFrame
|
|
823
|
-
});
|
|
724
|
+
const pointInFrame = { x: point.x - box.x - style.left, y: point.y - box.y - style.top };
|
|
725
|
+
data.push({ frame, frameElement, pointInFrame });
|
|
824
726
|
frame = frame.parentFrame();
|
|
825
727
|
}
|
|
826
|
-
|
|
827
|
-
data.push({
|
|
828
|
-
frame,
|
|
829
|
-
frameElement: null,
|
|
830
|
-
pointInFrame: point
|
|
831
|
-
});
|
|
728
|
+
data.push({ frame, frameElement: null, pointInFrame: point });
|
|
832
729
|
for (let i = data.length - 1; i > 0; i--) {
|
|
833
730
|
const element = data[i - 1].frameElement;
|
|
834
|
-
const
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
731
|
+
const point2 = data[i].pointInFrame;
|
|
732
|
+
const hitTargetResult = await element.evaluateInUtility(([injected, element2, hitPoint]) => {
|
|
733
|
+
return injected.expectHitTarget(hitPoint, element2);
|
|
734
|
+
}, point2);
|
|
735
|
+
if (hitTargetResult !== "done")
|
|
736
|
+
return hitTargetResult;
|
|
840
737
|
}
|
|
841
|
-
return {
|
|
842
|
-
framePoint: data[0].pointInFrame
|
|
843
|
-
};
|
|
738
|
+
return { framePoint: data[0].pointInFrame };
|
|
844
739
|
}
|
|
845
740
|
}
|
|
846
|
-
exports.ElementHandle = ElementHandle;
|
|
847
741
|
function throwRetargetableDOMError(result) {
|
|
848
|
-
if (result ===
|
|
742
|
+
if (result === "error:notconnected")
|
|
743
|
+
throwElementIsNotAttached();
|
|
849
744
|
return result;
|
|
850
745
|
}
|
|
851
746
|
function throwElementIsNotAttached() {
|
|
852
|
-
throw new Error(
|
|
747
|
+
throw new Error("Element is not attached to the DOM");
|
|
853
748
|
}
|
|
854
749
|
function assertDone(result) {
|
|
855
|
-
// This function converts 'done' to void and ensures typescript catches unhandled errors.
|
|
856
750
|
}
|
|
857
751
|
function roundPoint(point) {
|
|
858
752
|
return {
|
|
@@ -861,10 +755,7 @@ function roundPoint(point) {
|
|
|
861
755
|
};
|
|
862
756
|
}
|
|
863
757
|
function quadMiddlePoint(quad) {
|
|
864
|
-
const result = {
|
|
865
|
-
x: 0,
|
|
866
|
-
y: 0
|
|
867
|
-
};
|
|
758
|
+
const result = { x: 0, y: 0 };
|
|
868
759
|
for (const point of quad) {
|
|
869
760
|
result.x += point.x / 4;
|
|
870
761
|
result.y += point.y / 4;
|
|
@@ -877,23 +768,35 @@ function triangleArea(p1, p2, p3) {
|
|
|
877
768
|
function isPointInsideQuad(point, quad) {
|
|
878
769
|
const area1 = triangleArea(point, quad[0], quad[1]) + triangleArea(point, quad[1], quad[2]) + triangleArea(point, quad[2], quad[3]) + triangleArea(point, quad[3], quad[0]);
|
|
879
770
|
const area2 = triangleArea(quad[0], quad[1], quad[2]) + triangleArea(quad[1], quad[2], quad[3]);
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
// Check that point is not on the right/bottom edge, because clicking
|
|
883
|
-
// there does not actually click the element.
|
|
771
|
+
if (Math.abs(area1 - area2) > 0.1)
|
|
772
|
+
return false;
|
|
884
773
|
return point.x < Math.max(quad[0].x, quad[1].x, quad[2].x, quad[3].x) && point.y < Math.max(quad[0].y, quad[1].y, quad[2].y, quad[3].y);
|
|
885
774
|
}
|
|
886
775
|
function findIntegerPointInsideQuad(quad) {
|
|
887
|
-
// Try all four rounding directions of the middle point.
|
|
888
776
|
const point = quadMiddlePoint(quad);
|
|
889
777
|
point.x = Math.floor(point.x);
|
|
890
778
|
point.y = Math.floor(point.y);
|
|
891
|
-
if (isPointInsideQuad(point, quad))
|
|
779
|
+
if (isPointInsideQuad(point, quad))
|
|
780
|
+
return point;
|
|
892
781
|
point.x += 1;
|
|
893
|
-
if (isPointInsideQuad(point, quad))
|
|
782
|
+
if (isPointInsideQuad(point, quad))
|
|
783
|
+
return point;
|
|
894
784
|
point.y += 1;
|
|
895
|
-
if (isPointInsideQuad(point, quad))
|
|
785
|
+
if (isPointInsideQuad(point, quad))
|
|
786
|
+
return point;
|
|
896
787
|
point.x -= 1;
|
|
897
|
-
if (isPointInsideQuad(point, quad))
|
|
788
|
+
if (isPointInsideQuad(point, quad))
|
|
789
|
+
return point;
|
|
898
790
|
}
|
|
899
|
-
const kUnableToAdoptErrorMessage =
|
|
791
|
+
const kUnableToAdoptErrorMessage = "Unable to adopt element handle from a different document";
|
|
792
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
793
|
+
0 && (module.exports = {
|
|
794
|
+
ElementHandle,
|
|
795
|
+
FrameExecutionContext,
|
|
796
|
+
NonRecoverableDOMError,
|
|
797
|
+
assertDone,
|
|
798
|
+
isNonRecoverableDOMError,
|
|
799
|
+
kUnableToAdoptErrorMessage,
|
|
800
|
+
throwElementIsNotAttached,
|
|
801
|
+
throwRetargetableDOMError
|
|
802
|
+
});
|