patchright 1.48.0__py3-none-win32.whl
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.
- patchright/__init__.py +5 -0
- patchright/__main__.py +18 -0
- patchright/_impl/__init__.py +0 -0
- patchright/_impl/__pyinstaller/__init__.py +20 -0
- patchright/_impl/__pyinstaller/hook-playwright.async_api.py +17 -0
- patchright/_impl/__pyinstaller/hook-playwright.sync_api.py +17 -0
- patchright/_impl/_accessibility.py +50 -0
- patchright/_impl/_api_structures.py +271 -0
- patchright/_impl/_artifact.py +45 -0
- patchright/_impl/_assertions.py +779 -0
- patchright/_impl/_async_base.py +92 -0
- patchright/_impl/_browser.py +243 -0
- patchright/_impl/_browser_context.py +724 -0
- patchright/_impl/_browser_type.py +264 -0
- patchright/_impl/_cdp_session.py +21 -0
- patchright/_impl/_clock.py +57 -0
- patchright/_impl/_connection.py +554 -0
- patchright/_impl/_console_message.py +45 -0
- patchright/_impl/_dialog.py +40 -0
- patchright/_impl/_download.py +50 -0
- patchright/_impl/_driver.py +26 -0
- patchright/_impl/_element_handle.py +376 -0
- patchright/_impl/_errors.py +44 -0
- patchright/_impl/_event_context_manager.py +20 -0
- patchright/_impl/_fetch.py +511 -0
- patchright/_impl/_file_chooser.py +43 -0
- patchright/_impl/_frame.py +755 -0
- patchright/_impl/_glob.py +51 -0
- patchright/_impl/_greenlets.py +39 -0
- patchright/_impl/_har_router.py +99 -0
- patchright/_impl/_helper.py +421 -0
- patchright/_impl/_impl_to_api_mapping.py +123 -0
- patchright/_impl/_input.py +71 -0
- patchright/_impl/_js_handle.py +234 -0
- patchright/_impl/_json_pipe.py +56 -0
- patchright/_impl/_local_utils.py +73 -0
- patchright/_impl/_locator.py +784 -0
- patchright/_impl/_map.py +19 -0
- patchright/_impl/_network.py +934 -0
- patchright/_impl/_object_factory.py +91 -0
- patchright/_impl/_page.py +1446 -0
- patchright/_impl/_path_utils.py +11 -0
- patchright/_impl/_playwright.py +51 -0
- patchright/_impl/_selectors.py +62 -0
- patchright/_impl/_set_input_files_helpers.py +135 -0
- patchright/_impl/_str_utils.py +57 -0
- patchright/_impl/_stream.py +32 -0
- patchright/_impl/_sync_base.py +134 -0
- patchright/_impl/_tracing.py +103 -0
- patchright/_impl/_transport.py +150 -0
- patchright/_impl/_video.py +57 -0
- patchright/_impl/_waiter.py +142 -0
- patchright/_impl/_web_error.py +22 -0
- patchright/_impl/_writable_stream.py +27 -0
- patchright/_repo_version.py +12 -0
- patchright/async_api/__init__.py +177 -0
- patchright/async_api/_context_manager.py +39 -0
- patchright/async_api/_generated.py +19960 -0
- patchright/driver/LICENSE +2174 -0
- patchright/driver/README.md +1 -0
- patchright/driver/node.exe +0 -0
- patchright/driver/package/README.md +3 -0
- patchright/driver/package/ThirdPartyNotices.txt +1548 -0
- patchright/driver/package/api.json +1 -0
- patchright/driver/package/bin/PrintDeps.exe +0 -0
- patchright/driver/package/bin/README.md +2 -0
- patchright/driver/package/bin/install_media_pack.ps1 +5 -0
- patchright/driver/package/bin/reinstall_chrome_beta_linux.sh +40 -0
- patchright/driver/package/bin/reinstall_chrome_beta_mac.sh +13 -0
- patchright/driver/package/bin/reinstall_chrome_beta_win.ps1 +24 -0
- patchright/driver/package/bin/reinstall_chrome_stable_linux.sh +40 -0
- patchright/driver/package/bin/reinstall_chrome_stable_mac.sh +12 -0
- patchright/driver/package/bin/reinstall_chrome_stable_win.ps1 +24 -0
- patchright/driver/package/bin/reinstall_msedge_beta_linux.sh +40 -0
- patchright/driver/package/bin/reinstall_msedge_beta_mac.sh +11 -0
- patchright/driver/package/bin/reinstall_msedge_beta_win.ps1 +23 -0
- patchright/driver/package/bin/reinstall_msedge_dev_linux.sh +40 -0
- patchright/driver/package/bin/reinstall_msedge_dev_mac.sh +11 -0
- patchright/driver/package/bin/reinstall_msedge_dev_win.ps1 +23 -0
- patchright/driver/package/bin/reinstall_msedge_stable_linux.sh +40 -0
- patchright/driver/package/bin/reinstall_msedge_stable_mac.sh +11 -0
- patchright/driver/package/bin/reinstall_msedge_stable_win.ps1 +24 -0
- patchright/driver/package/browsers.json +57 -0
- patchright/driver/package/cli.js +18 -0
- patchright/driver/package/index.d.ts +17 -0
- patchright/driver/package/index.js +33 -0
- patchright/driver/package/index.mjs +28 -0
- patchright/driver/package/lib/androidServerImpl.js +69 -0
- patchright/driver/package/lib/browserServerImpl.js +92 -0
- patchright/driver/package/lib/cli/driver.js +95 -0
- patchright/driver/package/lib/cli/program.js +587 -0
- patchright/driver/package/lib/cli/programWithTestStub.js +67 -0
- patchright/driver/package/lib/client/accessibility.js +50 -0
- patchright/driver/package/lib/client/android.js +473 -0
- patchright/driver/package/lib/client/api.js +285 -0
- patchright/driver/package/lib/client/artifact.js +79 -0
- patchright/driver/package/lib/client/browser.js +145 -0
- patchright/driver/package/lib/client/browserContext.js +559 -0
- patchright/driver/package/lib/client/browserType.js +241 -0
- patchright/driver/package/lib/client/cdpSession.js +53 -0
- patchright/driver/package/lib/client/channelOwner.js +235 -0
- patchright/driver/package/lib/client/clientHelper.js +57 -0
- patchright/driver/package/lib/client/clientInstrumentation.js +50 -0
- patchright/driver/package/lib/client/clock.js +68 -0
- patchright/driver/package/lib/client/connection.js +333 -0
- patchright/driver/package/lib/client/consoleMessage.js +55 -0
- patchright/driver/package/lib/client/coverage.js +41 -0
- patchright/driver/package/lib/client/dialog.js +57 -0
- patchright/driver/package/lib/client/download.js +62 -0
- patchright/driver/package/lib/client/electron.js +135 -0
- patchright/driver/package/lib/client/elementHandle.js +321 -0
- patchright/driver/package/lib/client/errors.js +77 -0
- patchright/driver/package/lib/client/eventEmitter.js +314 -0
- patchright/driver/package/lib/client/events.js +94 -0
- patchright/driver/package/lib/client/fetch.js +391 -0
- patchright/driver/package/lib/client/fileChooser.js +45 -0
- patchright/driver/package/lib/client/frame.js +504 -0
- patchright/driver/package/lib/client/harRouter.js +99 -0
- patchright/driver/package/lib/client/input.js +111 -0
- patchright/driver/package/lib/client/jsHandle.js +121 -0
- patchright/driver/package/lib/client/jsonPipe.js +35 -0
- patchright/driver/package/lib/client/localUtils.js +36 -0
- patchright/driver/package/lib/client/locator.js +441 -0
- patchright/driver/package/lib/client/network.js +762 -0
- patchright/driver/package/lib/client/page.js +746 -0
- patchright/driver/package/lib/client/playwright.js +80 -0
- patchright/driver/package/lib/client/selectors.js +67 -0
- patchright/driver/package/lib/client/stream.js +54 -0
- patchright/driver/package/lib/client/tracing.js +134 -0
- patchright/driver/package/lib/client/types.js +24 -0
- patchright/driver/package/lib/client/video.js +51 -0
- patchright/driver/package/lib/client/waiter.js +158 -0
- patchright/driver/package/lib/client/webError.js +37 -0
- patchright/driver/package/lib/client/worker.js +71 -0
- patchright/driver/package/lib/client/writableStream.js +54 -0
- patchright/driver/package/lib/common/socksProxy.js +569 -0
- patchright/driver/package/lib/common/timeoutSettings.js +73 -0
- patchright/driver/package/lib/common/types.js +5 -0
- patchright/driver/package/lib/generated/clockSource.js +7 -0
- patchright/driver/package/lib/generated/consoleApiSource.js +7 -0
- patchright/driver/package/lib/generated/injectedScriptSource.js +7 -0
- patchright/driver/package/lib/generated/pollingRecorderSource.js +7 -0
- patchright/driver/package/lib/generated/utilityScriptSource.js +7 -0
- patchright/driver/package/lib/generated/webSocketMockSource.js +7 -0
- patchright/driver/package/lib/image_tools/colorUtils.js +98 -0
- patchright/driver/package/lib/image_tools/compare.js +108 -0
- patchright/driver/package/lib/image_tools/imageChannel.js +70 -0
- patchright/driver/package/lib/image_tools/stats.js +102 -0
- patchright/driver/package/lib/inProcessFactory.js +54 -0
- patchright/driver/package/lib/inprocess.js +20 -0
- patchright/driver/package/lib/outofprocess.js +67 -0
- patchright/driver/package/lib/protocol/debug.js +27 -0
- patchright/driver/package/lib/protocol/serializers.js +173 -0
- patchright/driver/package/lib/protocol/transport.js +82 -0
- patchright/driver/package/lib/protocol/validator.js +2759 -0
- patchright/driver/package/lib/protocol/validatorPrimitives.js +139 -0
- patchright/driver/package/lib/remote/playwrightConnection.js +274 -0
- patchright/driver/package/lib/remote/playwrightServer.js +110 -0
- patchright/driver/package/lib/server/accessibility.js +62 -0
- patchright/driver/package/lib/server/android/android.js +441 -0
- patchright/driver/package/lib/server/android/backendAdb.js +172 -0
- patchright/driver/package/lib/server/artifact.js +104 -0
- patchright/driver/package/lib/server/bidi/bidiBrowser.js +311 -0
- patchright/driver/package/lib/server/bidi/bidiChromium.js +124 -0
- patchright/driver/package/lib/server/bidi/bidiConnection.js +206 -0
- patchright/driver/package/lib/server/bidi/bidiExecutionContext.js +159 -0
- patchright/driver/package/lib/server/bidi/bidiFirefox.js +104 -0
- patchright/driver/package/lib/server/bidi/bidiInput.js +158 -0
- patchright/driver/package/lib/server/bidi/bidiNetworkManager.js +338 -0
- patchright/driver/package/lib/server/bidi/bidiOverCdp.js +103 -0
- patchright/driver/package/lib/server/bidi/bidiPage.js +529 -0
- patchright/driver/package/lib/server/bidi/bidiPdf.js +140 -0
- patchright/driver/package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
- patchright/driver/package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
- patchright/driver/package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
- patchright/driver/package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
- patchright/driver/package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
- patchright/driver/package/lib/server/browser.js +148 -0
- patchright/driver/package/lib/server/browserContext.js +666 -0
- patchright/driver/package/lib/server/browserType.js +335 -0
- patchright/driver/package/lib/server/chromium/appIcon.png +0 -0
- patchright/driver/package/lib/server/chromium/chromium.js +350 -0
- patchright/driver/package/lib/server/chromium/chromiumSwitches.js +36 -0
- patchright/driver/package/lib/server/chromium/crAccessibility.js +237 -0
- patchright/driver/package/lib/server/chromium/crBrowser.js +522 -0
- patchright/driver/package/lib/server/chromium/crConnection.js +228 -0
- patchright/driver/package/lib/server/chromium/crCoverage.js +246 -0
- patchright/driver/package/lib/server/chromium/crDevTools.js +104 -0
- patchright/driver/package/lib/server/chromium/crDragDrop.js +143 -0
- patchright/driver/package/lib/server/chromium/crExecutionContext.js +149 -0
- patchright/driver/package/lib/server/chromium/crInput.js +171 -0
- patchright/driver/package/lib/server/chromium/crNetworkManager.js +809 -0
- patchright/driver/package/lib/server/chromium/crPage.js +1235 -0
- patchright/driver/package/lib/server/chromium/crPdf.js +153 -0
- patchright/driver/package/lib/server/chromium/crProtocolHelper.js +133 -0
- patchright/driver/package/lib/server/chromium/crServiceWorker.js +111 -0
- patchright/driver/package/lib/server/chromium/defaultFontFamilies.js +145 -0
- patchright/driver/package/lib/server/chromium/videoRecorder.js +155 -0
- patchright/driver/package/lib/server/clock.js +133 -0
- patchright/driver/package/lib/server/codegen/csharp.js +299 -0
- patchright/driver/package/lib/server/codegen/java.js +235 -0
- patchright/driver/package/lib/server/codegen/javascript.js +223 -0
- patchright/driver/package/lib/server/codegen/jsonl.js +47 -0
- patchright/driver/package/lib/server/codegen/language.js +88 -0
- patchright/driver/package/lib/server/codegen/languages.js +30 -0
- patchright/driver/package/lib/server/codegen/python.js +265 -0
- patchright/driver/package/lib/server/codegen/types.js +5 -0
- patchright/driver/package/lib/server/console.js +57 -0
- patchright/driver/package/lib/server/cookieStore.js +185 -0
- patchright/driver/package/lib/server/debugController.js +234 -0
- patchright/driver/package/lib/server/debugger.js +132 -0
- patchright/driver/package/lib/server/deviceDescriptors.js +26 -0
- patchright/driver/package/lib/server/deviceDescriptorsSource.json +1669 -0
- patchright/driver/package/lib/server/dialog.js +71 -0
- patchright/driver/package/lib/server/dispatchers/androidDispatcher.js +193 -0
- patchright/driver/package/lib/server/dispatchers/artifactDispatcher.js +118 -0
- patchright/driver/package/lib/server/dispatchers/browserContextDispatcher.js +368 -0
- patchright/driver/package/lib/server/dispatchers/browserDispatcher.js +170 -0
- patchright/driver/package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
- patchright/driver/package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
- patchright/driver/package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
- patchright/driver/package/lib/server/dispatchers/dialogDispatcher.js +44 -0
- patchright/driver/package/lib/server/dispatchers/dispatcher.js +395 -0
- patchright/driver/package/lib/server/dispatchers/electronDispatcher.js +93 -0
- patchright/driver/package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
- patchright/driver/package/lib/server/dispatchers/frameDispatcher.js +286 -0
- patchright/driver/package/lib/server/dispatchers/jsHandleDispatcher.js +97 -0
- patchright/driver/package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
- patchright/driver/package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
- patchright/driver/package/lib/server/dispatchers/networkDispatchers.js +221 -0
- patchright/driver/package/lib/server/dispatchers/pageDispatcher.js +367 -0
- patchright/driver/package/lib/server/dispatchers/playwrightDispatcher.js +107 -0
- patchright/driver/package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
- patchright/driver/package/lib/server/dispatchers/streamDispatcher.js +62 -0
- patchright/driver/package/lib/server/dispatchers/tracingDispatcher.js +54 -0
- patchright/driver/package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
- patchright/driver/package/lib/server/dispatchers/writableStreamDispatcher.js +58 -0
- patchright/driver/package/lib/server/dom.js +845 -0
- patchright/driver/package/lib/server/download.js +60 -0
- patchright/driver/package/lib/server/electron/electron.js +296 -0
- patchright/driver/package/lib/server/electron/loader.js +57 -0
- patchright/driver/package/lib/server/errors.js +68 -0
- patchright/driver/package/lib/server/fetch.js +656 -0
- patchright/driver/package/lib/server/fileChooser.js +42 -0
- patchright/driver/package/lib/server/fileUploadUtils.js +75 -0
- patchright/driver/package/lib/server/firefox/ffAccessibility.js +216 -0
- patchright/driver/package/lib/server/firefox/ffBrowser.js +460 -0
- patchright/driver/package/lib/server/firefox/ffConnection.js +168 -0
- patchright/driver/package/lib/server/firefox/ffExecutionContext.js +135 -0
- patchright/driver/package/lib/server/firefox/ffInput.js +150 -0
- patchright/driver/package/lib/server/firefox/ffNetworkManager.js +233 -0
- patchright/driver/package/lib/server/firefox/ffPage.js +559 -0
- patchright/driver/package/lib/server/firefox/firefox.js +99 -0
- patchright/driver/package/lib/server/formData.js +75 -0
- patchright/driver/package/lib/server/frameSelectors.js +171 -0
- patchright/driver/package/lib/server/frames.js +1808 -0
- patchright/driver/package/lib/server/har/harRecorder.js +139 -0
- patchright/driver/package/lib/server/har/harTracer.js +542 -0
- patchright/driver/package/lib/server/helper.js +103 -0
- patchright/driver/package/lib/server/index.js +114 -0
- patchright/driver/package/lib/server/input.js +310 -0
- patchright/driver/package/lib/server/instrumentation.js +70 -0
- patchright/driver/package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
- patchright/driver/package/lib/server/javascript.js +299 -0
- patchright/driver/package/lib/server/launchApp.js +91 -0
- patchright/driver/package/lib/server/macEditingCommands.js +139 -0
- patchright/driver/package/lib/server/network.js +617 -0
- patchright/driver/package/lib/server/page.js +819 -0
- patchright/driver/package/lib/server/pipeTransport.js +85 -0
- patchright/driver/package/lib/server/playwright.js +88 -0
- patchright/driver/package/lib/server/progress.js +102 -0
- patchright/driver/package/lib/server/protocolError.js +49 -0
- patchright/driver/package/lib/server/recorder/contextRecorder.js +299 -0
- patchright/driver/package/lib/server/recorder/recorderApp.js +196 -0
- patchright/driver/package/lib/server/recorder/recorderCollection.js +116 -0
- patchright/driver/package/lib/server/recorder/recorderFrontend.js +5 -0
- patchright/driver/package/lib/server/recorder/recorderInTraceViewer.js +144 -0
- patchright/driver/package/lib/server/recorder/recorderRunner.js +155 -0
- patchright/driver/package/lib/server/recorder/recorderUtils.js +112 -0
- patchright/driver/package/lib/server/recorder/throttledFile.js +46 -0
- patchright/driver/package/lib/server/recorder.js +327 -0
- patchright/driver/package/lib/server/registry/browserFetcher.js +168 -0
- patchright/driver/package/lib/server/registry/dependencies.js +322 -0
- patchright/driver/package/lib/server/registry/index.js +1005 -0
- patchright/driver/package/lib/server/registry/nativeDeps.js +490 -0
- patchright/driver/package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
- patchright/driver/package/lib/server/screenshotter.js +348 -0
- patchright/driver/package/lib/server/selectors.js +73 -0
- patchright/driver/package/lib/server/socksClientCertificatesInterceptor.js +340 -0
- patchright/driver/package/lib/server/socksInterceptor.js +100 -0
- patchright/driver/package/lib/server/trace/recorder/snapshotter.js +172 -0
- patchright/driver/package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
- patchright/driver/package/lib/server/trace/recorder/tracing.js +542 -0
- patchright/driver/package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
- patchright/driver/package/lib/server/trace/viewer/traceViewer.js +213 -0
- patchright/driver/package/lib/server/transport.js +191 -0
- patchright/driver/package/lib/server/types.js +24 -0
- patchright/driver/package/lib/server/usKeyboardLayout.js +555 -0
- patchright/driver/package/lib/server/webkit/webkit.js +87 -0
- patchright/driver/package/lib/server/webkit/wkAccessibility.js +194 -0
- patchright/driver/package/lib/server/webkit/wkBrowser.js +329 -0
- patchright/driver/package/lib/server/webkit/wkConnection.js +173 -0
- patchright/driver/package/lib/server/webkit/wkExecutionContext.js +143 -0
- patchright/driver/package/lib/server/webkit/wkInput.js +169 -0
- patchright/driver/package/lib/server/webkit/wkInterceptableRequest.js +162 -0
- patchright/driver/package/lib/server/webkit/wkPage.js +1219 -0
- patchright/driver/package/lib/server/webkit/wkProvisionalPage.js +94 -0
- patchright/driver/package/lib/server/webkit/wkWorkers.js +104 -0
- patchright/driver/package/lib/third_party/diff_match_patch.js +2222 -0
- patchright/driver/package/lib/third_party/pixelmatch.js +255 -0
- patchright/driver/package/lib/utils/ascii.js +31 -0
- patchright/driver/package/lib/utils/comparators.js +171 -0
- patchright/driver/package/lib/utils/crypto.js +174 -0
- patchright/driver/package/lib/utils/debug.js +46 -0
- patchright/driver/package/lib/utils/debugLogger.js +91 -0
- patchright/driver/package/lib/utils/env.js +49 -0
- patchright/driver/package/lib/utils/eventsHelper.js +38 -0
- patchright/driver/package/lib/utils/expectUtils.js +33 -0
- patchright/driver/package/lib/utils/fileUtils.js +205 -0
- patchright/driver/package/lib/utils/happy-eyeballs.js +194 -0
- patchright/driver/package/lib/utils/headers.js +52 -0
- patchright/driver/package/lib/utils/hostPlatform.js +133 -0
- patchright/driver/package/lib/utils/httpServer.js +237 -0
- patchright/driver/package/lib/utils/index.js +368 -0
- patchright/driver/package/lib/utils/isomorphic/cssParser.js +250 -0
- patchright/driver/package/lib/utils/isomorphic/cssTokenizer.js +979 -0
- patchright/driver/package/lib/utils/isomorphic/locatorGenerators.js +642 -0
- patchright/driver/package/lib/utils/isomorphic/locatorParser.js +179 -0
- patchright/driver/package/lib/utils/isomorphic/locatorUtils.js +62 -0
- patchright/driver/package/lib/utils/isomorphic/mimeType.js +29 -0
- patchright/driver/package/lib/utils/isomorphic/recorderUtils.js +195 -0
- patchright/driver/package/lib/utils/isomorphic/selectorParser.js +397 -0
- patchright/driver/package/lib/utils/isomorphic/stringUtils.js +139 -0
- patchright/driver/package/lib/utils/isomorphic/traceUtils.js +39 -0
- patchright/driver/package/lib/utils/isomorphic/urlMatch.js +120 -0
- patchright/driver/package/lib/utils/linuxUtils.js +78 -0
- patchright/driver/package/lib/utils/manualPromise.js +109 -0
- patchright/driver/package/lib/utils/multimap.js +75 -0
- patchright/driver/package/lib/utils/network.js +160 -0
- patchright/driver/package/lib/utils/processLauncher.js +248 -0
- patchright/driver/package/lib/utils/profiler.js +53 -0
- patchright/driver/package/lib/utils/rtti.js +44 -0
- patchright/driver/package/lib/utils/semaphore.js +51 -0
- patchright/driver/package/lib/utils/spawnAsync.js +45 -0
- patchright/driver/package/lib/utils/stackTrace.js +121 -0
- patchright/driver/package/lib/utils/task.js +58 -0
- patchright/driver/package/lib/utils/time.js +37 -0
- patchright/driver/package/lib/utils/timeoutRunner.js +66 -0
- patchright/driver/package/lib/utils/traceUtils.js +44 -0
- patchright/driver/package/lib/utils/userAgent.js +105 -0
- patchright/driver/package/lib/utils/wsServer.js +127 -0
- patchright/driver/package/lib/utils/zipFile.js +75 -0
- patchright/driver/package/lib/utils/zones.js +62 -0
- patchright/driver/package/lib/utilsBundle.js +82 -0
- patchright/driver/package/lib/utilsBundleImpl/index.js +53 -0
- patchright/driver/package/lib/utilsBundleImpl/xdg-open +1066 -0
- patchright/driver/package/lib/vite/htmlReport/index.html +66 -0
- patchright/driver/package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +24 -0
- patchright/driver/package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
- patchright/driver/package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
- patchright/driver/package/lib/vite/recorder/assets/index-BW-aOBcL.css +1 -0
- patchright/driver/package/lib/vite/recorder/assets/index-Bxxcmxlu.js +42 -0
- patchright/driver/package/lib/vite/recorder/index.html +29 -0
- patchright/driver/package/lib/vite/recorder/playwright-logo.svg +9 -0
- patchright/driver/package/lib/vite/traceViewer/assets/codeMirrorModule-CZTtn9l8.js +24 -0
- patchright/driver/package/lib/vite/traceViewer/assets/inspectorTab-DTusvprx.js +64 -0
- patchright/driver/package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
- patchright/driver/package/lib/vite/traceViewer/assets/workbench-DIEjrm3Z.js +9 -0
- patchright/driver/package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
- patchright/driver/package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
- patchright/driver/package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
- patchright/driver/package/lib/vite/traceViewer/embedded.Do_J5Hgs.js +2 -0
- patchright/driver/package/lib/vite/traceViewer/embedded.html +18 -0
- patchright/driver/package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
- patchright/driver/package/lib/vite/traceViewer/index.B21BXreT.js +2 -0
- patchright/driver/package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
- patchright/driver/package/lib/vite/traceViewer/index.html +29 -0
- patchright/driver/package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
- patchright/driver/package/lib/vite/traceViewer/playwright-logo.svg +9 -0
- patchright/driver/package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
- patchright/driver/package/lib/vite/traceViewer/recorder.Bfh_9UGt.js +2 -0
- patchright/driver/package/lib/vite/traceViewer/recorder.html +17 -0
- patchright/driver/package/lib/vite/traceViewer/snapshot.html +21 -0
- patchright/driver/package/lib/vite/traceViewer/sw.bundle.js +3 -0
- patchright/driver/package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
- patchright/driver/package/lib/vite/traceViewer/uiMode.DloKQa-h.js +5 -0
- patchright/driver/package/lib/vite/traceViewer/uiMode.html +20 -0
- patchright/driver/package/lib/vite/traceViewer/workbench.D3JVcA9K.css +1 -0
- patchright/driver/package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
- patchright/driver/package/lib/zipBundle.js +25 -0
- patchright/driver/package/lib/zipBundleImpl.js +5 -0
- patchright/driver/package/package.json +44 -0
- patchright/driver/package/protocol.yml +3720 -0
- patchright/driver/package/types/protocol.d.ts +21571 -0
- patchright/driver/package/types/structs.d.ts +45 -0
- patchright/driver/package/types/types.d.ts +22519 -0
- patchright/py.typed +0 -0
- patchright/sync_api/__init__.py +177 -0
- patchright/sync_api/_context_manager.py +74 -0
- patchright/sync_api/_generated.py +20155 -0
- patchright-1.48.0.dist-info/LICENSE +202 -0
- patchright-1.48.0.dist-info/METADATA +83 -0
- patchright-1.48.0.dist-info/RECORD +406 -0
- patchright-1.48.0.dist-info/WHEEL +5 -0
- patchright-1.48.0.dist-info/entry_points.txt +5 -0
- patchright-1.48.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1446 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import base64
|
|
3
|
+
import inspect
|
|
4
|
+
import re
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from types import SimpleNamespace
|
|
8
|
+
from typing import (
|
|
9
|
+
TYPE_CHECKING,
|
|
10
|
+
Any,
|
|
11
|
+
Callable,
|
|
12
|
+
Dict,
|
|
13
|
+
List,
|
|
14
|
+
Literal,
|
|
15
|
+
Optional,
|
|
16
|
+
Pattern,
|
|
17
|
+
Sequence,
|
|
18
|
+
Union,
|
|
19
|
+
cast,
|
|
20
|
+
)
|
|
21
|
+
from patchright._impl._accessibility import Accessibility
|
|
22
|
+
from patchright._impl._api_structures import (
|
|
23
|
+
AriaRole,
|
|
24
|
+
FilePayload,
|
|
25
|
+
FloatRect,
|
|
26
|
+
PdfMargins,
|
|
27
|
+
Position,
|
|
28
|
+
ViewportSize,
|
|
29
|
+
)
|
|
30
|
+
from patchright._impl._artifact import Artifact
|
|
31
|
+
from patchright._impl._clock import Clock
|
|
32
|
+
from patchright._impl._connection import (
|
|
33
|
+
ChannelOwner,
|
|
34
|
+
from_channel,
|
|
35
|
+
from_nullable_channel,
|
|
36
|
+
)
|
|
37
|
+
from patchright._impl._console_message import ConsoleMessage
|
|
38
|
+
from patchright._impl._download import Download
|
|
39
|
+
from patchright._impl._element_handle import ElementHandle
|
|
40
|
+
from patchright._impl._errors import Error, TargetClosedError, is_target_closed_error
|
|
41
|
+
from patchright._impl._event_context_manager import EventContextManagerImpl
|
|
42
|
+
from patchright._impl._file_chooser import FileChooser
|
|
43
|
+
from patchright._impl._frame import Frame
|
|
44
|
+
from patchright._impl._greenlets import LocatorHandlerGreenlet
|
|
45
|
+
from patchright._impl._har_router import HarRouter
|
|
46
|
+
from patchright._impl._helper import (
|
|
47
|
+
ColorScheme,
|
|
48
|
+
DocumentLoadState,
|
|
49
|
+
ForcedColors,
|
|
50
|
+
HarMode,
|
|
51
|
+
KeyboardModifier,
|
|
52
|
+
MouseButton,
|
|
53
|
+
ReducedMotion,
|
|
54
|
+
RouteFromHarNotFoundPolicy,
|
|
55
|
+
RouteHandler,
|
|
56
|
+
RouteHandlerCallback,
|
|
57
|
+
TimeoutSettings,
|
|
58
|
+
URLMatch,
|
|
59
|
+
URLMatcher,
|
|
60
|
+
URLMatchRequest,
|
|
61
|
+
URLMatchResponse,
|
|
62
|
+
WebSocketRouteHandlerCallback,
|
|
63
|
+
async_readfile,
|
|
64
|
+
async_writefile,
|
|
65
|
+
locals_to_params,
|
|
66
|
+
make_dirs_for_file,
|
|
67
|
+
serialize_error,
|
|
68
|
+
)
|
|
69
|
+
from patchright._impl._input import Keyboard, Mouse, Touchscreen
|
|
70
|
+
from patchright._impl._js_handle import (
|
|
71
|
+
JSHandle,
|
|
72
|
+
Serializable,
|
|
73
|
+
add_source_url_to_script,
|
|
74
|
+
parse_result,
|
|
75
|
+
serialize_argument,
|
|
76
|
+
)
|
|
77
|
+
from patchright._impl._network import (
|
|
78
|
+
Request,
|
|
79
|
+
Response,
|
|
80
|
+
Route,
|
|
81
|
+
WebSocketRoute,
|
|
82
|
+
WebSocketRouteHandler,
|
|
83
|
+
serialize_headers,
|
|
84
|
+
)
|
|
85
|
+
from patchright._impl._video import Video
|
|
86
|
+
from patchright._impl._waiter import Waiter
|
|
87
|
+
|
|
88
|
+
if TYPE_CHECKING:
|
|
89
|
+
from patchright._impl._browser_context import BrowserContext
|
|
90
|
+
from patchright._impl._fetch import APIRequestContext
|
|
91
|
+
from patchright._impl._locator import FrameLocator, Locator
|
|
92
|
+
from patchright._impl._network import WebSocket
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class LocatorHandler:
|
|
96
|
+
locator: "Locator"
|
|
97
|
+
handler: Union[Callable[["Locator"], Any], Callable[..., Any]]
|
|
98
|
+
times: Union[int, None]
|
|
99
|
+
|
|
100
|
+
def __init__(
|
|
101
|
+
self, locator: "Locator", handler: Callable[..., Any], times: Union[int, None]
|
|
102
|
+
) -> None:
|
|
103
|
+
self.locator = locator
|
|
104
|
+
self._handler = handler
|
|
105
|
+
self.times = times
|
|
106
|
+
|
|
107
|
+
def __call__(self) -> Any:
|
|
108
|
+
arg_count = len(inspect.signature(self._handler).parameters)
|
|
109
|
+
if arg_count == 0:
|
|
110
|
+
return self._handler()
|
|
111
|
+
return self._handler(self.locator)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class Page(ChannelOwner):
|
|
115
|
+
Events = SimpleNamespace(
|
|
116
|
+
Close="close",
|
|
117
|
+
Crash="crash",
|
|
118
|
+
Console="console",
|
|
119
|
+
Dialog="dialog",
|
|
120
|
+
Download="download",
|
|
121
|
+
FileChooser="filechooser",
|
|
122
|
+
DOMContentLoaded="domcontentloaded",
|
|
123
|
+
PageError="pageerror",
|
|
124
|
+
Request="request",
|
|
125
|
+
Response="response",
|
|
126
|
+
RequestFailed="requestfailed",
|
|
127
|
+
RequestFinished="requestfinished",
|
|
128
|
+
FrameAttached="frameattached",
|
|
129
|
+
FrameDetached="framedetached",
|
|
130
|
+
FrameNavigated="framenavigated",
|
|
131
|
+
Load="load",
|
|
132
|
+
Popup="popup",
|
|
133
|
+
WebSocket="websocket",
|
|
134
|
+
Worker="worker",
|
|
135
|
+
)
|
|
136
|
+
accessibility: Accessibility
|
|
137
|
+
keyboard: Keyboard
|
|
138
|
+
mouse: Mouse
|
|
139
|
+
touchscreen: Touchscreen
|
|
140
|
+
|
|
141
|
+
def __init__(
|
|
142
|
+
self, parent: ChannelOwner, type: str, guid: str, initializer: Dict
|
|
143
|
+
) -> None:
|
|
144
|
+
super().__init__(parent, type, guid, initializer)
|
|
145
|
+
self._browser_context = cast("BrowserContext", parent)
|
|
146
|
+
self.accessibility = Accessibility(self._channel)
|
|
147
|
+
self.keyboard = Keyboard(self._channel)
|
|
148
|
+
self.mouse = Mouse(self._channel)
|
|
149
|
+
self.touchscreen = Touchscreen(self._channel)
|
|
150
|
+
self._main_frame: Frame = from_channel(initializer["mainFrame"])
|
|
151
|
+
self._main_frame._page = self
|
|
152
|
+
self._frames = [self._main_frame]
|
|
153
|
+
self._viewport_size: Optional[ViewportSize] = initializer.get("viewportSize")
|
|
154
|
+
self._is_closed = False
|
|
155
|
+
self._workers: List["Worker"] = []
|
|
156
|
+
self._bindings: Dict[str, Any] = {}
|
|
157
|
+
self._routes: List[RouteHandler] = []
|
|
158
|
+
self._web_socket_routes: List[WebSocketRouteHandler] = []
|
|
159
|
+
self._owned_context: Optional["BrowserContext"] = None
|
|
160
|
+
self._timeout_settings: TimeoutSettings = TimeoutSettings(
|
|
161
|
+
self._browser_context._timeout_settings
|
|
162
|
+
)
|
|
163
|
+
self._video: Optional[Video] = None
|
|
164
|
+
self._opener = cast("Page", from_nullable_channel(initializer.get("opener")))
|
|
165
|
+
self._close_reason: Optional[str] = None
|
|
166
|
+
self._close_was_called = False
|
|
167
|
+
self._har_routers: List[HarRouter] = []
|
|
168
|
+
self._locator_handlers: Dict[str, LocatorHandler] = {}
|
|
169
|
+
self._channel.on(
|
|
170
|
+
"bindingCall",
|
|
171
|
+
lambda params: self._on_binding(from_channel(params["binding"])),
|
|
172
|
+
)
|
|
173
|
+
self._channel.on("close", lambda _: self._on_close())
|
|
174
|
+
self._channel.on("crash", lambda _: self._on_crash())
|
|
175
|
+
self._channel.on("download", lambda params: self._on_download(params))
|
|
176
|
+
self._channel.on(
|
|
177
|
+
"fileChooser",
|
|
178
|
+
lambda params: self.emit(
|
|
179
|
+
Page.Events.FileChooser,
|
|
180
|
+
FileChooser(
|
|
181
|
+
self, from_channel(params["element"]), params["isMultiple"]
|
|
182
|
+
),
|
|
183
|
+
),
|
|
184
|
+
)
|
|
185
|
+
self._channel.on(
|
|
186
|
+
"frameAttached",
|
|
187
|
+
lambda params: self._on_frame_attached(from_channel(params["frame"])),
|
|
188
|
+
)
|
|
189
|
+
self._channel.on(
|
|
190
|
+
"frameDetached",
|
|
191
|
+
lambda params: self._on_frame_detached(from_channel(params["frame"])),
|
|
192
|
+
)
|
|
193
|
+
self._channel.on(
|
|
194
|
+
"locatorHandlerTriggered",
|
|
195
|
+
lambda params: self._loop.create_task(
|
|
196
|
+
self._on_locator_handler_triggered(params["uid"])
|
|
197
|
+
),
|
|
198
|
+
)
|
|
199
|
+
self._channel.on(
|
|
200
|
+
"route",
|
|
201
|
+
lambda params: self._loop.create_task(
|
|
202
|
+
self._on_route(from_channel(params["route"]))
|
|
203
|
+
),
|
|
204
|
+
)
|
|
205
|
+
self._channel.on(
|
|
206
|
+
"webSocketRoute",
|
|
207
|
+
lambda params: self._loop.create_task(
|
|
208
|
+
self._on_web_socket_route(from_channel(params["webSocketRoute"]))
|
|
209
|
+
),
|
|
210
|
+
)
|
|
211
|
+
self._channel.on("video", lambda params: self._on_video(params))
|
|
212
|
+
self._channel.on(
|
|
213
|
+
"webSocket",
|
|
214
|
+
lambda params: self.emit(
|
|
215
|
+
Page.Events.WebSocket, from_channel(params["webSocket"])
|
|
216
|
+
),
|
|
217
|
+
)
|
|
218
|
+
self._channel.on(
|
|
219
|
+
"worker", lambda params: self._on_worker(from_channel(params["worker"]))
|
|
220
|
+
)
|
|
221
|
+
self._closed_or_crashed_future: asyncio.Future = asyncio.Future()
|
|
222
|
+
self.on(
|
|
223
|
+
Page.Events.Close,
|
|
224
|
+
lambda _: (
|
|
225
|
+
self._closed_or_crashed_future.set_result(
|
|
226
|
+
self._close_error_with_reason()
|
|
227
|
+
)
|
|
228
|
+
if not self._closed_or_crashed_future.done()
|
|
229
|
+
else None
|
|
230
|
+
),
|
|
231
|
+
)
|
|
232
|
+
self.on(
|
|
233
|
+
Page.Events.Crash,
|
|
234
|
+
lambda _: (
|
|
235
|
+
self._closed_or_crashed_future.set_result(TargetClosedError())
|
|
236
|
+
if not self._closed_or_crashed_future.done()
|
|
237
|
+
else None
|
|
238
|
+
),
|
|
239
|
+
)
|
|
240
|
+
self._set_event_to_subscription_mapping(
|
|
241
|
+
{
|
|
242
|
+
Page.Events.Console: "console",
|
|
243
|
+
Page.Events.Dialog: "dialog",
|
|
244
|
+
Page.Events.Request: "request",
|
|
245
|
+
Page.Events.Response: "response",
|
|
246
|
+
Page.Events.RequestFinished: "requestFinished",
|
|
247
|
+
Page.Events.RequestFailed: "requestFailed",
|
|
248
|
+
Page.Events.FileChooser: "fileChooser",
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
def __repr__(self) -> str:
|
|
253
|
+
return f"<Page url={self.url!r}>"
|
|
254
|
+
|
|
255
|
+
def _on_frame_attached(self, frame: Frame) -> None:
|
|
256
|
+
frame._page = self
|
|
257
|
+
self._frames.append(frame)
|
|
258
|
+
self.emit(Page.Events.FrameAttached, frame)
|
|
259
|
+
|
|
260
|
+
def _on_frame_detached(self, frame: Frame) -> None:
|
|
261
|
+
self._frames.remove(frame)
|
|
262
|
+
frame._detached = True
|
|
263
|
+
self.emit(Page.Events.FrameDetached, frame)
|
|
264
|
+
|
|
265
|
+
async def _on_route(self, route: Route) -> None:
|
|
266
|
+
route._context = self.context
|
|
267
|
+
route_handlers = self._routes.copy()
|
|
268
|
+
for route_handler in route_handlers:
|
|
269
|
+
if self._close_was_called or self.context._close_was_called:
|
|
270
|
+
return
|
|
271
|
+
if not route_handler.matches(route.request.url):
|
|
272
|
+
continue
|
|
273
|
+
if route_handler not in self._routes:
|
|
274
|
+
continue
|
|
275
|
+
if route_handler.will_expire:
|
|
276
|
+
self._routes.remove(route_handler)
|
|
277
|
+
try:
|
|
278
|
+
handled = await route_handler.handle(route)
|
|
279
|
+
finally:
|
|
280
|
+
if len(self._routes) == 0:
|
|
281
|
+
|
|
282
|
+
async def _update_interceptor_patterns_ignore_exceptions() -> None:
|
|
283
|
+
try:
|
|
284
|
+
await self._update_interception_patterns()
|
|
285
|
+
except Error:
|
|
286
|
+
pass
|
|
287
|
+
|
|
288
|
+
asyncio.create_task(
|
|
289
|
+
self._connection.wrap_api_call(
|
|
290
|
+
_update_interceptor_patterns_ignore_exceptions, True
|
|
291
|
+
)
|
|
292
|
+
)
|
|
293
|
+
if handled:
|
|
294
|
+
return
|
|
295
|
+
await self._browser_context._on_route(route)
|
|
296
|
+
|
|
297
|
+
async def _on_web_socket_route(self, web_socket_route: WebSocketRoute) -> None:
|
|
298
|
+
route_handler = next(
|
|
299
|
+
(
|
|
300
|
+
route_handler
|
|
301
|
+
for route_handler in self._web_socket_routes
|
|
302
|
+
if route_handler.matches(web_socket_route.url)
|
|
303
|
+
),
|
|
304
|
+
None,
|
|
305
|
+
)
|
|
306
|
+
if route_handler:
|
|
307
|
+
await route_handler.handle(web_socket_route)
|
|
308
|
+
else:
|
|
309
|
+
await self._browser_context._on_web_socket_route(web_socket_route)
|
|
310
|
+
|
|
311
|
+
def _on_binding(self, binding_call: "BindingCall") -> None:
|
|
312
|
+
func = self._bindings.get(binding_call._initializer["name"])
|
|
313
|
+
if func:
|
|
314
|
+
asyncio.create_task(binding_call.call(func))
|
|
315
|
+
self._browser_context._on_binding(binding_call)
|
|
316
|
+
|
|
317
|
+
def _on_worker(self, worker: "Worker") -> None:
|
|
318
|
+
self._workers.append(worker)
|
|
319
|
+
worker._page = self
|
|
320
|
+
self.emit(Page.Events.Worker, worker)
|
|
321
|
+
|
|
322
|
+
def _on_close(self) -> None:
|
|
323
|
+
self._is_closed = True
|
|
324
|
+
if self in self._browser_context._pages:
|
|
325
|
+
self._browser_context._pages.remove(self)
|
|
326
|
+
if self in self._browser_context._background_pages:
|
|
327
|
+
self._browser_context._background_pages.remove(self)
|
|
328
|
+
self._dispose_har_routers()
|
|
329
|
+
self.emit(Page.Events.Close, self)
|
|
330
|
+
|
|
331
|
+
def _on_crash(self) -> None:
|
|
332
|
+
self.emit(Page.Events.Crash, self)
|
|
333
|
+
|
|
334
|
+
def _on_download(self, params: Any) -> None:
|
|
335
|
+
url = params["url"]
|
|
336
|
+
suggested_filename = params["suggestedFilename"]
|
|
337
|
+
artifact = cast(Artifact, from_channel(params["artifact"]))
|
|
338
|
+
self.emit(
|
|
339
|
+
Page.Events.Download, Download(self, url, suggested_filename, artifact)
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
def _on_video(self, params: Any) -> None:
|
|
343
|
+
artifact = from_channel(params["artifact"])
|
|
344
|
+
self._force_video()._artifact_ready(artifact)
|
|
345
|
+
|
|
346
|
+
@property
|
|
347
|
+
def context(self) -> "BrowserContext":
|
|
348
|
+
return self._browser_context
|
|
349
|
+
|
|
350
|
+
@property
|
|
351
|
+
def clock(self) -> Clock:
|
|
352
|
+
return self._browser_context.clock
|
|
353
|
+
|
|
354
|
+
async def opener(self) -> Optional["Page"]:
|
|
355
|
+
if self._opener and self._opener.is_closed():
|
|
356
|
+
return None
|
|
357
|
+
return self._opener
|
|
358
|
+
|
|
359
|
+
@property
|
|
360
|
+
def main_frame(self) -> Frame:
|
|
361
|
+
return self._main_frame
|
|
362
|
+
|
|
363
|
+
def frame(self, name: str = None, url: URLMatch = None) -> Optional[Frame]:
|
|
364
|
+
matcher = (
|
|
365
|
+
URLMatcher(self._browser_context._options.get("baseURL"), url)
|
|
366
|
+
if url
|
|
367
|
+
else None
|
|
368
|
+
)
|
|
369
|
+
for frame in self._frames:
|
|
370
|
+
if name and frame.name == name:
|
|
371
|
+
return frame
|
|
372
|
+
if url and matcher and matcher.matches(frame.url):
|
|
373
|
+
return frame
|
|
374
|
+
return None
|
|
375
|
+
|
|
376
|
+
@property
|
|
377
|
+
def frames(self) -> List[Frame]:
|
|
378
|
+
return self._frames.copy()
|
|
379
|
+
|
|
380
|
+
def set_default_navigation_timeout(self, timeout: float) -> None:
|
|
381
|
+
self._timeout_settings.set_default_navigation_timeout(timeout)
|
|
382
|
+
self._channel.send_no_reply(
|
|
383
|
+
"setDefaultNavigationTimeoutNoReply", dict(timeout=timeout)
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
def set_default_timeout(self, timeout: float) -> None:
|
|
387
|
+
self._timeout_settings.set_default_timeout(timeout)
|
|
388
|
+
self._channel.send_no_reply("setDefaultTimeoutNoReply", dict(timeout=timeout))
|
|
389
|
+
|
|
390
|
+
async def query_selector(
|
|
391
|
+
self, selector: str, strict: bool = None
|
|
392
|
+
) -> Optional[ElementHandle]:
|
|
393
|
+
return await self._main_frame.query_selector(selector, strict)
|
|
394
|
+
|
|
395
|
+
async def query_selector_all(self, selector: str) -> List[ElementHandle]:
|
|
396
|
+
return await self._main_frame.query_selector_all(selector)
|
|
397
|
+
|
|
398
|
+
async def wait_for_selector(
|
|
399
|
+
self,
|
|
400
|
+
selector: str,
|
|
401
|
+
timeout: float = None,
|
|
402
|
+
state: Literal["attached", "detached", "hidden", "visible"] = None,
|
|
403
|
+
strict: bool = None,
|
|
404
|
+
) -> Optional[ElementHandle]:
|
|
405
|
+
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
|
406
|
+
|
|
407
|
+
async def is_checked(
|
|
408
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
409
|
+
) -> bool:
|
|
410
|
+
return await self._main_frame.is_checked(**locals_to_params(locals()))
|
|
411
|
+
|
|
412
|
+
async def is_disabled(
|
|
413
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
414
|
+
) -> bool:
|
|
415
|
+
return await self._main_frame.is_disabled(**locals_to_params(locals()))
|
|
416
|
+
|
|
417
|
+
async def is_editable(
|
|
418
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
419
|
+
) -> bool:
|
|
420
|
+
return await self._main_frame.is_editable(**locals_to_params(locals()))
|
|
421
|
+
|
|
422
|
+
async def is_enabled(
|
|
423
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
424
|
+
) -> bool:
|
|
425
|
+
return await self._main_frame.is_enabled(**locals_to_params(locals()))
|
|
426
|
+
|
|
427
|
+
async def is_hidden(
|
|
428
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
429
|
+
) -> bool:
|
|
430
|
+
return await self._main_frame.is_hidden(**locals_to_params(locals()))
|
|
431
|
+
|
|
432
|
+
async def is_visible(
|
|
433
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
434
|
+
) -> bool:
|
|
435
|
+
return await self._main_frame.is_visible(**locals_to_params(locals()))
|
|
436
|
+
|
|
437
|
+
async def dispatch_event(
|
|
438
|
+
self,
|
|
439
|
+
selector: str,
|
|
440
|
+
type: str,
|
|
441
|
+
eventInit: Dict = None,
|
|
442
|
+
timeout: float = None,
|
|
443
|
+
strict: bool = None,
|
|
444
|
+
) -> None:
|
|
445
|
+
return await self._main_frame.dispatch_event(**locals_to_params(locals()))
|
|
446
|
+
|
|
447
|
+
async def evaluate(self, expression: str, arg: Serializable = None) -> Any:
|
|
448
|
+
return await self._main_frame.evaluate(expression, arg)
|
|
449
|
+
|
|
450
|
+
async def evaluate_handle(
|
|
451
|
+
self, expression: str, arg: Serializable = None
|
|
452
|
+
) -> JSHandle:
|
|
453
|
+
return await self._main_frame.evaluate_handle(expression, arg)
|
|
454
|
+
|
|
455
|
+
async def eval_on_selector(
|
|
456
|
+
self,
|
|
457
|
+
selector: str,
|
|
458
|
+
expression: str,
|
|
459
|
+
arg: Serializable = None,
|
|
460
|
+
strict: bool = None,
|
|
461
|
+
) -> Any:
|
|
462
|
+
return await self._main_frame.eval_on_selector(
|
|
463
|
+
selector, expression, arg, strict
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
async def eval_on_selector_all(
|
|
467
|
+
self, selector: str, expression: str, arg: Serializable = None
|
|
468
|
+
) -> Any:
|
|
469
|
+
return await self._main_frame.eval_on_selector_all(selector, expression, arg)
|
|
470
|
+
|
|
471
|
+
async def add_script_tag(
|
|
472
|
+
self,
|
|
473
|
+
url: str = None,
|
|
474
|
+
path: Union[str, Path] = None,
|
|
475
|
+
content: str = None,
|
|
476
|
+
type: str = None,
|
|
477
|
+
) -> ElementHandle:
|
|
478
|
+
return await self._main_frame.add_script_tag(**locals_to_params(locals()))
|
|
479
|
+
|
|
480
|
+
async def add_style_tag(
|
|
481
|
+
self, url: str = None, path: Union[str, Path] = None, content: str = None
|
|
482
|
+
) -> ElementHandle:
|
|
483
|
+
return await self._main_frame.add_style_tag(**locals_to_params(locals()))
|
|
484
|
+
|
|
485
|
+
async def expose_function(self, name: str, callback: Callable) -> None:
|
|
486
|
+
await self.expose_binding(name, lambda source, *args: callback(*args))
|
|
487
|
+
|
|
488
|
+
async def expose_binding(
|
|
489
|
+
self, name: str, callback: Callable, handle: bool = None
|
|
490
|
+
) -> None:
|
|
491
|
+
await self.install_inject_route()
|
|
492
|
+
if name in self._bindings:
|
|
493
|
+
raise Error(f'Function "{name}" has been already registered')
|
|
494
|
+
if name in self._browser_context._bindings:
|
|
495
|
+
raise Error(
|
|
496
|
+
f'Function "{name}" has been already registered in the browser context'
|
|
497
|
+
)
|
|
498
|
+
self._bindings[name] = callback
|
|
499
|
+
await self._channel.send(
|
|
500
|
+
"exposeBinding", dict(name=name, needsHandle=handle or False)
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
async def set_extra_http_headers(self, headers: Dict[str, str]) -> None:
|
|
504
|
+
await self._channel.send(
|
|
505
|
+
"setExtraHTTPHeaders", dict(headers=serialize_headers(headers))
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
@property
|
|
509
|
+
def url(self) -> str:
|
|
510
|
+
return self._main_frame.url
|
|
511
|
+
|
|
512
|
+
async def content(self) -> str:
|
|
513
|
+
return await self._main_frame.content()
|
|
514
|
+
|
|
515
|
+
async def set_content(
|
|
516
|
+
self, html: str, timeout: float = None, waitUntil: DocumentLoadState = None
|
|
517
|
+
) -> None:
|
|
518
|
+
return await self._main_frame.set_content(**locals_to_params(locals()))
|
|
519
|
+
|
|
520
|
+
async def goto(
|
|
521
|
+
self,
|
|
522
|
+
url: str,
|
|
523
|
+
timeout: float = None,
|
|
524
|
+
waitUntil: DocumentLoadState = None,
|
|
525
|
+
referer: str = None,
|
|
526
|
+
) -> Optional[Response]:
|
|
527
|
+
return await self._main_frame.goto(**locals_to_params(locals()))
|
|
528
|
+
|
|
529
|
+
async def reload(
|
|
530
|
+
self, timeout: float = None, waitUntil: DocumentLoadState = None
|
|
531
|
+
) -> Optional[Response]:
|
|
532
|
+
return from_nullable_channel(
|
|
533
|
+
await self._channel.send("reload", locals_to_params(locals()))
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
async def wait_for_load_state(
|
|
537
|
+
self,
|
|
538
|
+
state: Literal["domcontentloaded", "load", "networkidle"] = None,
|
|
539
|
+
timeout: float = None,
|
|
540
|
+
) -> None:
|
|
541
|
+
return await self._main_frame.wait_for_load_state(**locals_to_params(locals()))
|
|
542
|
+
|
|
543
|
+
async def wait_for_url(
|
|
544
|
+
self, url: URLMatch, waitUntil: DocumentLoadState = None, timeout: float = None
|
|
545
|
+
) -> None:
|
|
546
|
+
return await self._main_frame.wait_for_url(**locals_to_params(locals()))
|
|
547
|
+
|
|
548
|
+
async def wait_for_event(
|
|
549
|
+
self, event: str, predicate: Callable = None, timeout: float = None
|
|
550
|
+
) -> Any:
|
|
551
|
+
async with self.expect_event(event, predicate, timeout) as event_info:
|
|
552
|
+
pass
|
|
553
|
+
return await event_info
|
|
554
|
+
|
|
555
|
+
async def go_back(
|
|
556
|
+
self, timeout: float = None, waitUntil: DocumentLoadState = None
|
|
557
|
+
) -> Optional[Response]:
|
|
558
|
+
return from_nullable_channel(
|
|
559
|
+
await self._channel.send("goBack", locals_to_params(locals()))
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
async def go_forward(
|
|
563
|
+
self, timeout: float = None, waitUntil: DocumentLoadState = None
|
|
564
|
+
) -> Optional[Response]:
|
|
565
|
+
return from_nullable_channel(
|
|
566
|
+
await self._channel.send("goForward", locals_to_params(locals()))
|
|
567
|
+
)
|
|
568
|
+
|
|
569
|
+
async def request_gc(self) -> None:
|
|
570
|
+
await self._channel.send("requestGC")
|
|
571
|
+
|
|
572
|
+
async def emulate_media(
|
|
573
|
+
self,
|
|
574
|
+
media: Literal["null", "print", "screen"] = None,
|
|
575
|
+
colorScheme: ColorScheme = None,
|
|
576
|
+
reducedMotion: ReducedMotion = None,
|
|
577
|
+
forcedColors: ForcedColors = None,
|
|
578
|
+
) -> None:
|
|
579
|
+
params = locals_to_params(locals())
|
|
580
|
+
if "media" in params:
|
|
581
|
+
params["media"] = "no-override" if params["media"] == "null" else media
|
|
582
|
+
if "colorScheme" in params:
|
|
583
|
+
params["colorScheme"] = (
|
|
584
|
+
"no-override" if params["colorScheme"] == "null" else colorScheme
|
|
585
|
+
)
|
|
586
|
+
if "reducedMotion" in params:
|
|
587
|
+
params["reducedMotion"] = (
|
|
588
|
+
"no-override" if params["reducedMotion"] == "null" else reducedMotion
|
|
589
|
+
)
|
|
590
|
+
if "forcedColors" in params:
|
|
591
|
+
params["forcedColors"] = (
|
|
592
|
+
"no-override" if params["forcedColors"] == "null" else forcedColors
|
|
593
|
+
)
|
|
594
|
+
await self._channel.send("emulateMedia", params)
|
|
595
|
+
|
|
596
|
+
async def set_viewport_size(self, viewportSize: ViewportSize) -> None:
|
|
597
|
+
self._viewport_size = viewportSize
|
|
598
|
+
await self._channel.send("setViewportSize", locals_to_params(locals()))
|
|
599
|
+
|
|
600
|
+
@property
|
|
601
|
+
def viewport_size(self) -> Optional[ViewportSize]:
|
|
602
|
+
return self._viewport_size
|
|
603
|
+
|
|
604
|
+
async def bring_to_front(self) -> None:
|
|
605
|
+
await self._channel.send("bringToFront")
|
|
606
|
+
|
|
607
|
+
async def add_init_script(
|
|
608
|
+
self, script: str = None, path: Union[str, Path] = None
|
|
609
|
+
) -> None:
|
|
610
|
+
await self.install_inject_route()
|
|
611
|
+
if path:
|
|
612
|
+
script = add_source_url_to_script(
|
|
613
|
+
(await async_readfile(path)).decode(), path
|
|
614
|
+
)
|
|
615
|
+
if not isinstance(script, str):
|
|
616
|
+
raise Error("Either path or script parameter must be specified")
|
|
617
|
+
await self._channel.send("addInitScript", dict(source=script))
|
|
618
|
+
|
|
619
|
+
async def route(
|
|
620
|
+
self, url: URLMatch, handler: RouteHandlerCallback, times: int = None
|
|
621
|
+
) -> None:
|
|
622
|
+
self._routes.insert(
|
|
623
|
+
0,
|
|
624
|
+
RouteHandler(
|
|
625
|
+
URLMatcher(self._browser_context._options.get("baseURL"), url),
|
|
626
|
+
handler,
|
|
627
|
+
True if self._dispatcher_fiber else False,
|
|
628
|
+
times,
|
|
629
|
+
),
|
|
630
|
+
)
|
|
631
|
+
await self._update_interception_patterns()
|
|
632
|
+
|
|
633
|
+
async def unroute(
|
|
634
|
+
self, url: URLMatch, handler: Optional[RouteHandlerCallback] = None
|
|
635
|
+
) -> None:
|
|
636
|
+
removed = []
|
|
637
|
+
remaining = []
|
|
638
|
+
for route in self._routes:
|
|
639
|
+
if route.matcher.match != url or (handler and route.handler != handler):
|
|
640
|
+
remaining.append(route)
|
|
641
|
+
else:
|
|
642
|
+
removed.append(route)
|
|
643
|
+
await self._unroute_internal(removed, remaining, "default")
|
|
644
|
+
|
|
645
|
+
async def _unroute_internal(
|
|
646
|
+
self,
|
|
647
|
+
removed: List[RouteHandler],
|
|
648
|
+
remaining: List[RouteHandler],
|
|
649
|
+
behavior: Literal["default", "ignoreErrors", "wait"] = None,
|
|
650
|
+
) -> None:
|
|
651
|
+
self._routes = remaining
|
|
652
|
+
await self._update_interception_patterns()
|
|
653
|
+
if behavior is None or behavior == "default":
|
|
654
|
+
return
|
|
655
|
+
await asyncio.gather(*map(lambda route: route.stop(behavior), removed))
|
|
656
|
+
|
|
657
|
+
async def route_web_socket(
|
|
658
|
+
self, url: URLMatch, handler: WebSocketRouteHandlerCallback
|
|
659
|
+
) -> None:
|
|
660
|
+
self._web_socket_routes.insert(
|
|
661
|
+
0,
|
|
662
|
+
WebSocketRouteHandler(
|
|
663
|
+
URLMatcher(self._browser_context._options.get("baseURL"), url), handler
|
|
664
|
+
),
|
|
665
|
+
)
|
|
666
|
+
await self._update_web_socket_interception_patterns()
|
|
667
|
+
|
|
668
|
+
def _dispose_har_routers(self) -> None:
|
|
669
|
+
for router in self._har_routers:
|
|
670
|
+
router.dispose()
|
|
671
|
+
self._har_routers = []
|
|
672
|
+
|
|
673
|
+
async def unroute_all(
|
|
674
|
+
self, behavior: Literal["default", "ignoreErrors", "wait"] = None
|
|
675
|
+
) -> None:
|
|
676
|
+
await self._unroute_internal(self._routes, [], behavior)
|
|
677
|
+
self._dispose_har_routers()
|
|
678
|
+
|
|
679
|
+
async def route_from_har(
|
|
680
|
+
self,
|
|
681
|
+
har: Union[Path, str],
|
|
682
|
+
url: Union[Pattern[str], str] = None,
|
|
683
|
+
notFound: RouteFromHarNotFoundPolicy = None,
|
|
684
|
+
update: bool = None,
|
|
685
|
+
updateContent: Literal["attach", "embed"] = None,
|
|
686
|
+
updateMode: HarMode = None,
|
|
687
|
+
) -> None:
|
|
688
|
+
if update:
|
|
689
|
+
await self._browser_context._record_into_har(
|
|
690
|
+
har=har,
|
|
691
|
+
page=self,
|
|
692
|
+
url=url,
|
|
693
|
+
update_content=updateContent,
|
|
694
|
+
update_mode=updateMode,
|
|
695
|
+
)
|
|
696
|
+
return
|
|
697
|
+
router = await HarRouter.create(
|
|
698
|
+
local_utils=self._connection.local_utils,
|
|
699
|
+
file=str(har),
|
|
700
|
+
not_found_action=notFound or "abort",
|
|
701
|
+
url_matcher=url,
|
|
702
|
+
)
|
|
703
|
+
self._har_routers.append(router)
|
|
704
|
+
await router.add_page_route(self)
|
|
705
|
+
|
|
706
|
+
async def _update_interception_patterns(self) -> None:
|
|
707
|
+
patterns = RouteHandler.prepare_interception_patterns(self._routes)
|
|
708
|
+
await self._channel.send(
|
|
709
|
+
"setNetworkInterceptionPatterns", {"patterns": patterns}
|
|
710
|
+
)
|
|
711
|
+
|
|
712
|
+
async def _update_web_socket_interception_patterns(self) -> None:
|
|
713
|
+
patterns = WebSocketRouteHandler.prepare_interception_patterns(
|
|
714
|
+
self._web_socket_routes
|
|
715
|
+
)
|
|
716
|
+
await self._channel.send(
|
|
717
|
+
"setWebSocketInterceptionPatterns", {"patterns": patterns}
|
|
718
|
+
)
|
|
719
|
+
|
|
720
|
+
async def screenshot(
|
|
721
|
+
self,
|
|
722
|
+
timeout: float = None,
|
|
723
|
+
type: Literal["jpeg", "png"] = None,
|
|
724
|
+
path: Union[str, Path] = None,
|
|
725
|
+
quality: int = None,
|
|
726
|
+
omitBackground: bool = None,
|
|
727
|
+
fullPage: bool = None,
|
|
728
|
+
clip: FloatRect = None,
|
|
729
|
+
animations: Literal["allow", "disabled"] = None,
|
|
730
|
+
caret: Literal["hide", "initial"] = None,
|
|
731
|
+
scale: Literal["css", "device"] = None,
|
|
732
|
+
mask: Sequence["Locator"] = None,
|
|
733
|
+
maskColor: str = None,
|
|
734
|
+
style: str = None,
|
|
735
|
+
) -> bytes:
|
|
736
|
+
params = locals_to_params(locals())
|
|
737
|
+
if "path" in params:
|
|
738
|
+
del params["path"]
|
|
739
|
+
if "mask" in params:
|
|
740
|
+
params["mask"] = list(
|
|
741
|
+
map(
|
|
742
|
+
lambda locator: {
|
|
743
|
+
"frame": locator._frame._channel,
|
|
744
|
+
"selector": locator._selector,
|
|
745
|
+
},
|
|
746
|
+
params["mask"],
|
|
747
|
+
)
|
|
748
|
+
)
|
|
749
|
+
encoded_binary = await self._channel.send("screenshot", params)
|
|
750
|
+
decoded_binary = base64.b64decode(encoded_binary)
|
|
751
|
+
if path:
|
|
752
|
+
make_dirs_for_file(path)
|
|
753
|
+
await async_writefile(path, decoded_binary)
|
|
754
|
+
return decoded_binary
|
|
755
|
+
|
|
756
|
+
async def title(self) -> str:
|
|
757
|
+
return await self._main_frame.title()
|
|
758
|
+
|
|
759
|
+
async def close(self, runBeforeUnload: bool = None, reason: str = None) -> None:
|
|
760
|
+
self._close_reason = reason
|
|
761
|
+
self._close_was_called = True
|
|
762
|
+
try:
|
|
763
|
+
await self._channel.send("close", locals_to_params(locals()))
|
|
764
|
+
if self._owned_context:
|
|
765
|
+
await self._owned_context.close()
|
|
766
|
+
except Exception as e:
|
|
767
|
+
if not is_target_closed_error(e) and (not runBeforeUnload):
|
|
768
|
+
raise e
|
|
769
|
+
|
|
770
|
+
def is_closed(self) -> bool:
|
|
771
|
+
return self._is_closed
|
|
772
|
+
|
|
773
|
+
async def click(
|
|
774
|
+
self,
|
|
775
|
+
selector: str,
|
|
776
|
+
modifiers: Sequence[KeyboardModifier] = None,
|
|
777
|
+
position: Position = None,
|
|
778
|
+
delay: float = None,
|
|
779
|
+
button: MouseButton = None,
|
|
780
|
+
clickCount: int = None,
|
|
781
|
+
timeout: float = None,
|
|
782
|
+
force: bool = None,
|
|
783
|
+
noWaitAfter: bool = None,
|
|
784
|
+
trial: bool = None,
|
|
785
|
+
strict: bool = None,
|
|
786
|
+
) -> None:
|
|
787
|
+
return await self._main_frame.click(**locals_to_params(locals()))
|
|
788
|
+
|
|
789
|
+
async def dblclick(
|
|
790
|
+
self,
|
|
791
|
+
selector: str,
|
|
792
|
+
modifiers: Sequence[KeyboardModifier] = None,
|
|
793
|
+
position: Position = None,
|
|
794
|
+
delay: float = None,
|
|
795
|
+
button: MouseButton = None,
|
|
796
|
+
timeout: float = None,
|
|
797
|
+
force: bool = None,
|
|
798
|
+
noWaitAfter: bool = None,
|
|
799
|
+
strict: bool = None,
|
|
800
|
+
trial: bool = None,
|
|
801
|
+
) -> None:
|
|
802
|
+
return await self._main_frame.dblclick(**locals_to_params(locals()))
|
|
803
|
+
|
|
804
|
+
async def tap(
|
|
805
|
+
self,
|
|
806
|
+
selector: str,
|
|
807
|
+
modifiers: Sequence[KeyboardModifier] = None,
|
|
808
|
+
position: Position = None,
|
|
809
|
+
timeout: float = None,
|
|
810
|
+
force: bool = None,
|
|
811
|
+
noWaitAfter: bool = None,
|
|
812
|
+
strict: bool = None,
|
|
813
|
+
trial: bool = None,
|
|
814
|
+
) -> None:
|
|
815
|
+
return await self._main_frame.tap(**locals_to_params(locals()))
|
|
816
|
+
|
|
817
|
+
async def fill(
|
|
818
|
+
self,
|
|
819
|
+
selector: str,
|
|
820
|
+
value: str,
|
|
821
|
+
timeout: float = None,
|
|
822
|
+
noWaitAfter: bool = None,
|
|
823
|
+
strict: bool = None,
|
|
824
|
+
force: bool = None,
|
|
825
|
+
) -> None:
|
|
826
|
+
return await self._main_frame.fill(**locals_to_params(locals()))
|
|
827
|
+
|
|
828
|
+
def locator(
|
|
829
|
+
self,
|
|
830
|
+
selector: str,
|
|
831
|
+
hasText: Union[str, Pattern[str]] = None,
|
|
832
|
+
hasNotText: Union[str, Pattern[str]] = None,
|
|
833
|
+
has: "Locator" = None,
|
|
834
|
+
hasNot: "Locator" = None,
|
|
835
|
+
) -> "Locator":
|
|
836
|
+
return self._main_frame.locator(
|
|
837
|
+
selector, hasText=hasText, hasNotText=hasNotText, has=has, hasNot=hasNot
|
|
838
|
+
)
|
|
839
|
+
|
|
840
|
+
def get_by_alt_text(
|
|
841
|
+
self, text: Union[str, Pattern[str]], exact: bool = None
|
|
842
|
+
) -> "Locator":
|
|
843
|
+
return self._main_frame.get_by_alt_text(text, exact=exact)
|
|
844
|
+
|
|
845
|
+
def get_by_label(
|
|
846
|
+
self, text: Union[str, Pattern[str]], exact: bool = None
|
|
847
|
+
) -> "Locator":
|
|
848
|
+
return self._main_frame.get_by_label(text, exact=exact)
|
|
849
|
+
|
|
850
|
+
def get_by_placeholder(
|
|
851
|
+
self, text: Union[str, Pattern[str]], exact: bool = None
|
|
852
|
+
) -> "Locator":
|
|
853
|
+
return self._main_frame.get_by_placeholder(text, exact=exact)
|
|
854
|
+
|
|
855
|
+
def get_by_role(
|
|
856
|
+
self,
|
|
857
|
+
role: AriaRole,
|
|
858
|
+
checked: bool = None,
|
|
859
|
+
disabled: bool = None,
|
|
860
|
+
expanded: bool = None,
|
|
861
|
+
includeHidden: bool = None,
|
|
862
|
+
level: int = None,
|
|
863
|
+
name: Union[str, Pattern[str]] = None,
|
|
864
|
+
pressed: bool = None,
|
|
865
|
+
selected: bool = None,
|
|
866
|
+
exact: bool = None,
|
|
867
|
+
) -> "Locator":
|
|
868
|
+
return self._main_frame.get_by_role(
|
|
869
|
+
role,
|
|
870
|
+
checked=checked,
|
|
871
|
+
disabled=disabled,
|
|
872
|
+
expanded=expanded,
|
|
873
|
+
includeHidden=includeHidden,
|
|
874
|
+
level=level,
|
|
875
|
+
name=name,
|
|
876
|
+
pressed=pressed,
|
|
877
|
+
selected=selected,
|
|
878
|
+
exact=exact,
|
|
879
|
+
)
|
|
880
|
+
|
|
881
|
+
def get_by_test_id(self, testId: Union[str, Pattern[str]]) -> "Locator":
|
|
882
|
+
return self._main_frame.get_by_test_id(testId)
|
|
883
|
+
|
|
884
|
+
def get_by_text(
|
|
885
|
+
self, text: Union[str, Pattern[str]], exact: bool = None
|
|
886
|
+
) -> "Locator":
|
|
887
|
+
return self._main_frame.get_by_text(text, exact=exact)
|
|
888
|
+
|
|
889
|
+
def get_by_title(
|
|
890
|
+
self, text: Union[str, Pattern[str]], exact: bool = None
|
|
891
|
+
) -> "Locator":
|
|
892
|
+
return self._main_frame.get_by_title(text, exact=exact)
|
|
893
|
+
|
|
894
|
+
def frame_locator(self, selector: str) -> "FrameLocator":
|
|
895
|
+
return self.main_frame.frame_locator(selector)
|
|
896
|
+
|
|
897
|
+
async def focus(
|
|
898
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
899
|
+
) -> None:
|
|
900
|
+
return await self._main_frame.focus(**locals_to_params(locals()))
|
|
901
|
+
|
|
902
|
+
async def text_content(
|
|
903
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
904
|
+
) -> Optional[str]:
|
|
905
|
+
return await self._main_frame.text_content(**locals_to_params(locals()))
|
|
906
|
+
|
|
907
|
+
async def inner_text(
|
|
908
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
909
|
+
) -> str:
|
|
910
|
+
return await self._main_frame.inner_text(**locals_to_params(locals()))
|
|
911
|
+
|
|
912
|
+
async def inner_html(
|
|
913
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
914
|
+
) -> str:
|
|
915
|
+
return await self._main_frame.inner_html(**locals_to_params(locals()))
|
|
916
|
+
|
|
917
|
+
async def get_attribute(
|
|
918
|
+
self, selector: str, name: str, strict: bool = None, timeout: float = None
|
|
919
|
+
) -> Optional[str]:
|
|
920
|
+
return await self._main_frame.get_attribute(**locals_to_params(locals()))
|
|
921
|
+
|
|
922
|
+
async def hover(
|
|
923
|
+
self,
|
|
924
|
+
selector: str,
|
|
925
|
+
modifiers: Sequence[KeyboardModifier] = None,
|
|
926
|
+
position: Position = None,
|
|
927
|
+
timeout: float = None,
|
|
928
|
+
noWaitAfter: bool = None,
|
|
929
|
+
force: bool = None,
|
|
930
|
+
strict: bool = None,
|
|
931
|
+
trial: bool = None,
|
|
932
|
+
) -> None:
|
|
933
|
+
return await self._main_frame.hover(**locals_to_params(locals()))
|
|
934
|
+
|
|
935
|
+
async def drag_and_drop(
|
|
936
|
+
self,
|
|
937
|
+
source: str,
|
|
938
|
+
target: str,
|
|
939
|
+
sourcePosition: Position = None,
|
|
940
|
+
targetPosition: Position = None,
|
|
941
|
+
force: bool = None,
|
|
942
|
+
noWaitAfter: bool = None,
|
|
943
|
+
timeout: float = None,
|
|
944
|
+
strict: bool = None,
|
|
945
|
+
trial: bool = None,
|
|
946
|
+
) -> None:
|
|
947
|
+
return await self._main_frame.drag_and_drop(**locals_to_params(locals()))
|
|
948
|
+
|
|
949
|
+
async def select_option(
|
|
950
|
+
self,
|
|
951
|
+
selector: str,
|
|
952
|
+
value: Union[str, Sequence[str]] = None,
|
|
953
|
+
index: Union[int, Sequence[int]] = None,
|
|
954
|
+
label: Union[str, Sequence[str]] = None,
|
|
955
|
+
element: Union["ElementHandle", Sequence["ElementHandle"]] = None,
|
|
956
|
+
timeout: float = None,
|
|
957
|
+
noWaitAfter: bool = None,
|
|
958
|
+
force: bool = None,
|
|
959
|
+
strict: bool = None,
|
|
960
|
+
) -> List[str]:
|
|
961
|
+
params = locals_to_params(locals())
|
|
962
|
+
return await self._main_frame.select_option(**params)
|
|
963
|
+
|
|
964
|
+
async def input_value(
|
|
965
|
+
self, selector: str, strict: bool = None, timeout: float = None
|
|
966
|
+
) -> str:
|
|
967
|
+
params = locals_to_params(locals())
|
|
968
|
+
return await self._main_frame.input_value(**params)
|
|
969
|
+
|
|
970
|
+
async def set_input_files(
|
|
971
|
+
self,
|
|
972
|
+
selector: str,
|
|
973
|
+
files: Union[
|
|
974
|
+
str, Path, FilePayload, Sequence[Union[str, Path]], Sequence[FilePayload]
|
|
975
|
+
],
|
|
976
|
+
timeout: float = None,
|
|
977
|
+
strict: bool = None,
|
|
978
|
+
noWaitAfter: bool = None,
|
|
979
|
+
) -> None:
|
|
980
|
+
return await self._main_frame.set_input_files(**locals_to_params(locals()))
|
|
981
|
+
|
|
982
|
+
async def type(
|
|
983
|
+
self,
|
|
984
|
+
selector: str,
|
|
985
|
+
text: str,
|
|
986
|
+
delay: float = None,
|
|
987
|
+
timeout: float = None,
|
|
988
|
+
noWaitAfter: bool = None,
|
|
989
|
+
strict: bool = None,
|
|
990
|
+
) -> None:
|
|
991
|
+
return await self._main_frame.type(**locals_to_params(locals()))
|
|
992
|
+
|
|
993
|
+
async def press(
|
|
994
|
+
self,
|
|
995
|
+
selector: str,
|
|
996
|
+
key: str,
|
|
997
|
+
delay: float = None,
|
|
998
|
+
timeout: float = None,
|
|
999
|
+
noWaitAfter: bool = None,
|
|
1000
|
+
strict: bool = None,
|
|
1001
|
+
) -> None:
|
|
1002
|
+
return await self._main_frame.press(**locals_to_params(locals()))
|
|
1003
|
+
|
|
1004
|
+
async def check(
|
|
1005
|
+
self,
|
|
1006
|
+
selector: str,
|
|
1007
|
+
position: Position = None,
|
|
1008
|
+
timeout: float = None,
|
|
1009
|
+
force: bool = None,
|
|
1010
|
+
noWaitAfter: bool = None,
|
|
1011
|
+
strict: bool = None,
|
|
1012
|
+
trial: bool = None,
|
|
1013
|
+
) -> None:
|
|
1014
|
+
return await self._main_frame.check(**locals_to_params(locals()))
|
|
1015
|
+
|
|
1016
|
+
async def uncheck(
|
|
1017
|
+
self,
|
|
1018
|
+
selector: str,
|
|
1019
|
+
position: Position = None,
|
|
1020
|
+
timeout: float = None,
|
|
1021
|
+
force: bool = None,
|
|
1022
|
+
noWaitAfter: bool = None,
|
|
1023
|
+
strict: bool = None,
|
|
1024
|
+
trial: bool = None,
|
|
1025
|
+
) -> None:
|
|
1026
|
+
return await self._main_frame.uncheck(**locals_to_params(locals()))
|
|
1027
|
+
|
|
1028
|
+
async def wait_for_timeout(self, timeout: float) -> None:
|
|
1029
|
+
await self._main_frame.wait_for_timeout(timeout)
|
|
1030
|
+
|
|
1031
|
+
async def wait_for_function(
|
|
1032
|
+
self,
|
|
1033
|
+
expression: str,
|
|
1034
|
+
arg: Serializable = None,
|
|
1035
|
+
timeout: float = None,
|
|
1036
|
+
polling: Union[float, Literal["raf"]] = None,
|
|
1037
|
+
) -> JSHandle:
|
|
1038
|
+
return await self._main_frame.wait_for_function(**locals_to_params(locals()))
|
|
1039
|
+
|
|
1040
|
+
@property
|
|
1041
|
+
def workers(self) -> List["Worker"]:
|
|
1042
|
+
return self._workers.copy()
|
|
1043
|
+
|
|
1044
|
+
@property
|
|
1045
|
+
def request(self) -> "APIRequestContext":
|
|
1046
|
+
return self.context.request
|
|
1047
|
+
|
|
1048
|
+
async def pause(self) -> None:
|
|
1049
|
+
default_navigation_timeout = (
|
|
1050
|
+
self._browser_context._timeout_settings.default_navigation_timeout()
|
|
1051
|
+
)
|
|
1052
|
+
default_timeout = self._browser_context._timeout_settings.default_timeout()
|
|
1053
|
+
self._browser_context.set_default_navigation_timeout(0)
|
|
1054
|
+
self._browser_context.set_default_timeout(0)
|
|
1055
|
+
try:
|
|
1056
|
+
await asyncio.wait(
|
|
1057
|
+
[
|
|
1058
|
+
asyncio.create_task(self._browser_context._channel.send("pause")),
|
|
1059
|
+
self._closed_or_crashed_future,
|
|
1060
|
+
],
|
|
1061
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
1062
|
+
)
|
|
1063
|
+
finally:
|
|
1064
|
+
self._browser_context._set_default_navigation_timeout_impl(
|
|
1065
|
+
default_navigation_timeout
|
|
1066
|
+
)
|
|
1067
|
+
self._browser_context._set_default_timeout_impl(default_timeout)
|
|
1068
|
+
|
|
1069
|
+
async def pdf(
|
|
1070
|
+
self,
|
|
1071
|
+
scale: float = None,
|
|
1072
|
+
displayHeaderFooter: bool = None,
|
|
1073
|
+
headerTemplate: str = None,
|
|
1074
|
+
footerTemplate: str = None,
|
|
1075
|
+
printBackground: bool = None,
|
|
1076
|
+
landscape: bool = None,
|
|
1077
|
+
pageRanges: str = None,
|
|
1078
|
+
format: str = None,
|
|
1079
|
+
width: Union[str, float] = None,
|
|
1080
|
+
height: Union[str, float] = None,
|
|
1081
|
+
preferCSSPageSize: bool = None,
|
|
1082
|
+
margin: PdfMargins = None,
|
|
1083
|
+
path: Union[str, Path] = None,
|
|
1084
|
+
outline: bool = None,
|
|
1085
|
+
tagged: bool = None,
|
|
1086
|
+
) -> bytes:
|
|
1087
|
+
params = locals_to_params(locals())
|
|
1088
|
+
if "path" in params:
|
|
1089
|
+
del params["path"]
|
|
1090
|
+
encoded_binary = await self._channel.send("pdf", params)
|
|
1091
|
+
decoded_binary = base64.b64decode(encoded_binary)
|
|
1092
|
+
if path:
|
|
1093
|
+
make_dirs_for_file(path)
|
|
1094
|
+
await async_writefile(path, decoded_binary)
|
|
1095
|
+
return decoded_binary
|
|
1096
|
+
|
|
1097
|
+
def _force_video(self) -> Video:
|
|
1098
|
+
if not self._video:
|
|
1099
|
+
self._video = Video(self)
|
|
1100
|
+
return self._video
|
|
1101
|
+
|
|
1102
|
+
@property
|
|
1103
|
+
def video(self) -> Optional[Video]:
|
|
1104
|
+
if not self._browser_context._options.get("recordVideo"):
|
|
1105
|
+
return None
|
|
1106
|
+
return self._force_video()
|
|
1107
|
+
|
|
1108
|
+
def _close_error_with_reason(self) -> TargetClosedError:
|
|
1109
|
+
return TargetClosedError(
|
|
1110
|
+
self._close_reason or self._browser_context._effective_close_reason()
|
|
1111
|
+
)
|
|
1112
|
+
|
|
1113
|
+
def expect_event(
|
|
1114
|
+
self, event: str, predicate: Callable = None, timeout: float = None
|
|
1115
|
+
) -> EventContextManagerImpl:
|
|
1116
|
+
return self._expect_event(
|
|
1117
|
+
event, predicate, timeout, f'waiting for event "{event}"'
|
|
1118
|
+
)
|
|
1119
|
+
|
|
1120
|
+
def _expect_event(
|
|
1121
|
+
self,
|
|
1122
|
+
event: str,
|
|
1123
|
+
predicate: Callable = None,
|
|
1124
|
+
timeout: float = None,
|
|
1125
|
+
log_line: str = None,
|
|
1126
|
+
) -> EventContextManagerImpl:
|
|
1127
|
+
if timeout is None:
|
|
1128
|
+
timeout = self._timeout_settings.timeout()
|
|
1129
|
+
waiter = Waiter(self, f"page.expect_event({event})")
|
|
1130
|
+
waiter.reject_on_timeout(
|
|
1131
|
+
timeout, f'Timeout {timeout}ms exceeded while waiting for event "{event}"'
|
|
1132
|
+
)
|
|
1133
|
+
if log_line:
|
|
1134
|
+
waiter.log(log_line)
|
|
1135
|
+
if event != Page.Events.Crash:
|
|
1136
|
+
waiter.reject_on_event(self, Page.Events.Crash, Error("Page crashed"))
|
|
1137
|
+
if event != Page.Events.Close:
|
|
1138
|
+
waiter.reject_on_event(
|
|
1139
|
+
self, Page.Events.Close, lambda: self._close_error_with_reason()
|
|
1140
|
+
)
|
|
1141
|
+
waiter.wait_for_event(self, event, predicate)
|
|
1142
|
+
return EventContextManagerImpl(waiter.result())
|
|
1143
|
+
|
|
1144
|
+
def expect_console_message(
|
|
1145
|
+
self, predicate: Callable[[ConsoleMessage], bool] = None, timeout: float = None
|
|
1146
|
+
) -> EventContextManagerImpl[ConsoleMessage]:
|
|
1147
|
+
return self.expect_event(Page.Events.Console, predicate, timeout)
|
|
1148
|
+
|
|
1149
|
+
def expect_download(
|
|
1150
|
+
self, predicate: Callable[[Download], bool] = None, timeout: float = None
|
|
1151
|
+
) -> EventContextManagerImpl[Download]:
|
|
1152
|
+
return self.expect_event(Page.Events.Download, predicate, timeout)
|
|
1153
|
+
|
|
1154
|
+
def expect_file_chooser(
|
|
1155
|
+
self, predicate: Callable[[FileChooser], bool] = None, timeout: float = None
|
|
1156
|
+
) -> EventContextManagerImpl[FileChooser]:
|
|
1157
|
+
return self.expect_event(Page.Events.FileChooser, predicate, timeout)
|
|
1158
|
+
|
|
1159
|
+
def expect_navigation(
|
|
1160
|
+
self,
|
|
1161
|
+
url: URLMatch = None,
|
|
1162
|
+
waitUntil: DocumentLoadState = None,
|
|
1163
|
+
timeout: float = None,
|
|
1164
|
+
) -> EventContextManagerImpl[Response]:
|
|
1165
|
+
return self.main_frame.expect_navigation(url, waitUntil, timeout)
|
|
1166
|
+
|
|
1167
|
+
def expect_popup(
|
|
1168
|
+
self, predicate: Callable[["Page"], bool] = None, timeout: float = None
|
|
1169
|
+
) -> EventContextManagerImpl["Page"]:
|
|
1170
|
+
return self.expect_event(Page.Events.Popup, predicate, timeout)
|
|
1171
|
+
|
|
1172
|
+
def expect_request(
|
|
1173
|
+
self, urlOrPredicate: URLMatchRequest, timeout: float = None
|
|
1174
|
+
) -> EventContextManagerImpl[Request]:
|
|
1175
|
+
matcher = (
|
|
1176
|
+
None
|
|
1177
|
+
if callable(urlOrPredicate)
|
|
1178
|
+
else URLMatcher(
|
|
1179
|
+
self._browser_context._options.get("baseURL"), urlOrPredicate
|
|
1180
|
+
)
|
|
1181
|
+
)
|
|
1182
|
+
predicate = urlOrPredicate if callable(urlOrPredicate) else None
|
|
1183
|
+
|
|
1184
|
+
def my_predicate(request: Request) -> bool:
|
|
1185
|
+
if matcher:
|
|
1186
|
+
return matcher.matches(request.url)
|
|
1187
|
+
if predicate:
|
|
1188
|
+
return predicate(request)
|
|
1189
|
+
return True
|
|
1190
|
+
|
|
1191
|
+
trimmed_url = trim_url(urlOrPredicate)
|
|
1192
|
+
log_line = f"waiting for request {trimmed_url}" if trimmed_url else None
|
|
1193
|
+
return self._expect_event(
|
|
1194
|
+
Page.Events.Request,
|
|
1195
|
+
predicate=my_predicate,
|
|
1196
|
+
timeout=timeout,
|
|
1197
|
+
log_line=log_line,
|
|
1198
|
+
)
|
|
1199
|
+
|
|
1200
|
+
def expect_request_finished(
|
|
1201
|
+
self, predicate: Callable[["Request"], bool] = None, timeout: float = None
|
|
1202
|
+
) -> EventContextManagerImpl[Request]:
|
|
1203
|
+
return self.expect_event(
|
|
1204
|
+
Page.Events.RequestFinished, predicate=predicate, timeout=timeout
|
|
1205
|
+
)
|
|
1206
|
+
|
|
1207
|
+
def expect_response(
|
|
1208
|
+
self, urlOrPredicate: URLMatchResponse, timeout: float = None
|
|
1209
|
+
) -> EventContextManagerImpl[Response]:
|
|
1210
|
+
matcher = (
|
|
1211
|
+
None
|
|
1212
|
+
if callable(urlOrPredicate)
|
|
1213
|
+
else URLMatcher(
|
|
1214
|
+
self._browser_context._options.get("baseURL"), urlOrPredicate
|
|
1215
|
+
)
|
|
1216
|
+
)
|
|
1217
|
+
predicate = urlOrPredicate if callable(urlOrPredicate) else None
|
|
1218
|
+
|
|
1219
|
+
def my_predicate(response: Response) -> bool:
|
|
1220
|
+
if matcher:
|
|
1221
|
+
return matcher.matches(response.url)
|
|
1222
|
+
if predicate:
|
|
1223
|
+
return predicate(response)
|
|
1224
|
+
return True
|
|
1225
|
+
|
|
1226
|
+
trimmed_url = trim_url(urlOrPredicate)
|
|
1227
|
+
log_line = f"waiting for response {trimmed_url}" if trimmed_url else None
|
|
1228
|
+
return self._expect_event(
|
|
1229
|
+
Page.Events.Response,
|
|
1230
|
+
predicate=my_predicate,
|
|
1231
|
+
timeout=timeout,
|
|
1232
|
+
log_line=log_line,
|
|
1233
|
+
)
|
|
1234
|
+
|
|
1235
|
+
def expect_websocket(
|
|
1236
|
+
self, predicate: Callable[["WebSocket"], bool] = None, timeout: float = None
|
|
1237
|
+
) -> EventContextManagerImpl["WebSocket"]:
|
|
1238
|
+
return self.expect_event("websocket", predicate, timeout)
|
|
1239
|
+
|
|
1240
|
+
def expect_worker(
|
|
1241
|
+
self, predicate: Callable[["Worker"], bool] = None, timeout: float = None
|
|
1242
|
+
) -> EventContextManagerImpl["Worker"]:
|
|
1243
|
+
return self.expect_event("worker", predicate, timeout)
|
|
1244
|
+
|
|
1245
|
+
async def set_checked(
|
|
1246
|
+
self,
|
|
1247
|
+
selector: str,
|
|
1248
|
+
checked: bool,
|
|
1249
|
+
position: Position = None,
|
|
1250
|
+
timeout: float = None,
|
|
1251
|
+
force: bool = None,
|
|
1252
|
+
noWaitAfter: bool = None,
|
|
1253
|
+
strict: bool = None,
|
|
1254
|
+
trial: bool = None,
|
|
1255
|
+
) -> None:
|
|
1256
|
+
if checked:
|
|
1257
|
+
await self.check(
|
|
1258
|
+
selector=selector,
|
|
1259
|
+
position=position,
|
|
1260
|
+
timeout=timeout,
|
|
1261
|
+
force=force,
|
|
1262
|
+
strict=strict,
|
|
1263
|
+
trial=trial,
|
|
1264
|
+
)
|
|
1265
|
+
else:
|
|
1266
|
+
await self.uncheck(
|
|
1267
|
+
selector=selector,
|
|
1268
|
+
position=position,
|
|
1269
|
+
timeout=timeout,
|
|
1270
|
+
force=force,
|
|
1271
|
+
strict=strict,
|
|
1272
|
+
trial=trial,
|
|
1273
|
+
)
|
|
1274
|
+
|
|
1275
|
+
async def add_locator_handler(
|
|
1276
|
+
self,
|
|
1277
|
+
locator: "Locator",
|
|
1278
|
+
handler: Union[Callable[["Locator"], Any], Callable[[], Any]],
|
|
1279
|
+
noWaitAfter: bool = None,
|
|
1280
|
+
times: int = None,
|
|
1281
|
+
) -> None:
|
|
1282
|
+
if locator._frame != self._main_frame:
|
|
1283
|
+
raise Error("Locator must belong to the main frame of this page")
|
|
1284
|
+
if times == 0:
|
|
1285
|
+
return
|
|
1286
|
+
uid = await self._channel.send(
|
|
1287
|
+
"registerLocatorHandler",
|
|
1288
|
+
{"selector": locator._selector, "noWaitAfter": noWaitAfter},
|
|
1289
|
+
)
|
|
1290
|
+
self._locator_handlers[uid] = LocatorHandler(
|
|
1291
|
+
handler=handler, times=times, locator=locator
|
|
1292
|
+
)
|
|
1293
|
+
|
|
1294
|
+
async def _on_locator_handler_triggered(self, uid: str) -> None:
|
|
1295
|
+
remove = False
|
|
1296
|
+
try:
|
|
1297
|
+
handler = self._locator_handlers.get(uid)
|
|
1298
|
+
if handler and handler.times != 0:
|
|
1299
|
+
if handler.times is not None:
|
|
1300
|
+
handler.times -= 1
|
|
1301
|
+
if self._dispatcher_fiber:
|
|
1302
|
+
handler_finished_future = self._loop.create_future()
|
|
1303
|
+
|
|
1304
|
+
def _handler() -> None:
|
|
1305
|
+
try:
|
|
1306
|
+
handler()
|
|
1307
|
+
handler_finished_future.set_result(None)
|
|
1308
|
+
except Exception as e:
|
|
1309
|
+
handler_finished_future.set_exception(e)
|
|
1310
|
+
|
|
1311
|
+
g = LocatorHandlerGreenlet(_handler)
|
|
1312
|
+
g.switch()
|
|
1313
|
+
await handler_finished_future
|
|
1314
|
+
else:
|
|
1315
|
+
coro_or_future = handler()
|
|
1316
|
+
if coro_or_future:
|
|
1317
|
+
await coro_or_future
|
|
1318
|
+
remove = handler.times == 0
|
|
1319
|
+
finally:
|
|
1320
|
+
if remove:
|
|
1321
|
+
del self._locator_handlers[uid]
|
|
1322
|
+
try:
|
|
1323
|
+
await self._connection.wrap_api_call(
|
|
1324
|
+
lambda: self._channel.send(
|
|
1325
|
+
"resolveLocatorHandlerNoReply", {"uid": uid, "remove": remove}
|
|
1326
|
+
),
|
|
1327
|
+
is_internal=True,
|
|
1328
|
+
)
|
|
1329
|
+
except Error:
|
|
1330
|
+
pass
|
|
1331
|
+
|
|
1332
|
+
async def remove_locator_handler(self, locator: "Locator") -> None:
|
|
1333
|
+
for uid, data in self._locator_handlers.copy().items():
|
|
1334
|
+
if data.locator._equals(locator):
|
|
1335
|
+
del self._locator_handlers[uid]
|
|
1336
|
+
self._channel.send_no_reply("unregisterLocatorHandler", {"uid": uid})
|
|
1337
|
+
|
|
1338
|
+
route_injecting = False
|
|
1339
|
+
|
|
1340
|
+
async def install_inject_route(self) -> None:
|
|
1341
|
+
from patchright._impl._impl_to_api_mapping import ImplToApiMapping
|
|
1342
|
+
|
|
1343
|
+
mapping = ImplToApiMapping()
|
|
1344
|
+
|
|
1345
|
+
async def route_handler(route: Route) -> None:
|
|
1346
|
+
if (
|
|
1347
|
+
route.request.resource_type == "document"
|
|
1348
|
+
and route.request.url.startswith("http")
|
|
1349
|
+
):
|
|
1350
|
+
try:
|
|
1351
|
+
response = await route.fetch(maxRedirects=0)
|
|
1352
|
+
await route.fulfill(response=response)
|
|
1353
|
+
except Exception:
|
|
1354
|
+
await route.continue_()
|
|
1355
|
+
else:
|
|
1356
|
+
await route.continue_()
|
|
1357
|
+
|
|
1358
|
+
if not self.route_injecting and (not self.context.route_injecting):
|
|
1359
|
+
await self.route("**/*", mapping.wrap_handler(route_handler))
|
|
1360
|
+
self.route_injecting = True
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
class Worker(ChannelOwner):
|
|
1364
|
+
Events = SimpleNamespace(Close="close")
|
|
1365
|
+
|
|
1366
|
+
def __init__(
|
|
1367
|
+
self, parent: ChannelOwner, type: str, guid: str, initializer: Dict
|
|
1368
|
+
) -> None:
|
|
1369
|
+
super().__init__(parent, type, guid, initializer)
|
|
1370
|
+
self._channel.on("close", lambda _: self._on_close())
|
|
1371
|
+
self._page: Optional[Page] = None
|
|
1372
|
+
self._context: Optional["BrowserContext"] = None
|
|
1373
|
+
|
|
1374
|
+
def __repr__(self) -> str:
|
|
1375
|
+
return f"<Worker url={self.url!r}>"
|
|
1376
|
+
|
|
1377
|
+
def _on_close(self) -> None:
|
|
1378
|
+
if self._page:
|
|
1379
|
+
self._page._workers.remove(self)
|
|
1380
|
+
if self._context:
|
|
1381
|
+
self._context._service_workers.remove(self)
|
|
1382
|
+
self.emit(Worker.Events.Close, self)
|
|
1383
|
+
|
|
1384
|
+
@property
|
|
1385
|
+
def url(self) -> str:
|
|
1386
|
+
return self._initializer["url"]
|
|
1387
|
+
|
|
1388
|
+
async def evaluate(self, expression: str, arg: Serializable = None) -> Any:
|
|
1389
|
+
return parse_result(
|
|
1390
|
+
await self._channel.send(
|
|
1391
|
+
"evaluateExpression",
|
|
1392
|
+
dict(expression=expression, arg=serialize_argument(arg)),
|
|
1393
|
+
)
|
|
1394
|
+
)
|
|
1395
|
+
|
|
1396
|
+
async def evaluate_handle(
|
|
1397
|
+
self, expression: str, arg: Serializable = None
|
|
1398
|
+
) -> JSHandle:
|
|
1399
|
+
return from_channel(
|
|
1400
|
+
await self._channel.send(
|
|
1401
|
+
"evaluateExpressionHandle",
|
|
1402
|
+
dict(expression=expression, arg=serialize_argument(arg)),
|
|
1403
|
+
)
|
|
1404
|
+
)
|
|
1405
|
+
|
|
1406
|
+
|
|
1407
|
+
class BindingCall(ChannelOwner):
|
|
1408
|
+
|
|
1409
|
+
def __init__(
|
|
1410
|
+
self, parent: ChannelOwner, type: str, guid: str, initializer: Dict
|
|
1411
|
+
) -> None:
|
|
1412
|
+
super().__init__(parent, type, guid, initializer)
|
|
1413
|
+
|
|
1414
|
+
async def call(self, func: Callable) -> None:
|
|
1415
|
+
try:
|
|
1416
|
+
frame = from_channel(self._initializer["frame"])
|
|
1417
|
+
source = dict(context=frame._page.context, page=frame._page, frame=frame)
|
|
1418
|
+
if self._initializer.get("handle"):
|
|
1419
|
+
result = func(source, from_channel(self._initializer["handle"]))
|
|
1420
|
+
else:
|
|
1421
|
+
func_args = list(map(parse_result, self._initializer["args"]))
|
|
1422
|
+
result = func(source, *func_args)
|
|
1423
|
+
if inspect.iscoroutine(result):
|
|
1424
|
+
result = await result
|
|
1425
|
+
await self._channel.send("resolve", dict(result=serialize_argument(result)))
|
|
1426
|
+
except Exception as e:
|
|
1427
|
+
tb = sys.exc_info()[2]
|
|
1428
|
+
asyncio.create_task(
|
|
1429
|
+
self._channel.send(
|
|
1430
|
+
"reject", dict(error=dict(error=serialize_error(e, tb)))
|
|
1431
|
+
)
|
|
1432
|
+
)
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
def trim_url(param: Union[URLMatchRequest, URLMatchResponse]) -> Optional[str]:
|
|
1436
|
+
if isinstance(param, re.Pattern):
|
|
1437
|
+
return trim_end(param.pattern)
|
|
1438
|
+
if isinstance(param, str):
|
|
1439
|
+
return trim_end(param)
|
|
1440
|
+
return None
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
def trim_end(s: str) -> str:
|
|
1444
|
+
if len(s) > 50:
|
|
1445
|
+
return s[:50] + "…"
|
|
1446
|
+
return s
|