patchright-core 1.51.3 → 1.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browsers.json +15 -13
- package/lib/androidServerImpl.js +42 -48
- package/lib/browserServerImpl.js +54 -67
- package/lib/cli/driver.js +71 -69
- package/lib/cli/program.js +312 -328
- package/lib/cli/programWithTestStub.js +51 -45
- package/lib/client/accessibility.js +31 -32
- package/lib/client/android.js +141 -228
- package/lib/client/api.js +135 -283
- package/lib/client/artifact.js +39 -36
- package/lib/client/browser.js +57 -61
- package/lib/client/browserContext.js +297 -326
- package/lib/client/browserType.js +92 -106
- package/lib/client/cdpSession.js +29 -31
- package/lib/client/channelOwner.js +82 -95
- package/lib/client/clientHelper.js +46 -38
- 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 +190 -212
- 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 +73 -75
- package/lib/client/elementHandle.js +111 -147
- 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 +135 -158
- package/lib/client/fileChooser.js +25 -24
- package/lib/client/fileUtils.js +31 -28
- package/lib/client/frame.js +187 -306
- package/lib/client/harRouter.js +42 -52
- package/lib/client/input.js +40 -69
- package/lib/client/jsHandle.js +56 -71
- package/lib/client/jsonPipe.js +27 -23
- package/lib/client/localUtils.js +29 -28
- package/lib/client/locator.js +161 -245
- package/lib/client/network.js +277 -295
- package/lib/client/page.js +270 -318
- package/lib/client/platform.js +46 -43
- package/lib/client/playwright.js +51 -66
- package/lib/client/selectors.js +48 -46
- package/lib/client/stream.js +29 -25
- package/lib/client/timeoutSettings.js +49 -39
- package/lib/client/tracing.js +48 -84
- 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 +61 -56
- package/lib/client/worker.js +48 -58
- package/lib/client/writableStream.js +27 -23
- package/lib/generated/clockSource.js +26 -5
- package/lib/generated/consoleApiSource.js +26 -5
- package/lib/generated/injectedScriptSource.js +26 -5
- package/lib/generated/pollingRecorderSource.js +26 -5
- package/lib/generated/utilityScriptSource.js +26 -5
- package/lib/generated/webSocketMockSource.js +371 -4
- package/lib/inProcessFactory.js +53 -53
- package/lib/inprocess.js +2 -19
- package/lib/outofprocess.js +53 -46
- package/lib/protocol/debug.js +209 -25
- package/lib/protocol/serializers.js +153 -134
- package/lib/protocol/validator.js +2714 -2714
- package/lib/protocol/validatorPrimitives.js +114 -73
- package/lib/remote/playwrightConnection.js +140 -157
- package/lib/remote/playwrightServer.js +99 -84
- package/lib/server/accessibility.js +44 -37
- package/lib/server/android/android.js +216 -209
- package/lib/server/android/backendAdb.js +89 -82
- package/lib/server/artifact.js +78 -55
- package/lib/server/bidi/bidiBrowser.js +221 -155
- package/lib/server/bidi/bidiChromium.js +106 -79
- package/lib/server/bidi/bidiConnection.js +66 -83
- package/lib/server/bidi/bidiExecutionContext.js +128 -113
- package/lib/server/bidi/bidiFirefox.js +76 -69
- package/lib/server/bidi/bidiInput.js +86 -97
- package/lib/server/bidi/bidiNetworkManager.js +137 -154
- package/lib/server/bidi/bidiOverCdp.js +57 -58
- package/lib/server/bidi/bidiPage.js +247 -219
- 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 +144 -131
- 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 +76 -84
- package/lib/server/browserContext.js +321 -346
- package/lib/server/browserType.js +169 -182
- package/lib/server/callLog.js +47 -44
- package/lib/server/chromium/chromium.js +212 -190
- package/lib/server/chromium/chromiumSwitches.js +86 -64
- package/lib/server/chromium/crAccessibility.js +157 -131
- package/lib/server/chromium/crBrowser.js +253 -273
- package/lib/server/chromium/crConnection.js +91 -116
- package/lib/server/chromium/crCoverage.js +113 -127
- package/lib/server/chromium/crDevTools.js +59 -51
- package/lib/server/chromium/crDragDrop.js +62 -79
- package/lib/server/chromium/crExecutionContext.js +88 -83
- package/lib/server/chromium/crInput.js +97 -95
- package/lib/server/chromium/crNetworkManager.js +284 -404
- package/lib/server/chromium/crPage.js +522 -608
- package/lib/server/chromium/crPdf.js +54 -86
- package/lib/server/chromium/crProtocolHelper.js +92 -80
- package/lib/server/chromium/crServiceWorker.js +82 -67
- package/lib/server/chromium/defaultFontFamilies.js +152 -135
- package/lib/server/chromium/protocol.d.js +16 -0
- package/lib/server/chromium/videoRecorder.js +65 -99
- package/lib/server/clock.js +62 -50
- package/lib/server/codegen/csharp.js +185 -160
- package/lib/server/codegen/java.js +155 -128
- 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 +140 -125
- package/lib/server/codegen/types.js +15 -4
- package/lib/server/console.js +28 -32
- package/lib/server/cookieStore.js +105 -86
- package/lib/server/debugController.js +97 -124
- package/lib/server/debugger.js +82 -78
- package/lib/server/deviceDescriptors.js +37 -24
- package/lib/server/deviceDescriptorsSource.json +50 -50
- package/lib/server/dialog.js +36 -35
- package/lib/server/dispatchers/androidDispatcher.js +196 -107
- package/lib/server/dispatchers/artifactDispatcher.js +62 -62
- package/lib/server/dispatchers/browserContextDispatcher.js +176 -205
- package/lib/server/dispatchers/browserDispatcher.js +78 -97
- package/lib/server/dispatchers/browserTypeDispatcher.js +35 -35
- package/lib/server/dispatchers/cdpSessionDispatcher.js +32 -36
- package/lib/server/dispatchers/debugControllerDispatcher.js +48 -66
- package/lib/server/dispatchers/dialogDispatcher.js +30 -27
- package/lib/server/dispatchers/dispatcher.js +169 -220
- package/lib/server/dispatchers/electronDispatcher.js +54 -57
- package/lib/server/dispatchers/elementHandlerDispatcher.js +77 -119
- package/lib/server/dispatchers/frameDispatcher.js +99 -163
- package/lib/server/dispatchers/jsHandleDispatcher.js +49 -66
- package/lib/server/dispatchers/jsonPipeDispatcher.js +35 -36
- package/lib/server/dispatchers/localUtilsDispatcher.js +95 -80
- package/lib/server/dispatchers/networkDispatchers.js +90 -107
- package/lib/server/dispatchers/pageDispatcher.js +128 -169
- package/lib/server/dispatchers/playwrightDispatcher.js +69 -76
- package/lib/server/dispatchers/selectorsDispatcher.js +28 -24
- package/lib/server/dispatchers/streamDispatcher.js +42 -45
- package/lib/server/dispatchers/tracingDispatcher.js +36 -41
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +96 -131
- package/lib/server/dispatchers/writableStreamDispatcher.js +54 -38
- package/lib/server/dom.js +413 -443
- package/lib/server/download.js +45 -35
- package/lib/server/electron/electron.js +156 -176
- package/lib/server/electron/loader.js +8 -36
- package/lib/server/errors.js +47 -46
- package/lib/server/fetch.js +289 -323
- package/lib/server/fileChooser.js +25 -24
- package/lib/server/fileUploadUtils.js +65 -59
- package/lib/server/firefox/ffAccessibility.js +153 -131
- package/lib/server/firefox/ffBrowser.js +213 -277
- package/lib/server/firefox/ffConnection.js +63 -84
- package/lib/server/firefox/ffExecutionContext.js +91 -73
- package/lib/server/firefox/ffInput.js +67 -69
- package/lib/server/firefox/ffNetworkManager.js +131 -110
- package/lib/server/firefox/ffPage.js +236 -273
- package/lib/server/firefox/firefox.js +76 -67
- package/lib/server/firefox/protocol.d.js +16 -0
- package/lib/server/formData.js +107 -35
- package/lib/server/frameSelectors.js +221 -112
- package/lib/server/frames.js +731 -894
- package/lib/server/har/harRecorder.js +85 -77
- package/lib/server/har/harTracer.js +287 -222
- package/lib/server/harBackend.js +80 -80
- package/lib/server/helper.js +56 -59
- package/lib/server/index.js +59 -99
- package/lib/server/input.js +134 -163
- package/lib/server/instrumentation.js +49 -44
- package/lib/server/javascript.js +143 -134
- package/lib/server/launchApp.js +92 -73
- package/lib/server/localUtils.js +130 -122
- package/lib/server/macEditingCommands.js +141 -137
- package/lib/server/network.js +262 -296
- package/lib/server/page.js +326 -423
- package/lib/server/pageBinding.js +88 -0
- package/lib/server/pipeTransport.js +49 -45
- package/lib/server/playwright.js +60 -67
- package/lib/server/progress.js +56 -51
- package/lib/server/protocolError.js +34 -31
- package/lib/server/recorder/chat.js +70 -86
- package/lib/server/recorder/contextRecorder.js +134 -138
- package/lib/server/recorder/recorderApp.js +127 -136
- package/lib/server/recorder/recorderCollection.js +56 -44
- package/lib/server/recorder/recorderFrontend.js +15 -4
- package/lib/server/recorder/recorderRunner.js +79 -103
- package/lib/server/recorder/recorderUtils.js +56 -45
- package/lib/server/recorder/throttledFile.js +42 -30
- package/lib/server/recorder.js +177 -186
- package/lib/server/registry/browserFetcher.js +106 -101
- package/lib/server/registry/dependencies.js +245 -196
- package/lib/server/registry/index.js +904 -792
- package/lib/server/registry/nativeDeps.js +1073 -464
- package/lib/server/registry/oopDownloadBrowserMain.js +57 -75
- package/lib/server/screenshotter.js +166 -182
- package/lib/server/selectors.js +85 -46
- package/lib/server/socksClientCertificatesInterceptor.js +166 -185
- package/lib/server/socksInterceptor.js +62 -70
- package/lib/server/storageScript.js +94 -100
- package/lib/server/timeoutSettings.js +58 -43
- package/lib/server/trace/recorder/snapshotter.js +70 -89
- package/lib/server/trace/recorder/snapshotterInjected.js +238 -217
- package/lib/server/trace/recorder/tracing.js +321 -333
- package/lib/server/trace/test/inMemorySnapshotter.js +46 -52
- package/lib/server/trace/viewer/traceViewer.js +168 -146
- package/lib/server/transport.js +124 -133
- 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 +37 -28
- package/lib/server/utils/debugLogger.js +69 -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 +138 -123
- 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 +143 -86
- 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 +73 -69
- 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 +76 -63
- package/lib/server/webkit/wkAccessibility.js +161 -118
- package/lib/server/webkit/wkBrowser.js +159 -176
- package/lib/server/webkit/wkConnection.js +59 -83
- package/lib/server/webkit/wkExecutionContext.js +84 -70
- package/lib/server/webkit/wkInput.js +82 -80
- package/lib/server/webkit/wkInterceptableRequest.js +102 -95
- package/lib/server/webkit/wkPage.js +525 -619
- package/lib/server/webkit/wkProvisionalPage.js +45 -56
- package/lib/server/webkit/wkWorkers.js +77 -77
- package/lib/utils/isomorphic/ariaSnapshot.js +144 -152
- package/lib/utils/isomorphic/assert.js +28 -22
- package/lib/utils/isomorphic/builtins.js +86 -0
- package/lib/utils/isomorphic/colors.js +66 -59
- package/lib/utils/isomorphic/cssParser.js +121 -125
- package/lib/utils/isomorphic/cssTokenizer.js +436 -364
- package/lib/utils/isomorphic/headers.js +38 -37
- package/lib/utils/isomorphic/locatorGenerators.js +340 -357
- package/lib/utils/isomorphic/locatorParser.js +96 -105
- package/lib/utils/isomorphic/locatorUtils.js +63 -44
- package/lib/utils/isomorphic/manualPromise.js +47 -39
- package/lib/utils/isomorphic/mimeType.js +448 -25
- package/lib/utils/isomorphic/multimap.js +35 -27
- package/lib/utils/isomorphic/rtti.js +35 -33
- package/lib/utils/isomorphic/selectorParser.js +183 -193
- package/lib/utils/isomorphic/semaphore.js +27 -24
- package/lib/utils/isomorphic/stackTrace.js +87 -98
- package/lib/utils/isomorphic/stringUtils.js +113 -106
- package/lib/utils/isomorphic/time.js +41 -22
- package/lib/utils/isomorphic/timeoutRunner.js +55 -54
- package/lib/utils/isomorphic/traceUtils.js +38 -41
- package/lib/utils/isomorphic/types.js +15 -4
- package/lib/utils/isomorphic/urlMatch.js +112 -67
- package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
- package/lib/utils.js +97 -443
- package/lib/utilsBundle.js +101 -52
- package/lib/vite/htmlReport/index.html +21 -15
- package/lib/vite/recorder/assets/{codeMirrorModule-B9YMkrwa.js → codeMirrorModule-CXVeovup.js} +1 -1
- package/lib/vite/recorder/assets/index-BsWQsSGl.js +184 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-1DiydmYA.js → codeMirrorModule-_GLjJL-7.js} +1 -1
- package/lib/vite/traceViewer/assets/defaultSettingsView-DtCQiGHe.js +265 -0
- package/lib/vite/traceViewer/{defaultSettingsView.5fN5lw10.css → defaultSettingsView.QdHITyLI.css} +1 -1
- package/lib/vite/traceViewer/index.cFZzK9RN.js +2 -0
- package/lib/vite/traceViewer/index.html +3 -3
- package/lib/vite/traceViewer/sw.bundle.js +3 -3
- package/lib/vite/traceViewer/uiMode.XVPIqBeS.js +5 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundle.js +32 -23
- package/package.json +1 -1
- package/types/protocol.d.ts +436 -17
- package/types/types.d.ts +35 -16
- package/lib/server/isomorphic/utilityScriptSerializers.js +0 -229
- package/lib/vite/recorder/assets/index-ELPgmkwA.js +0 -184
- package/lib/vite/traceViewer/assets/defaultSettingsView-l0TyP_G8.js +0 -259
- package/lib/vite/traceViewer/index.BqUZLSro.js +0 -2
- package/lib/vite/traceViewer/uiMode.C1d2m5sF.js +0 -5
|
@@ -1,49 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.
|
|
4
|
-
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var frameSelectors_exports = {};
|
|
20
|
+
__export(frameSelectors_exports, {
|
|
21
|
+
FrameSelectors: () => FrameSelectors
|
|
5
22
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
* Copyright (c) Microsoft Corporation.
|
|
11
|
-
*
|
|
12
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
* you may not use this file except in compliance with the License.
|
|
14
|
-
* You may obtain a copy of the License at
|
|
15
|
-
*
|
|
16
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
*
|
|
18
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
* See the License for the specific language governing permissions and
|
|
22
|
-
* limitations under the License.
|
|
23
|
-
*/
|
|
24
|
-
|
|
23
|
+
module.exports = __toCommonJS(frameSelectors_exports);
|
|
24
|
+
var import_dom = require("./dom");
|
|
25
|
+
var import_utils = require("../utils");
|
|
26
|
+
var import_selectorParser = require("../utils/isomorphic/selectorParser");
|
|
25
27
|
class FrameSelectors {
|
|
26
28
|
constructor(frame) {
|
|
27
|
-
this.frame = void 0;
|
|
28
29
|
this.frame = frame;
|
|
29
30
|
}
|
|
30
31
|
_parseSelector(selector, options) {
|
|
31
|
-
const strict = typeof
|
|
32
|
+
const strict = typeof options?.strict === "boolean" ? options.strict : !!this.frame._page.context()._options.strictSelectors;
|
|
32
33
|
return this.frame._page.context().selectors().parseSelector(selector, strict);
|
|
33
34
|
}
|
|
34
35
|
async query(selector, options, scope) {
|
|
35
36
|
const resolved = await this.resolveInjectedForSelector(selector, options, scope);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const handle = await resolved.injected.evaluateHandle((injected, {
|
|
39
|
-
info,
|
|
40
|
-
|
|
41
|
-
}) => {
|
|
42
|
-
return injected.querySelector(info.parsed, scope || document, info.strict);
|
|
43
|
-
}, {
|
|
44
|
-
info: resolved.info,
|
|
45
|
-
scope: resolved.scope
|
|
46
|
-
});
|
|
37
|
+
if (!resolved)
|
|
38
|
+
return null;
|
|
39
|
+
const handle = await resolved.injected.evaluateHandle((injected, { info, scope: scope2 }) => {
|
|
40
|
+
return injected.querySelector(info.parsed, scope2 || document, info.strict);
|
|
41
|
+
}, { info: resolved.info, scope: resolved.scope });
|
|
47
42
|
const elementHandle = handle.asElement();
|
|
48
43
|
if (!elementHandle) {
|
|
49
44
|
handle.dispose();
|
|
@@ -52,67 +47,49 @@ class FrameSelectors {
|
|
|
52
47
|
return adoptIfNeeded(elementHandle, await resolved.frame._mainContext());
|
|
53
48
|
}
|
|
54
49
|
async queryArrayInMainWorld(selector, scope) {
|
|
55
|
-
const resolved = await this.resolveInjectedForSelector(selector, {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
info,
|
|
62
|
-
scope
|
|
63
|
-
}) => {
|
|
64
|
-
return injected.querySelectorAll(info.parsed, scope || document);
|
|
65
|
-
}, {
|
|
66
|
-
info: resolved.info,
|
|
67
|
-
scope: resolved.scope
|
|
68
|
-
});
|
|
50
|
+
const resolved = await this.resolveInjectedForSelector(selector, { mainWorld: true }, scope);
|
|
51
|
+
if (!resolved)
|
|
52
|
+
throw new Error(`Failed to find frame for selector "${selector}"`);
|
|
53
|
+
return await resolved.injected.evaluateHandle((injected, { info, scope: scope2 }) => {
|
|
54
|
+
return injected.querySelectorAll(info.parsed, scope2 || document);
|
|
55
|
+
}, { info: resolved.info, scope: resolved.scope });
|
|
69
56
|
}
|
|
70
57
|
async queryCount(selector) {
|
|
71
58
|
const resolved = await this.resolveInjectedForSelector(selector);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return await resolved.injected.evaluate((injected, {
|
|
75
|
-
info
|
|
76
|
-
}) => {
|
|
59
|
+
if (!resolved)
|
|
60
|
+
throw new Error(`Failed to find frame for selector "${selector}"`);
|
|
61
|
+
return await resolved.injected.evaluate((injected, { info }) => {
|
|
77
62
|
return injected.querySelectorAll(info.parsed, document).length;
|
|
78
|
-
}, {
|
|
79
|
-
info: resolved.info
|
|
80
|
-
});
|
|
63
|
+
}, { info: resolved.info });
|
|
81
64
|
}
|
|
82
65
|
async queryAll(selector, scope) {
|
|
83
66
|
const resolved = await this.resolveInjectedForSelector(selector, {}, scope);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const arrayHandle = await resolved.injected.evaluateHandle((injected, {
|
|
87
|
-
info,
|
|
88
|
-
|
|
89
|
-
}) => {
|
|
90
|
-
return injected.querySelectorAll(info.parsed, scope || document);
|
|
91
|
-
}, {
|
|
92
|
-
info: resolved.info,
|
|
93
|
-
scope: resolved.scope
|
|
94
|
-
});
|
|
67
|
+
if (!resolved)
|
|
68
|
+
return [];
|
|
69
|
+
const arrayHandle = await resolved.injected.evaluateHandle((injected, { info, scope: scope2 }) => {
|
|
70
|
+
return injected.querySelectorAll(info.parsed, scope2 || document);
|
|
71
|
+
}, { info: resolved.info, scope: resolved.scope });
|
|
95
72
|
const properties = await arrayHandle.getProperties();
|
|
96
73
|
arrayHandle.dispose();
|
|
97
|
-
|
|
98
|
-
// Note: adopting elements one by one may be slow. If we encounter the issue here,
|
|
99
|
-
// we might introduce 'useMainContext' option or similar to speed things up.
|
|
100
74
|
const targetContext = await resolved.frame._mainContext();
|
|
101
75
|
const result = [];
|
|
102
76
|
for (const property of properties.values()) {
|
|
103
77
|
const elementHandle = property.asElement();
|
|
104
|
-
if (elementHandle)
|
|
78
|
+
if (elementHandle)
|
|
79
|
+
result.push(adoptIfNeeded(elementHandle, targetContext));
|
|
80
|
+
else
|
|
81
|
+
property.dispose();
|
|
105
82
|
}
|
|
106
83
|
return Promise.all(result);
|
|
107
84
|
}
|
|
108
85
|
async resolveFrameForSelector(selector, options = {}, scope) {
|
|
109
86
|
let frame = this.frame;
|
|
110
|
-
const frameChunks = (0,
|
|
87
|
+
const frameChunks = (0, import_selectorParser.splitSelectorByFrame)(selector);
|
|
111
88
|
for (const chunk of frameChunks) {
|
|
112
|
-
(0,
|
|
113
|
-
if (nested && part.name ===
|
|
114
|
-
const locator = (0,
|
|
115
|
-
throw new
|
|
89
|
+
(0, import_selectorParser.visitAllSelectorParts)(chunk, (part, nested) => {
|
|
90
|
+
if (nested && part.name === "internal:control" && part.body === "enter-frame") {
|
|
91
|
+
const locator = (0, import_utils.asLocator)(this.frame._page.attribution.playwright.options.sdkLanguage, selector);
|
|
92
|
+
throw new import_selectorParser.InvalidSelectorError(`Frame locators are not allowed inside composite locators, while querying "${locator}"`);
|
|
116
93
|
}
|
|
117
94
|
});
|
|
118
95
|
}
|
|
@@ -120,52 +97,184 @@ class FrameSelectors {
|
|
|
120
97
|
const info = this._parseSelector(frameChunks[i], options);
|
|
121
98
|
const context = await frame._context(info.world);
|
|
122
99
|
const injectedScript = await context.injectedScript();
|
|
123
|
-
const handle = await injectedScript.evaluateHandle((injected, {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
100
|
+
const handle = await injectedScript.evaluateHandle((injected, { info: info2, scope: scope2, selectorString }) => {
|
|
101
|
+
const element2 = injected.querySelector(info2.parsed, scope2 || document, info2.strict);
|
|
102
|
+
if (element2 && element2.nodeName !== "IFRAME" && element2.nodeName !== "FRAME")
|
|
103
|
+
throw injected.createStacklessError(`Selector "${selectorString}" resolved to ${injected.previewNode(element2)}, <iframe> was expected`);
|
|
104
|
+
return element2;
|
|
105
|
+
}, { info, scope: i === 0 ? scope : void 0, selectorString: (0, import_selectorParser.stringifySelector)(info.parsed) });
|
|
106
|
+
let element = handle.asElement();
|
|
107
|
+
if (!element) {
|
|
108
|
+
try {
|
|
109
|
+
var client = frame._page._delegate._sessionForFrame(frame)._client;
|
|
110
|
+
} catch (e) {
|
|
111
|
+
var client = frame._page._delegate._mainFrameSession._client;
|
|
112
|
+
}
|
|
113
|
+
var mainContext = await frame._context("main");
|
|
114
|
+
const documentNode = await client.send("Runtime.evaluate", {
|
|
115
|
+
expression: "document",
|
|
116
|
+
serializationOptions: {
|
|
117
|
+
serialization: "idOnly"
|
|
118
|
+
},
|
|
119
|
+
contextId: mainContext.delegate._contextId
|
|
120
|
+
});
|
|
121
|
+
const documentScope = new import_dom.ElementHandle(mainContext, documentNode.result.objectId);
|
|
122
|
+
var check = await this._customFindFramesByParsed(injectedScript, client, mainContext, documentScope, info.parsed);
|
|
123
|
+
if (check.length > 0) {
|
|
124
|
+
element = check[0];
|
|
125
|
+
} else {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
138
129
|
const maybeFrame = await frame._page._delegate.getContentFrame(element);
|
|
139
130
|
element.dispose();
|
|
140
|
-
if (!maybeFrame)
|
|
131
|
+
if (!maybeFrame)
|
|
132
|
+
return null;
|
|
141
133
|
frame = maybeFrame;
|
|
142
134
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
frame,
|
|
147
|
-
info: frame.selectors._parseSelector(frameChunks[frameChunks.length - 1], options),
|
|
148
|
-
scope
|
|
149
|
-
};
|
|
135
|
+
if (frame !== this.frame)
|
|
136
|
+
scope = void 0;
|
|
137
|
+
return { frame, info: frame.selectors._parseSelector(frameChunks[frameChunks.length - 1], options), scope };
|
|
150
138
|
}
|
|
151
139
|
async resolveInjectedForSelector(selector, options, scope) {
|
|
152
140
|
const resolved = await this.resolveFrameForSelector(selector, options, scope);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const context = await resolved.frame._context(options
|
|
141
|
+
if (!resolved)
|
|
142
|
+
return;
|
|
143
|
+
const context = await resolved.frame._context(options?.mainWorld ? "main" : resolved.info.world);
|
|
156
144
|
const injected = await context.injectedScript();
|
|
157
|
-
return {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
145
|
+
return { injected, info: resolved.info, frame: resolved.frame, scope: resolved.scope };
|
|
146
|
+
}
|
|
147
|
+
async _customFindFramesByParsed(injected, client, context, documentScope, parsed) {
|
|
148
|
+
var parsedEdits = { ...parsed };
|
|
149
|
+
var currentScopingElements = [documentScope];
|
|
150
|
+
while (parsed.parts.length > 0) {
|
|
151
|
+
var part = parsed.parts.shift();
|
|
152
|
+
parsedEdits.parts = [part];
|
|
153
|
+
var isUsingXPath = false;
|
|
154
|
+
var elements = [];
|
|
155
|
+
var elementsIndexes = [];
|
|
156
|
+
if (part.name == "xpath") {
|
|
157
|
+
isUsingXPath = true;
|
|
158
|
+
}
|
|
159
|
+
if (part.name == "nth") {
|
|
160
|
+
const partNth = Number(part.body);
|
|
161
|
+
if (partNth > currentScopingElements.length || partNth < -currentScopingElements.length) {
|
|
162
|
+
return continuePolling;
|
|
163
|
+
} else {
|
|
164
|
+
currentScopingElements = [currentScopingElements.at(partNth)];
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
} else if (part.name == "internal:or") {
|
|
168
|
+
var orredElements = await this._customFindFramesByParsed(injected, client, context, documentScope, part.body.parsed);
|
|
169
|
+
elements = currentScopingElements.concat(orredElements);
|
|
170
|
+
} else if (part.name == "internal:and") {
|
|
171
|
+
var andedElements = await this._customFindFramesByParsed(injected, client, context, documentScope, part.body.parsed);
|
|
172
|
+
const backendNodeIds = new Set(andedElements.map((item) => item.backendNodeId));
|
|
173
|
+
elements = currentScopingElements.filter((item) => backendNodeIds.has(item.backendNodeId));
|
|
174
|
+
} else {
|
|
175
|
+
for (const scope of currentScopingElements) {
|
|
176
|
+
const describedScope = await client.send("DOM.describeNode", {
|
|
177
|
+
objectId: scope._objectId,
|
|
178
|
+
depth: -1,
|
|
179
|
+
pierce: true
|
|
180
|
+
});
|
|
181
|
+
var queryingElements = [];
|
|
182
|
+
if (!isUsingXPath) {
|
|
183
|
+
let findClosedShadowRoots2 = function(node, results = []) {
|
|
184
|
+
if (!node || typeof node !== "object") return results;
|
|
185
|
+
if (node.shadowRoots && Array.isArray(node.shadowRoots)) {
|
|
186
|
+
for (const shadowRoot2 of node.shadowRoots) {
|
|
187
|
+
if (shadowRoot2.shadowRootType === "closed" && shadowRoot2.backendNodeId) {
|
|
188
|
+
results.push(shadowRoot2.backendNodeId);
|
|
189
|
+
}
|
|
190
|
+
findClosedShadowRoots2(shadowRoot2, results);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (node.nodeName !== "IFRAME" && node.children && Array.isArray(node.children)) {
|
|
194
|
+
for (const child of node.children) {
|
|
195
|
+
findClosedShadowRoots2(child, results);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return results;
|
|
199
|
+
};
|
|
200
|
+
var findClosedShadowRoots = findClosedShadowRoots2;
|
|
201
|
+
var shadowRootBackendIds = findClosedShadowRoots2(describedScope.node);
|
|
202
|
+
var shadowRoots = [];
|
|
203
|
+
for (var shadowRootBackendId of shadowRootBackendIds) {
|
|
204
|
+
var resolvedShadowRoot = await client.send("DOM.resolveNode", {
|
|
205
|
+
backendNodeId: shadowRootBackendId,
|
|
206
|
+
contextId: context.delegate._contextId
|
|
207
|
+
});
|
|
208
|
+
shadowRoots.push(new import_dom.ElementHandle(context, resolvedShadowRoot.object.objectId));
|
|
209
|
+
}
|
|
210
|
+
for (var shadowRoot of shadowRoots) {
|
|
211
|
+
const shadowElements = await shadowRoot.evaluateHandleInUtility(([injected2, node, { parsed: parsed2 }]) => {
|
|
212
|
+
const elements2 = injected2.querySelectorAll(parsed2, node);
|
|
213
|
+
return elements2;
|
|
214
|
+
}, {
|
|
215
|
+
parsed: parsedEdits
|
|
216
|
+
});
|
|
217
|
+
const shadowElementsAmount = await shadowElements.getProperty("length");
|
|
218
|
+
queryingElements.push([shadowElements, shadowElementsAmount, shadowRoot]);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const rootElements = await scope.evaluateHandleInUtility(([injected2, node, { parsed: parsed2 }]) => {
|
|
222
|
+
const elements2 = injected2.querySelectorAll(parsed2, node);
|
|
223
|
+
return elements2;
|
|
224
|
+
}, {
|
|
225
|
+
parsed: parsedEdits
|
|
226
|
+
});
|
|
227
|
+
const rootElementsAmount = await rootElements.getProperty("length");
|
|
228
|
+
queryingElements.push([rootElements, rootElementsAmount, injected]);
|
|
229
|
+
for (var queryedElement of queryingElements) {
|
|
230
|
+
var elementsToCheck = queryedElement[0];
|
|
231
|
+
var elementsAmount = await queryedElement[1].jsonValue();
|
|
232
|
+
var parentNode = queryedElement[2];
|
|
233
|
+
for (var i = 0; i < elementsAmount; i++) {
|
|
234
|
+
if (parentNode.constructor.name == "ElementHandle") {
|
|
235
|
+
var elementToCheck = await parentNode.evaluateHandleInUtility(([injected2, node, { index, elementsToCheck: elementsToCheck2 }]) => {
|
|
236
|
+
return elementsToCheck2[index];
|
|
237
|
+
}, { index: i, elementsToCheck });
|
|
238
|
+
} else {
|
|
239
|
+
var elementToCheck = await parentNode.evaluateHandle((injected2, { index, elementsToCheck: elementsToCheck2 }) => {
|
|
240
|
+
return elementsToCheck2[index];
|
|
241
|
+
}, { index: i, elementsToCheck });
|
|
242
|
+
}
|
|
243
|
+
elementToCheck.parentNode = parentNode;
|
|
244
|
+
var resolvedElement = await client.send("DOM.describeNode", {
|
|
245
|
+
objectId: elementToCheck._objectId,
|
|
246
|
+
depth: -1
|
|
247
|
+
});
|
|
248
|
+
elementToCheck.backendNodeId = resolvedElement.node.backendNodeId;
|
|
249
|
+
elements.push(elementToCheck);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
currentScopingElements = [];
|
|
255
|
+
for (var element of elements) {
|
|
256
|
+
var elemIndex = element.backendNodeId;
|
|
257
|
+
var elemPos = elementsIndexes.findIndex((index) => index > elemIndex);
|
|
258
|
+
if (elemPos === -1) {
|
|
259
|
+
currentScopingElements.push(element);
|
|
260
|
+
elementsIndexes.push(elemIndex);
|
|
261
|
+
} else {
|
|
262
|
+
currentScopingElements.splice(elemPos, 0, element);
|
|
263
|
+
elementsIndexes.splice(elemPos, 0, elemIndex);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return currentScopingElements;
|
|
163
268
|
}
|
|
164
269
|
}
|
|
165
|
-
exports.FrameSelectors = FrameSelectors;
|
|
166
270
|
async function adoptIfNeeded(handle, context) {
|
|
167
|
-
if (handle._context === context)
|
|
271
|
+
if (handle._context === context)
|
|
272
|
+
return handle;
|
|
168
273
|
const adopted = await handle._page._delegate.adoptElementHandle(handle, context);
|
|
169
274
|
handle.dispose();
|
|
170
275
|
return adopted;
|
|
171
|
-
}
|
|
276
|
+
}
|
|
277
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
278
|
+
0 && (module.exports = {
|
|
279
|
+
FrameSelectors
|
|
280
|
+
});
|