pure-patchright 1.52.5__py3-none-any.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.
Files changed (381) hide show
  1. patchright/__init__.py +5 -0
  2. patchright/__main__.py +18 -0
  3. patchright/_impl/__init__.py +0 -0
  4. patchright/_impl/__pyinstaller/__init__.py +20 -0
  5. patchright/_impl/__pyinstaller/hook-playwright.async_api.py +3 -0
  6. patchright/_impl/__pyinstaller/hook-playwright.sync_api.py +3 -0
  7. patchright/_impl/_accessibility.py +50 -0
  8. patchright/_impl/_api_structures.py +277 -0
  9. patchright/_impl/_artifact.py +45 -0
  10. patchright/_impl/_assertions.py +867 -0
  11. patchright/_impl/_async_base.py +92 -0
  12. patchright/_impl/_browser.py +248 -0
  13. patchright/_impl/_browser_context.py +743 -0
  14. patchright/_impl/_browser_type.py +276 -0
  15. patchright/_impl/_cdp_session.py +21 -0
  16. patchright/_impl/_clock.py +57 -0
  17. patchright/_impl/_connection.py +562 -0
  18. patchright/_impl/_console_message.py +45 -0
  19. patchright/_impl/_dialog.py +40 -0
  20. patchright/_impl/_download.py +50 -0
  21. patchright/_impl/_driver.py +24 -0
  22. patchright/_impl/_element_handle.py +376 -0
  23. patchright/_impl/_errors.py +44 -0
  24. patchright/_impl/_event_context_manager.py +20 -0
  25. patchright/_impl/_fetch.py +518 -0
  26. patchright/_impl/_file_chooser.py +43 -0
  27. patchright/_impl/_frame.py +779 -0
  28. patchright/_impl/_glob.py +46 -0
  29. patchright/_impl/_greenlets.py +39 -0
  30. patchright/_impl/_har_router.py +99 -0
  31. patchright/_impl/_helper.py +481 -0
  32. patchright/_impl/_impl_to_api_mapping.py +123 -0
  33. patchright/_impl/_input.py +71 -0
  34. patchright/_impl/_js_handle.py +300 -0
  35. patchright/_impl/_json_pipe.py +56 -0
  36. patchright/_impl/_local_utils.py +73 -0
  37. patchright/_impl/_locator.py +814 -0
  38. patchright/_impl/_map.py +19 -0
  39. patchright/_impl/_network.py +958 -0
  40. patchright/_impl/_object_factory.py +91 -0
  41. patchright/_impl/_page.py +1485 -0
  42. patchright/_impl/_path_utils.py +11 -0
  43. patchright/_impl/_playwright.py +51 -0
  44. patchright/_impl/_selectors.py +62 -0
  45. patchright/_impl/_set_input_files_helpers.py +135 -0
  46. patchright/_impl/_str_utils.py +57 -0
  47. patchright/_impl/_stream.py +32 -0
  48. patchright/_impl/_sync_base.py +134 -0
  49. patchright/_impl/_tracing.py +110 -0
  50. patchright/_impl/_transport.py +150 -0
  51. patchright/_impl/_video.py +57 -0
  52. patchright/_impl/_waiter.py +142 -0
  53. patchright/_impl/_web_error.py +27 -0
  54. patchright/_impl/_writable_stream.py +27 -0
  55. patchright/_repo_version.py +1 -0
  56. patchright/async_api/__init__.py +179 -0
  57. patchright/async_api/_context_manager.py +39 -0
  58. patchright/async_api/_generated.py +20416 -0
  59. patchright/driver/README.md +1 -0
  60. patchright/driver/package/README.md +3 -0
  61. patchright/driver/package/ThirdPartyNotices.txt +1560 -0
  62. patchright/driver/package/bin/install_media_pack.ps1 +5 -0
  63. patchright/driver/package/bin/reinstall_chrome_beta_linux.sh +42 -0
  64. patchright/driver/package/bin/reinstall_chrome_beta_mac.sh +13 -0
  65. patchright/driver/package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  66. patchright/driver/package/bin/reinstall_chrome_stable_linux.sh +42 -0
  67. patchright/driver/package/bin/reinstall_chrome_stable_mac.sh +12 -0
  68. patchright/driver/package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  69. patchright/driver/package/bin/reinstall_msedge_beta_linux.sh +48 -0
  70. patchright/driver/package/bin/reinstall_msedge_beta_mac.sh +11 -0
  71. patchright/driver/package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  72. patchright/driver/package/bin/reinstall_msedge_dev_linux.sh +48 -0
  73. patchright/driver/package/bin/reinstall_msedge_dev_mac.sh +11 -0
  74. patchright/driver/package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  75. patchright/driver/package/bin/reinstall_msedge_stable_linux.sh +48 -0
  76. patchright/driver/package/bin/reinstall_msedge_stable_mac.sh +11 -0
  77. patchright/driver/package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  78. patchright/driver/package/browsers.json +80 -0
  79. patchright/driver/package/cli.js +18 -0
  80. patchright/driver/package/index.js +32 -0
  81. patchright/driver/package/index.mjs +28 -0
  82. patchright/driver/package/lib/androidServerImpl.js +63 -0
  83. patchright/driver/package/lib/browserServerImpl.js +88 -0
  84. patchright/driver/package/lib/cli/driver.js +97 -0
  85. patchright/driver/package/lib/cli/program.js +567 -0
  86. patchright/driver/package/lib/cli/programWithTestStub.js +74 -0
  87. patchright/driver/package/lib/client/accessibility.js +49 -0
  88. patchright/driver/package/lib/client/android.js +365 -0
  89. patchright/driver/package/lib/client/api.js +137 -0
  90. patchright/driver/package/lib/client/artifact.js +79 -0
  91. patchright/driver/package/lib/client/browser.js +136 -0
  92. patchright/driver/package/lib/client/browserContext.js +539 -0
  93. patchright/driver/package/lib/client/browserType.js +193 -0
  94. patchright/driver/package/lib/client/cdpSession.js +51 -0
  95. patchright/driver/package/lib/client/channelOwner.js +205 -0
  96. patchright/driver/package/lib/client/clientHelper.js +64 -0
  97. patchright/driver/package/lib/client/clientInstrumentation.js +55 -0
  98. patchright/driver/package/lib/client/clientStackTrace.js +69 -0
  99. patchright/driver/package/lib/client/clock.js +68 -0
  100. patchright/driver/package/lib/client/connection.js +318 -0
  101. patchright/driver/package/lib/client/consoleMessage.js +55 -0
  102. patchright/driver/package/lib/client/coverage.js +44 -0
  103. patchright/driver/package/lib/client/dialog.js +56 -0
  104. patchright/driver/package/lib/client/download.js +62 -0
  105. patchright/driver/package/lib/client/electron.js +133 -0
  106. patchright/driver/package/lib/client/elementHandle.js +284 -0
  107. patchright/driver/package/lib/client/errors.js +77 -0
  108. patchright/driver/package/lib/client/eventEmitter.js +314 -0
  109. patchright/driver/package/lib/client/events.js +98 -0
  110. patchright/driver/package/lib/client/fetch.js +367 -0
  111. patchright/driver/package/lib/client/fileChooser.js +46 -0
  112. patchright/driver/package/lib/client/fileUtils.js +34 -0
  113. patchright/driver/package/lib/client/frame.js +386 -0
  114. patchright/driver/package/lib/client/harRouter.js +87 -0
  115. patchright/driver/package/lib/client/input.js +82 -0
  116. patchright/driver/package/lib/client/jsHandle.js +105 -0
  117. patchright/driver/package/lib/client/jsonPipe.js +39 -0
  118. patchright/driver/package/lib/client/localUtils.js +61 -0
  119. patchright/driver/package/lib/client/locator.js +362 -0
  120. patchright/driver/package/lib/client/network.js +751 -0
  121. patchright/driver/package/lib/client/page.js +709 -0
  122. patchright/driver/package/lib/client/platform.js +74 -0
  123. patchright/driver/package/lib/client/playwright.js +85 -0
  124. patchright/driver/package/lib/client/selectors.js +75 -0
  125. patchright/driver/package/lib/client/stream.js +39 -0
  126. patchright/driver/package/lib/client/timeoutSettings.js +75 -0
  127. patchright/driver/package/lib/client/tracing.js +114 -0
  128. patchright/driver/package/lib/client/types.js +28 -0
  129. patchright/driver/package/lib/client/video.js +59 -0
  130. patchright/driver/package/lib/client/waiter.js +142 -0
  131. patchright/driver/package/lib/client/webError.js +39 -0
  132. patchright/driver/package/lib/client/webSocket.js +111 -0
  133. patchright/driver/package/lib/client/worker.js +63 -0
  134. patchright/driver/package/lib/client/writableStream.js +39 -0
  135. patchright/driver/package/lib/generated/clockSource.js +28 -0
  136. patchright/driver/package/lib/generated/consoleApiSource.js +28 -0
  137. patchright/driver/package/lib/generated/injectedScriptSource.js +28 -0
  138. patchright/driver/package/lib/generated/pollingRecorderSource.js +28 -0
  139. patchright/driver/package/lib/generated/utilityScriptSource.js +28 -0
  140. patchright/driver/package/lib/generated/webSocketMockSource.js +374 -0
  141. patchright/driver/package/lib/inProcessFactory.js +59 -0
  142. patchright/driver/package/lib/inprocess.js +3 -0
  143. patchright/driver/package/lib/outofprocess.js +78 -0
  144. patchright/driver/package/lib/protocol/debug.js +211 -0
  145. patchright/driver/package/lib/protocol/serializers.js +192 -0
  146. patchright/driver/package/lib/protocol/validator.js +2832 -0
  147. patchright/driver/package/lib/protocol/validatorPrimitives.js +179 -0
  148. patchright/driver/package/lib/remote/playwrightConnection.js +266 -0
  149. patchright/driver/package/lib/remote/playwrightServer.js +139 -0
  150. patchright/driver/package/lib/server/accessibility.js +69 -0
  151. patchright/driver/package/lib/server/android/android.js +451 -0
  152. patchright/driver/package/lib/server/android/backendAdb.js +179 -0
  153. patchright/driver/package/lib/server/artifact.js +127 -0
  154. patchright/driver/package/lib/server/bidi/bidiBrowser.js +380 -0
  155. patchright/driver/package/lib/server/bidi/bidiChromium.js +152 -0
  156. patchright/driver/package/lib/server/bidi/bidiConnection.js +187 -0
  157. patchright/driver/package/lib/server/bidi/bidiExecutionContext.js +220 -0
  158. patchright/driver/package/lib/server/bidi/bidiFirefox.js +112 -0
  159. patchright/driver/package/lib/server/bidi/bidiInput.js +146 -0
  160. patchright/driver/package/lib/server/bidi/bidiNetworkManager.js +320 -0
  161. patchright/driver/package/lib/server/bidi/bidiOverCdp.js +102 -0
  162. patchright/driver/package/lib/server/bidi/bidiPage.js +530 -0
  163. patchright/driver/package/lib/server/bidi/bidiPdf.js +106 -0
  164. patchright/driver/package/lib/server/bidi/third_party/bidiCommands.d.js +22 -0
  165. patchright/driver/package/lib/server/bidi/third_party/bidiDeserializer.js +98 -0
  166. patchright/driver/package/lib/server/bidi/third_party/bidiKeyboard.js +256 -0
  167. patchright/driver/package/lib/server/bidi/third_party/bidiProtocol.js +152 -0
  168. patchright/driver/package/lib/server/bidi/third_party/bidiSerializer.js +148 -0
  169. patchright/driver/package/lib/server/bidi/third_party/firefoxPrefs.js +259 -0
  170. patchright/driver/package/lib/server/browser.js +140 -0
  171. patchright/driver/package/lib/server/browserContext.js +646 -0
  172. patchright/driver/package/lib/server/browserType.js +326 -0
  173. patchright/driver/package/lib/server/callLog.js +82 -0
  174. patchright/driver/package/lib/server/chromium/appIcon.png +0 -0
  175. patchright/driver/package/lib/server/chromium/chromium.js +376 -0
  176. patchright/driver/package/lib/server/chromium/chromiumSwitches.js +89 -0
  177. patchright/driver/package/lib/server/chromium/crAccessibility.js +263 -0
  178. patchright/driver/package/lib/server/chromium/crBrowser.js +503 -0
  179. patchright/driver/package/lib/server/chromium/crConnection.js +203 -0
  180. patchright/driver/package/lib/server/chromium/crCoverage.js +232 -0
  181. patchright/driver/package/lib/server/chromium/crDevTools.js +112 -0
  182. patchright/driver/package/lib/server/chromium/crDragDrop.js +126 -0
  183. patchright/driver/package/lib/server/chromium/crExecutionContext.js +145 -0
  184. patchright/driver/package/lib/server/chromium/crInput.js +184 -0
  185. patchright/driver/package/lib/server/chromium/crNetworkManager.js +742 -0
  186. patchright/driver/package/lib/server/chromium/crPage.js +1134 -0
  187. patchright/driver/package/lib/server/chromium/crPdf.js +121 -0
  188. patchright/driver/package/lib/server/chromium/crProtocolHelper.js +145 -0
  189. patchright/driver/package/lib/server/chromium/crServiceWorker.js +126 -0
  190. patchright/driver/package/lib/server/chromium/defaultFontFamilies.js +162 -0
  191. patchright/driver/package/lib/server/chromium/protocol.d.js +16 -0
  192. patchright/driver/package/lib/server/chromium/videoRecorder.js +121 -0
  193. patchright/driver/package/lib/server/clock.js +145 -0
  194. patchright/driver/package/lib/server/codegen/csharp.js +329 -0
  195. patchright/driver/package/lib/server/codegen/java.js +270 -0
  196. patchright/driver/package/lib/server/codegen/javascript.js +268 -0
  197. patchright/driver/package/lib/server/codegen/jsonl.js +51 -0
  198. patchright/driver/package/lib/server/codegen/language.js +111 -0
  199. patchright/driver/package/lib/server/codegen/languages.js +68 -0
  200. patchright/driver/package/lib/server/codegen/python.js +277 -0
  201. patchright/driver/package/lib/server/codegen/types.js +16 -0
  202. patchright/driver/package/lib/server/console.js +53 -0
  203. patchright/driver/package/lib/server/cookieStore.js +204 -0
  204. patchright/driver/package/lib/server/debugController.js +185 -0
  205. patchright/driver/package/lib/server/debugger.js +136 -0
  206. patchright/driver/package/lib/server/deviceDescriptors.js +39 -0
  207. patchright/driver/package/lib/server/deviceDescriptorsSource.json +1669 -0
  208. patchright/driver/package/lib/server/dialog.js +72 -0
  209. patchright/driver/package/lib/server/dispatchers/androidDispatcher.js +293 -0
  210. patchright/driver/package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  211. patchright/driver/package/lib/server/dispatchers/browserContextDispatcher.js +328 -0
  212. patchright/driver/package/lib/server/dispatchers/browserDispatcher.js +151 -0
  213. patchright/driver/package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  214. patchright/driver/package/lib/server/dispatchers/cdpSessionDispatcher.js +44 -0
  215. patchright/driver/package/lib/server/dispatchers/debugControllerDispatcher.js +87 -0
  216. patchright/driver/package/lib/server/dispatchers/dialogDispatcher.js +47 -0
  217. patchright/driver/package/lib/server/dispatchers/dispatcher.js +346 -0
  218. patchright/driver/package/lib/server/dispatchers/electronDispatcher.js +90 -0
  219. patchright/driver/package/lib/server/dispatchers/elementHandlerDispatcher.js +191 -0
  220. patchright/driver/package/lib/server/dispatchers/frameDispatcher.js +230 -0
  221. patchright/driver/package/lib/server/dispatchers/jsHandleDispatcher.js +80 -0
  222. patchright/driver/package/lib/server/dispatchers/jsonPipeDispatcher.js +58 -0
  223. patchright/driver/package/lib/server/dispatchers/localUtilsDispatcher.js +155 -0
  224. patchright/driver/package/lib/server/dispatchers/networkDispatchers.js +204 -0
  225. patchright/driver/package/lib/server/dispatchers/pageDispatcher.js +328 -0
  226. patchright/driver/package/lib/server/dispatchers/playwrightDispatcher.js +100 -0
  227. patchright/driver/package/lib/server/dispatchers/selectorsDispatcher.js +40 -0
  228. patchright/driver/package/lib/server/dispatchers/streamDispatcher.js +60 -0
  229. patchright/driver/package/lib/server/dispatchers/tracingDispatcher.js +59 -0
  230. patchright/driver/package/lib/server/dispatchers/webSocketRouteDispatcher.js +154 -0
  231. patchright/driver/package/lib/server/dispatchers/writableStreamDispatcher.js +73 -0
  232. patchright/driver/package/lib/server/dom.js +869 -0
  233. patchright/driver/package/lib/server/download.js +70 -0
  234. patchright/driver/package/lib/server/electron/electron.js +277 -0
  235. patchright/driver/package/lib/server/electron/loader.js +29 -0
  236. patchright/driver/package/lib/server/errors.js +69 -0
  237. patchright/driver/package/lib/server/fetch.js +640 -0
  238. patchright/driver/package/lib/server/fileChooser.js +43 -0
  239. patchright/driver/package/lib/server/fileUploadUtils.js +84 -0
  240. patchright/driver/package/lib/server/firefox/ffAccessibility.js +238 -0
  241. patchright/driver/package/lib/server/firefox/ffBrowser.js +404 -0
  242. patchright/driver/package/lib/server/firefox/ffConnection.js +147 -0
  243. patchright/driver/package/lib/server/firefox/ffExecutionContext.js +149 -0
  244. patchright/driver/package/lib/server/firefox/ffInput.js +159 -0
  245. patchright/driver/package/lib/server/firefox/ffNetworkManager.js +254 -0
  246. patchright/driver/package/lib/server/firefox/ffPage.js +501 -0
  247. patchright/driver/package/lib/server/firefox/firefox.js +106 -0
  248. patchright/driver/package/lib/server/firefox/protocol.d.js +16 -0
  249. patchright/driver/package/lib/server/formData.js +147 -0
  250. patchright/driver/package/lib/server/frameSelectors.js +274 -0
  251. patchright/driver/package/lib/server/frames.js +1834 -0
  252. patchright/driver/package/lib/server/har/harRecorder.js +147 -0
  253. patchright/driver/package/lib/server/har/harTracer.js +606 -0
  254. patchright/driver/package/lib/server/harBackend.js +157 -0
  255. patchright/driver/package/lib/server/helper.js +100 -0
  256. patchright/driver/package/lib/server/index.js +61 -0
  257. patchright/driver/package/lib/server/input.js +280 -0
  258. patchright/driver/package/lib/server/instrumentation.js +75 -0
  259. patchright/driver/package/lib/server/javascript.js +315 -0
  260. patchright/driver/package/lib/server/launchApp.js +110 -0
  261. patchright/driver/package/lib/server/localUtils.js +211 -0
  262. patchright/driver/package/lib/server/macEditingCommands.js +143 -0
  263. patchright/driver/package/lib/server/network.js +583 -0
  264. patchright/driver/package/lib/server/page.js +775 -0
  265. patchright/driver/package/lib/server/pageBinding.js +88 -0
  266. patchright/driver/package/lib/server/pipeTransport.js +89 -0
  267. patchright/driver/package/lib/server/playwright.js +81 -0
  268. patchright/driver/package/lib/server/progress.js +104 -0
  269. patchright/driver/package/lib/server/protocolError.js +52 -0
  270. patchright/driver/package/lib/server/recorder/chat.js +161 -0
  271. patchright/driver/package/lib/server/recorder/contextRecorder.js +286 -0
  272. patchright/driver/package/lib/server/recorder/recorderApp.js +184 -0
  273. patchright/driver/package/lib/server/recorder/recorderCollection.js +116 -0
  274. patchright/driver/package/lib/server/recorder/recorderFrontend.js +16 -0
  275. patchright/driver/package/lib/server/recorder/recorderRunner.js +135 -0
  276. patchright/driver/package/lib/server/recorder/recorderUtils.js +100 -0
  277. patchright/driver/package/lib/server/recorder/throttledFile.js +57 -0
  278. patchright/driver/package/lib/server/recorder.js +360 -0
  279. patchright/driver/package/lib/server/registry/browserFetcher.js +175 -0
  280. patchright/driver/package/lib/server/registry/dependencies.js +371 -0
  281. patchright/driver/package/lib/server/registry/index.js +1271 -0
  282. patchright/driver/package/lib/server/registry/nativeDeps.js +1105 -0
  283. patchright/driver/package/lib/server/registry/oopDownloadBrowserMain.js +120 -0
  284. patchright/driver/package/lib/server/screenshotter.js +332 -0
  285. patchright/driver/package/lib/server/selectors.js +112 -0
  286. patchright/driver/package/lib/server/socksClientCertificatesInterceptor.js +321 -0
  287. patchright/driver/package/lib/server/socksInterceptor.js +95 -0
  288. patchright/driver/package/lib/server/storageScript.js +154 -0
  289. patchright/driver/package/lib/server/timeoutSettings.js +89 -0
  290. patchright/driver/package/lib/server/trace/recorder/snapshotter.js +143 -0
  291. patchright/driver/package/lib/server/trace/recorder/snapshotterInjected.js +539 -0
  292. patchright/driver/package/lib/server/trace/recorder/tracing.js +593 -0
  293. patchright/driver/package/lib/server/trace/test/inMemorySnapshotter.js +87 -0
  294. patchright/driver/package/lib/server/trace/viewer/traceViewer.js +249 -0
  295. patchright/driver/package/lib/server/transport.js +183 -0
  296. patchright/driver/package/lib/server/types.js +28 -0
  297. patchright/driver/package/lib/server/usKeyboardLayout.js +145 -0
  298. patchright/driver/package/lib/server/utils/ascii.js +44 -0
  299. patchright/driver/package/lib/server/utils/comparators.js +161 -0
  300. patchright/driver/package/lib/server/utils/crypto.js +216 -0
  301. patchright/driver/package/lib/server/utils/debug.js +47 -0
  302. patchright/driver/package/lib/server/utils/debugLogger.js +114 -0
  303. patchright/driver/package/lib/server/utils/env.js +68 -0
  304. patchright/driver/package/lib/server/utils/eventsHelper.js +39 -0
  305. patchright/driver/package/lib/server/utils/expectUtils.js +38 -0
  306. patchright/driver/package/lib/server/utils/fileUtils.js +191 -0
  307. patchright/driver/package/lib/server/utils/happyEyeballs.js +207 -0
  308. patchright/driver/package/lib/server/utils/hostPlatform.js +109 -0
  309. patchright/driver/package/lib/server/utils/httpServer.js +218 -0
  310. patchright/driver/package/lib/server/utils/image_tools/colorUtils.js +89 -0
  311. patchright/driver/package/lib/server/utils/image_tools/compare.js +109 -0
  312. patchright/driver/package/lib/server/utils/image_tools/imageChannel.js +78 -0
  313. patchright/driver/package/lib/server/utils/image_tools/stats.js +102 -0
  314. patchright/driver/package/lib/server/utils/linuxUtils.js +71 -0
  315. patchright/driver/package/lib/server/utils/network.js +217 -0
  316. patchright/driver/package/lib/server/utils/nodePlatform.js +148 -0
  317. patchright/driver/package/lib/server/utils/pipeTransport.js +84 -0
  318. patchright/driver/package/lib/server/utils/processLauncher.js +238 -0
  319. patchright/driver/package/lib/server/utils/profiler.js +65 -0
  320. patchright/driver/package/lib/server/utils/socksProxy.js +511 -0
  321. patchright/driver/package/lib/server/utils/spawnAsync.js +41 -0
  322. patchright/driver/package/lib/server/utils/task.js +51 -0
  323. patchright/driver/package/lib/server/utils/userAgent.js +98 -0
  324. patchright/driver/package/lib/server/utils/wsServer.js +132 -0
  325. patchright/driver/package/lib/server/utils/zipFile.js +74 -0
  326. patchright/driver/package/lib/server/utils/zones.js +57 -0
  327. patchright/driver/package/lib/server/webkit/protocol.d.js +16 -0
  328. patchright/driver/package/lib/server/webkit/webkit.js +100 -0
  329. patchright/driver/package/lib/server/webkit/wkAccessibility.js +237 -0
  330. patchright/driver/package/lib/server/webkit/wkBrowser.js +312 -0
  331. patchright/driver/package/lib/server/webkit/wkConnection.js +149 -0
  332. patchright/driver/package/lib/server/webkit/wkExecutionContext.js +153 -0
  333. patchright/driver/package/lib/server/webkit/wkInput.js +181 -0
  334. patchright/driver/package/lib/server/webkit/wkInterceptableRequest.js +169 -0
  335. patchright/driver/package/lib/server/webkit/wkPage.js +1114 -0
  336. patchright/driver/package/lib/server/webkit/wkProvisionalPage.js +83 -0
  337. patchright/driver/package/lib/server/webkit/wkWorkers.js +104 -0
  338. patchright/driver/package/lib/third_party/pixelmatch.js +255 -0
  339. patchright/driver/package/lib/utils/isomorphic/ariaSnapshot.js +384 -0
  340. patchright/driver/package/lib/utils/isomorphic/assert.js +31 -0
  341. patchright/driver/package/lib/utils/isomorphic/builtins.js +86 -0
  342. patchright/driver/package/lib/utils/isomorphic/colors.js +72 -0
  343. patchright/driver/package/lib/utils/isomorphic/cssParser.js +246 -0
  344. patchright/driver/package/lib/utils/isomorphic/cssTokenizer.js +1051 -0
  345. patchright/driver/package/lib/utils/isomorphic/headers.js +53 -0
  346. patchright/driver/package/lib/utils/isomorphic/locatorGenerators.js +655 -0
  347. patchright/driver/package/lib/utils/isomorphic/locatorParser.js +176 -0
  348. patchright/driver/package/lib/utils/isomorphic/locatorUtils.js +81 -0
  349. patchright/driver/package/lib/utils/isomorphic/manualPromise.js +115 -0
  350. patchright/driver/package/lib/utils/isomorphic/mimeType.js +460 -0
  351. patchright/driver/package/lib/utils/isomorphic/multimap.js +81 -0
  352. patchright/driver/package/lib/utils/isomorphic/rtti.js +43 -0
  353. patchright/driver/package/lib/utils/isomorphic/selectorParser.js +387 -0
  354. patchright/driver/package/lib/utils/isomorphic/semaphore.js +54 -0
  355. patchright/driver/package/lib/utils/isomorphic/stackTrace.js +158 -0
  356. patchright/driver/package/lib/utils/isomorphic/stringUtils.js +176 -0
  357. patchright/driver/package/lib/utils/isomorphic/time.js +44 -0
  358. patchright/driver/package/lib/utils/isomorphic/timeoutRunner.js +67 -0
  359. patchright/driver/package/lib/utils/isomorphic/traceUtils.js +59 -0
  360. patchright/driver/package/lib/utils/isomorphic/types.js +16 -0
  361. patchright/driver/package/lib/utils/isomorphic/urlMatch.js +167 -0
  362. patchright/driver/package/lib/utils/isomorphic/utilityScriptSerializers.js +248 -0
  363. patchright/driver/package/lib/utils.js +101 -0
  364. patchright/driver/package/lib/utilsBundle.js +106 -0
  365. patchright/driver/package/lib/utilsBundleImpl/index.js +208 -0
  366. patchright/driver/package/lib/utilsBundleImpl/xdg-open +1066 -0
  367. patchright/driver/package/lib/zipBundle.js +34 -0
  368. patchright/driver/package/lib/zipBundleImpl.js +5 -0
  369. patchright/driver/package/package.json +44 -0
  370. patchright/driver/package/protocol.yml +3313 -0
  371. patchright/py.typed +0 -0
  372. patchright/sync_api/__init__.py +179 -0
  373. patchright/sync_api/_context_manager.py +74 -0
  374. patchright/sync_api/_generated.py +20632 -0
  375. pure_patchright-1.52.5.dist-info/LICENSE +201 -0
  376. pure_patchright-1.52.5.dist-info/METADATA +96 -0
  377. pure_patchright-1.52.5.dist-info/RECORD +381 -0
  378. pure_patchright-1.52.5.dist-info/WHEEL +4 -0
  379. pure_patchright-1.52.5.dist-info/entry_points.txt +5 -0
  380. pure_patchright-1.52.5.dist-info/licenses/LICENSE +202 -0
  381. pure_patchright-1.52.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,743 @@
1
+ import asyncio
2
+ import json
3
+ from pathlib import Path
4
+ from types import SimpleNamespace
5
+ from typing import (
6
+ TYPE_CHECKING,
7
+ Any,
8
+ Callable,
9
+ Dict,
10
+ List,
11
+ Literal,
12
+ Optional,
13
+ Pattern,
14
+ Sequence,
15
+ Set,
16
+ Union,
17
+ cast,
18
+ )
19
+ from patchright._impl._api_structures import (
20
+ Cookie,
21
+ Geolocation,
22
+ SetCookieParam,
23
+ StorageState,
24
+ )
25
+ from patchright._impl._artifact import Artifact
26
+ from patchright._impl._cdp_session import CDPSession
27
+ from patchright._impl._clock import Clock
28
+ from patchright._impl._connection import (
29
+ ChannelOwner,
30
+ from_channel,
31
+ from_nullable_channel,
32
+ )
33
+ from patchright._impl._console_message import ConsoleMessage
34
+ from patchright._impl._dialog import Dialog
35
+ from patchright._impl._errors import Error, TargetClosedError
36
+ from patchright._impl._event_context_manager import EventContextManagerImpl
37
+ from patchright._impl._fetch import APIRequestContext
38
+ from patchright._impl._frame import Frame
39
+ from patchright._impl._har_router import HarRouter
40
+ from patchright._impl._helper import (
41
+ HarContentPolicy,
42
+ HarMode,
43
+ HarRecordingMetadata,
44
+ RouteFromHarNotFoundPolicy,
45
+ RouteHandler,
46
+ RouteHandlerCallback,
47
+ TimeoutSettings,
48
+ URLMatch,
49
+ WebSocketRouteHandlerCallback,
50
+ async_readfile,
51
+ async_writefile,
52
+ locals_to_params,
53
+ parse_error,
54
+ prepare_record_har_options,
55
+ to_impl,
56
+ )
57
+ from patchright._impl._network import (
58
+ Request,
59
+ Response,
60
+ Route,
61
+ WebSocketRoute,
62
+ WebSocketRouteHandler,
63
+ serialize_headers,
64
+ )
65
+ from patchright._impl._page import BindingCall, Page, Worker
66
+ from patchright._impl._str_utils import escape_regex_flags
67
+ from patchright._impl._tracing import Tracing
68
+ from patchright._impl._waiter import Waiter
69
+ from patchright._impl._web_error import WebError
70
+
71
+ if TYPE_CHECKING:
72
+ from patchright._impl._browser import Browser
73
+
74
+
75
+ class BrowserContext(ChannelOwner):
76
+ Events = SimpleNamespace(
77
+ BackgroundPage="backgroundpage",
78
+ Close="close",
79
+ Console="console",
80
+ Dialog="dialog",
81
+ Page="page",
82
+ WebError="weberror",
83
+ ServiceWorker="serviceworker",
84
+ Request="request",
85
+ Response="response",
86
+ RequestFailed="requestfailed",
87
+ RequestFinished="requestfinished",
88
+ )
89
+
90
+ def __init__(
91
+ self, parent: ChannelOwner, type: str, guid: str, initializer: Dict
92
+ ) -> None:
93
+ super().__init__(parent, type, guid, initializer)
94
+ self._browser: Optional["Browser"] = None
95
+ if parent.__class__.__name__ == "Browser":
96
+ self._browser = cast("Browser", parent)
97
+ self._browser._contexts.append(self)
98
+ self._pages: List[Page] = []
99
+ self._routes: List[RouteHandler] = []
100
+ self._web_socket_routes: List[WebSocketRouteHandler] = []
101
+ self._bindings: Dict[str, Any] = {}
102
+ self._timeout_settings = TimeoutSettings(None)
103
+ self._owner_page: Optional[Page] = None
104
+ self._options: Dict[str, Any] = {}
105
+ self._background_pages: Set[Page] = set()
106
+ self._service_workers: Set[Worker] = set()
107
+ self._tracing = cast(Tracing, from_channel(initializer["tracing"]))
108
+ self._har_recorders: Dict[str, HarRecordingMetadata] = {}
109
+ self._request: APIRequestContext = from_channel(initializer["requestContext"])
110
+ self._clock = Clock(self)
111
+ self._channel.on(
112
+ "bindingCall",
113
+ lambda params: self._on_binding(from_channel(params["binding"])),
114
+ )
115
+ self._channel.on("close", lambda _: self._on_close())
116
+ self._channel.on(
117
+ "page", lambda params: self._on_page(from_channel(params["page"]))
118
+ )
119
+ self._channel.on(
120
+ "route",
121
+ lambda params: self._loop.create_task(
122
+ self._on_route(from_channel(params.get("route")))
123
+ ),
124
+ )
125
+ self._channel.on(
126
+ "webSocketRoute",
127
+ lambda params: self._loop.create_task(
128
+ self._on_web_socket_route(from_channel(params["webSocketRoute"]))
129
+ ),
130
+ )
131
+ self._channel.on(
132
+ "backgroundPage",
133
+ lambda params: self._on_background_page(from_channel(params["page"])),
134
+ )
135
+ self._channel.on(
136
+ "serviceWorker",
137
+ lambda params: self._on_service_worker(from_channel(params["worker"])),
138
+ )
139
+ self._channel.on("console", lambda event: self._on_console_message(event))
140
+ self._channel.on(
141
+ "dialog", lambda params: self._on_dialog(from_channel(params["dialog"]))
142
+ )
143
+ self._channel.on(
144
+ "pageError",
145
+ lambda params: self._on_page_error(
146
+ parse_error(params["error"]["error"]),
147
+ from_nullable_channel(params["page"]),
148
+ ),
149
+ )
150
+ self._channel.on(
151
+ "request",
152
+ lambda params: self._on_request(
153
+ from_channel(params["request"]),
154
+ from_nullable_channel(params.get("page")),
155
+ ),
156
+ )
157
+ self._channel.on(
158
+ "response",
159
+ lambda params: self._on_response(
160
+ from_channel(params["response"]),
161
+ from_nullable_channel(params.get("page")),
162
+ ),
163
+ )
164
+ self._channel.on(
165
+ "requestFailed",
166
+ lambda params: self._on_request_failed(
167
+ from_channel(params["request"]),
168
+ params["responseEndTiming"],
169
+ params.get("failureText"),
170
+ from_nullable_channel(params.get("page")),
171
+ ),
172
+ )
173
+ self._channel.on(
174
+ "requestFinished",
175
+ lambda params: self._on_request_finished(
176
+ from_channel(params["request"]),
177
+ from_nullable_channel(params.get("response")),
178
+ params["responseEndTiming"],
179
+ from_nullable_channel(params.get("page")),
180
+ ),
181
+ )
182
+ self._closed_future: asyncio.Future = asyncio.Future()
183
+ self.once(
184
+ self.Events.Close, lambda context: self._closed_future.set_result(True)
185
+ )
186
+ self._close_reason: Optional[str] = None
187
+ self._har_routers: List[HarRouter] = []
188
+ self._set_event_to_subscription_mapping(
189
+ {
190
+ BrowserContext.Events.Console: "console",
191
+ BrowserContext.Events.Dialog: "dialog",
192
+ BrowserContext.Events.Request: "request",
193
+ BrowserContext.Events.Response: "response",
194
+ BrowserContext.Events.RequestFinished: "requestFinished",
195
+ BrowserContext.Events.RequestFailed: "requestFailed",
196
+ }
197
+ )
198
+ self._close_was_called = False
199
+
200
+ def __repr__(self) -> str:
201
+ return f"<BrowserContext browser={self.browser}>"
202
+
203
+ def _on_page(self, page: Page) -> None:
204
+ self._pages.append(page)
205
+ self.emit(BrowserContext.Events.Page, page)
206
+ if page._opener and (not page._opener.is_closed()):
207
+ page._opener.emit(Page.Events.Popup, page)
208
+
209
+ async def _on_route(self, route: Route) -> None:
210
+ route._context = self
211
+ page = route.request._safe_page()
212
+ route_handlers = self._routes.copy()
213
+ for route_handler in route_handlers:
214
+ if page and page._close_was_called or self._close_was_called:
215
+ return
216
+ if not route_handler.matches(route.request.url):
217
+ continue
218
+ if route_handler not in self._routes:
219
+ continue
220
+ if route_handler.will_expire:
221
+ self._routes.remove(route_handler)
222
+ try:
223
+ handled = await route_handler.handle(route)
224
+ finally:
225
+ if len(self._routes) == 0:
226
+ asyncio.create_task(
227
+ self._connection.wrap_api_call(
228
+ lambda: self._update_interception_patterns(), True
229
+ )
230
+ )
231
+ if handled:
232
+ return
233
+ try:
234
+ await route._inner_continue(True)
235
+ except Exception:
236
+ pass
237
+
238
+ async def _on_web_socket_route(self, web_socket_route: WebSocketRoute) -> None:
239
+ route_handler = next(
240
+ (
241
+ route_handler
242
+ for route_handler in self._web_socket_routes
243
+ if route_handler.matches(web_socket_route.url)
244
+ ),
245
+ None,
246
+ )
247
+ if route_handler:
248
+ await route_handler.handle(web_socket_route)
249
+ else:
250
+ web_socket_route.connect_to_server()
251
+
252
+ def _on_binding(self, binding_call: BindingCall) -> None:
253
+ func = self._bindings.get(binding_call._initializer["name"])
254
+ if func is None:
255
+ return
256
+ asyncio.create_task(binding_call.call(func))
257
+
258
+ def set_default_navigation_timeout(self, timeout: float) -> None:
259
+ return self._set_default_navigation_timeout_impl(timeout)
260
+
261
+ def _set_default_navigation_timeout_impl(self, timeout: Optional[float]) -> None:
262
+ self._timeout_settings.set_default_navigation_timeout(timeout)
263
+ self._channel.send_no_reply(
264
+ "setDefaultNavigationTimeoutNoReply",
265
+ {} if timeout is None else {"timeout": timeout},
266
+ )
267
+
268
+ def set_default_timeout(self, timeout: float) -> None:
269
+ return self._set_default_timeout_impl(timeout)
270
+
271
+ def _set_default_timeout_impl(self, timeout: Optional[float]) -> None:
272
+ self._timeout_settings.set_default_timeout(timeout)
273
+ self._channel.send_no_reply(
274
+ "setDefaultTimeoutNoReply", {} if timeout is None else {"timeout": timeout}
275
+ )
276
+
277
+ @property
278
+ def pages(self) -> List[Page]:
279
+ return self._pages.copy()
280
+
281
+ @property
282
+ def browser(self) -> Optional["Browser"]:
283
+ return self._browser
284
+
285
+ def _set_options(self, context_options: Dict, browser_options: Dict) -> None:
286
+ self._options = context_options
287
+ if self._options.get("recordHar"):
288
+ self._har_recorders[""] = {
289
+ "path": self._options["recordHar"]["path"],
290
+ "content": self._options["recordHar"].get("content"),
291
+ }
292
+ self._tracing._traces_dir = browser_options.get("tracesDir")
293
+
294
+ async def new_page(self) -> Page:
295
+ if self._owner_page:
296
+ raise Error("Please use browser.new_context()")
297
+ return from_channel(await self._channel.send("newPage"))
298
+
299
+ async def cookies(self, urls: Union[str, Sequence[str]] = None) -> List[Cookie]:
300
+ if urls is None:
301
+ urls = []
302
+ if isinstance(urls, str):
303
+ urls = [urls]
304
+ return await self._channel.send("cookies", dict(urls=urls))
305
+
306
+ async def add_cookies(self, cookies: Sequence[SetCookieParam]) -> None:
307
+ await self._channel.send("addCookies", dict(cookies=cookies))
308
+
309
+ async def clear_cookies(
310
+ self,
311
+ name: Union[str, Pattern[str]] = None,
312
+ domain: Union[str, Pattern[str]] = None,
313
+ path: Union[str, Pattern[str]] = None,
314
+ ) -> None:
315
+ await self._channel.send(
316
+ "clearCookies",
317
+ {
318
+ "name": name if isinstance(name, str) else None,
319
+ "nameRegexSource": name.pattern if isinstance(name, Pattern) else None,
320
+ "nameRegexFlags": (
321
+ escape_regex_flags(name) if isinstance(name, Pattern) else None
322
+ ),
323
+ "domain": domain if isinstance(domain, str) else None,
324
+ "domainRegexSource": (
325
+ domain.pattern if isinstance(domain, Pattern) else None
326
+ ),
327
+ "domainRegexFlags": (
328
+ escape_regex_flags(domain) if isinstance(domain, Pattern) else None
329
+ ),
330
+ "path": path if isinstance(path, str) else None,
331
+ "pathRegexSource": path.pattern if isinstance(path, Pattern) else None,
332
+ "pathRegexFlags": (
333
+ escape_regex_flags(path) if isinstance(path, Pattern) else None
334
+ ),
335
+ },
336
+ )
337
+
338
+ async def grant_permissions(
339
+ self, permissions: Sequence[str], origin: str = None
340
+ ) -> None:
341
+ await self._channel.send("grantPermissions", locals_to_params(locals()))
342
+
343
+ async def clear_permissions(self) -> None:
344
+ await self._channel.send("clearPermissions")
345
+
346
+ async def set_geolocation(self, geolocation: Geolocation = None) -> None:
347
+ await self._channel.send("setGeolocation", locals_to_params(locals()))
348
+
349
+ async def set_extra_http_headers(self, headers: Dict[str, str]) -> None:
350
+ await self._channel.send(
351
+ "setExtraHTTPHeaders", dict(headers=serialize_headers(headers))
352
+ )
353
+
354
+ async def set_offline(self, offline: bool) -> None:
355
+ await self._channel.send("setOffline", dict(offline=offline))
356
+
357
+ async def add_init_script(
358
+ self, script: str = None, path: Union[str, Path] = None
359
+ ) -> None:
360
+ await self.install_inject_route()
361
+ if path:
362
+ script = (await async_readfile(path)).decode()
363
+ if not isinstance(script, str):
364
+ raise Error("Either path or script parameter must be specified")
365
+ await self._channel.send("addInitScript", dict(source=script))
366
+
367
+ async def expose_binding(
368
+ self, name: str, callback: Callable, handle: bool = None
369
+ ) -> None:
370
+ await self.install_inject_route()
371
+ for page in self._pages:
372
+ if name in page._bindings:
373
+ raise Error(
374
+ f'Function "{name}" has been already registered in one of the pages'
375
+ )
376
+ if name in self._bindings:
377
+ raise Error(f'Function "{name}" has been already registered')
378
+ self._bindings[name] = callback
379
+ await self._channel.send(
380
+ "exposeBinding", dict(name=name, needsHandle=handle or False)
381
+ )
382
+
383
+ async def expose_function(self, name: str, callback: Callable) -> None:
384
+ await self.expose_binding(name, lambda source, *args: callback(*args))
385
+
386
+ async def route(
387
+ self, url: URLMatch, handler: RouteHandlerCallback, times: int = None
388
+ ) -> None:
389
+ self._routes.insert(
390
+ 0,
391
+ RouteHandler(
392
+ self._options.get("baseURL"),
393
+ url,
394
+ handler,
395
+ True if self._dispatcher_fiber else False,
396
+ times,
397
+ ),
398
+ )
399
+ await self._update_interception_patterns()
400
+
401
+ async def unroute(
402
+ self, url: URLMatch, handler: Optional[RouteHandlerCallback] = None
403
+ ) -> None:
404
+ removed = []
405
+ remaining = []
406
+ for route in self._routes:
407
+ if route.url != url or (handler and route.handler != handler):
408
+ remaining.append(route)
409
+ else:
410
+ removed.append(route)
411
+ await self._unroute_internal(removed, remaining, "default")
412
+
413
+ async def _unroute_internal(
414
+ self,
415
+ removed: List[RouteHandler],
416
+ remaining: List[RouteHandler],
417
+ behavior: Literal["default", "ignoreErrors", "wait"] = None,
418
+ ) -> None:
419
+ self._routes = remaining
420
+ await self._update_interception_patterns()
421
+ if behavior is None or behavior == "default":
422
+ return
423
+ await asyncio.gather(*map(lambda router: router.stop(behavior), removed))
424
+
425
+ async def route_web_socket(
426
+ self, url: URLMatch, handler: WebSocketRouteHandlerCallback
427
+ ) -> None:
428
+ self._web_socket_routes.insert(
429
+ 0, WebSocketRouteHandler(self._options.get("baseURL"), url, handler)
430
+ )
431
+ await self._update_web_socket_interception_patterns()
432
+
433
+ def _dispose_har_routers(self) -> None:
434
+ for router in self._har_routers:
435
+ router.dispose()
436
+ self._har_routers = []
437
+
438
+ async def unroute_all(
439
+ self, behavior: Literal["default", "ignoreErrors", "wait"] = None
440
+ ) -> None:
441
+ await self._unroute_internal(self._routes, [], behavior)
442
+ self._dispose_har_routers()
443
+
444
+ async def _record_into_har(
445
+ self,
446
+ har: Union[Path, str],
447
+ page: Optional[Page] = None,
448
+ url: Union[Pattern[str], str] = None,
449
+ update_content: HarContentPolicy = None,
450
+ update_mode: HarMode = None,
451
+ ) -> None:
452
+ params: Dict[str, Any] = {
453
+ "options": prepare_record_har_options(
454
+ {
455
+ "recordHarPath": har,
456
+ "recordHarContent": update_content or "attach",
457
+ "recordHarMode": update_mode or "minimal",
458
+ "recordHarUrlFilter": url,
459
+ }
460
+ )
461
+ }
462
+ if page:
463
+ params["page"] = page._channel
464
+ har_id = await self._channel.send("harStart", params)
465
+ self._har_recorders[har_id] = {
466
+ "path": str(har),
467
+ "content": update_content or "attach",
468
+ }
469
+
470
+ async def route_from_har(
471
+ self,
472
+ har: Union[Path, str],
473
+ url: Union[Pattern[str], str] = None,
474
+ notFound: RouteFromHarNotFoundPolicy = None,
475
+ update: bool = None,
476
+ updateContent: Literal["attach", "embed"] = None,
477
+ updateMode: HarMode = None,
478
+ ) -> None:
479
+ if update:
480
+ await self._record_into_har(
481
+ har=har,
482
+ page=None,
483
+ url=url,
484
+ update_content=updateContent,
485
+ update_mode=updateMode,
486
+ )
487
+ return
488
+ router = await HarRouter.create(
489
+ local_utils=self._connection.local_utils,
490
+ file=str(har),
491
+ not_found_action=notFound or "abort",
492
+ url_matcher=url,
493
+ )
494
+ self._har_routers.append(router)
495
+ await router.add_context_route(self)
496
+
497
+ async def _update_interception_patterns(self) -> None:
498
+ patterns = RouteHandler.prepare_interception_patterns(self._routes)
499
+ await self._channel.send(
500
+ "setNetworkInterceptionPatterns", {"patterns": patterns}
501
+ )
502
+
503
+ async def _update_web_socket_interception_patterns(self) -> None:
504
+ patterns = WebSocketRouteHandler.prepare_interception_patterns(
505
+ self._web_socket_routes
506
+ )
507
+ await self._channel.send(
508
+ "setWebSocketInterceptionPatterns", {"patterns": patterns}
509
+ )
510
+
511
+ def expect_event(
512
+ self, event: str, predicate: Callable = None, timeout: float = None
513
+ ) -> EventContextManagerImpl:
514
+ if timeout is None:
515
+ timeout = self._timeout_settings.timeout()
516
+ waiter = Waiter(self, f"browser_context.expect_event({event})")
517
+ waiter.reject_on_timeout(
518
+ timeout, f'Timeout {timeout}ms exceeded while waiting for event "{event}"'
519
+ )
520
+ if event != BrowserContext.Events.Close:
521
+ waiter.reject_on_event(
522
+ self, BrowserContext.Events.Close, lambda: TargetClosedError()
523
+ )
524
+ waiter.wait_for_event(self, event, predicate)
525
+ return EventContextManagerImpl(waiter.result())
526
+
527
+ def _on_close(self) -> None:
528
+ if self._browser:
529
+ self._browser._contexts.remove(self)
530
+ self._dispose_har_routers()
531
+ self._tracing._reset_stack_counter()
532
+ self.emit(BrowserContext.Events.Close, self)
533
+
534
+ async def close(self, reason: str = None) -> None:
535
+ if self._close_was_called:
536
+ return
537
+ self._close_reason = reason
538
+ self._close_was_called = True
539
+ await self._channel._connection.wrap_api_call(
540
+ lambda: self.request.dispose(reason=reason), True
541
+ )
542
+
543
+ async def _inner_close() -> None:
544
+ for har_id, params in self._har_recorders.items():
545
+ har = cast(
546
+ Artifact,
547
+ from_channel(
548
+ await self._channel.send("harExport", {"harId": har_id})
549
+ ),
550
+ )
551
+ is_compressed = params.get("content") == "attach" or params[
552
+ "path"
553
+ ].endswith(".zip")
554
+ need_compressed = params["path"].endswith(".zip")
555
+ if is_compressed and (not need_compressed):
556
+ tmp_path = params["path"] + ".tmp"
557
+ await har.save_as(tmp_path)
558
+ await self._connection.local_utils.har_unzip(
559
+ zipFile=tmp_path, harFile=params["path"]
560
+ )
561
+ else:
562
+ await har.save_as(params["path"])
563
+ await har.delete()
564
+
565
+ await self._channel._connection.wrap_api_call(_inner_close, True)
566
+ await self._channel.send("close", {"reason": reason})
567
+ await self._closed_future
568
+
569
+ async def storage_state(
570
+ self, path: Union[str, Path] = None, indexedDB: bool = None
571
+ ) -> StorageState:
572
+ result = await self._channel.send_return_as_dict(
573
+ "storageState", {"indexedDB": indexedDB}
574
+ )
575
+ if path:
576
+ await async_writefile(path, json.dumps(result))
577
+ return result
578
+
579
+ def _effective_close_reason(self) -> Optional[str]:
580
+ if self._close_reason:
581
+ return self._close_reason
582
+ if self._browser:
583
+ return self._browser._close_reason
584
+ return None
585
+
586
+ async def wait_for_event(
587
+ self, event: str, predicate: Callable = None, timeout: float = None
588
+ ) -> Any:
589
+ async with self.expect_event(event, predicate, timeout) as event_info:
590
+ pass
591
+ return await event_info
592
+
593
+ def expect_console_message(
594
+ self, predicate: Callable[[ConsoleMessage], bool] = None, timeout: float = None
595
+ ) -> EventContextManagerImpl[ConsoleMessage]:
596
+ return self.expect_event(Page.Events.Console, predicate, timeout)
597
+
598
+ def expect_page(
599
+ self, predicate: Callable[[Page], bool] = None, timeout: float = None
600
+ ) -> EventContextManagerImpl[Page]:
601
+ return self.expect_event(BrowserContext.Events.Page, predicate, timeout)
602
+
603
+ def _on_background_page(self, page: Page) -> None:
604
+ self._background_pages.add(page)
605
+ self.emit(BrowserContext.Events.BackgroundPage, page)
606
+
607
+ def _on_service_worker(self, worker: Worker) -> None:
608
+ worker._context = self
609
+ self._service_workers.add(worker)
610
+ self.emit(BrowserContext.Events.ServiceWorker, worker)
611
+
612
+ def _on_request_failed(
613
+ self,
614
+ request: Request,
615
+ response_end_timing: float,
616
+ failure_text: Optional[str],
617
+ page: Optional[Page],
618
+ ) -> None:
619
+ request._failure_text = failure_text
620
+ request._set_response_end_timing(response_end_timing)
621
+ self.emit(BrowserContext.Events.RequestFailed, request)
622
+ if page:
623
+ page.emit(Page.Events.RequestFailed, request)
624
+
625
+ def _on_request_finished(
626
+ self,
627
+ request: Request,
628
+ response: Optional[Response],
629
+ response_end_timing: float,
630
+ page: Optional[Page],
631
+ ) -> None:
632
+ request._set_response_end_timing(response_end_timing)
633
+ self.emit(BrowserContext.Events.RequestFinished, request)
634
+ if page:
635
+ page.emit(Page.Events.RequestFinished, request)
636
+ if response:
637
+ response._finished_future.set_result(True)
638
+
639
+ def _on_console_message(self, event: Dict) -> None:
640
+ message = ConsoleMessage(event, self._loop, self._dispatcher_fiber)
641
+ self.emit(BrowserContext.Events.Console, message)
642
+ page = message.page
643
+ if page:
644
+ page.emit(Page.Events.Console, message)
645
+
646
+ def _on_dialog(self, dialog: Dialog) -> None:
647
+ has_listeners = self.emit(BrowserContext.Events.Dialog, dialog)
648
+ page = dialog.page
649
+ if page:
650
+ has_listeners = page.emit(Page.Events.Dialog, dialog) or has_listeners
651
+ if not has_listeners:
652
+ if dialog.type == "beforeunload":
653
+ asyncio.create_task(dialog.accept())
654
+ else:
655
+ asyncio.create_task(dialog.dismiss())
656
+
657
+ def _on_page_error(self, error: Error, page: Optional[Page]) -> None:
658
+ self.emit(
659
+ BrowserContext.Events.WebError,
660
+ WebError(self._loop, self._dispatcher_fiber, page, error),
661
+ )
662
+ if page:
663
+ page.emit(Page.Events.PageError, error)
664
+
665
+ def _on_request(self, request: Request, page: Optional[Page]) -> None:
666
+ self.emit(BrowserContext.Events.Request, request)
667
+ if page:
668
+ page.emit(Page.Events.Request, request)
669
+
670
+ def _on_response(self, response: Response, page: Optional[Page]) -> None:
671
+ self.emit(BrowserContext.Events.Response, response)
672
+ if page:
673
+ page.emit(Page.Events.Response, response)
674
+
675
+ @property
676
+ def background_pages(self) -> List[Page]:
677
+ return list(self._background_pages)
678
+
679
+ @property
680
+ def service_workers(self) -> List[Worker]:
681
+ return list(self._service_workers)
682
+
683
+ async def new_cdp_session(self, page: Union[Page, Frame]) -> CDPSession:
684
+ page = to_impl(page)
685
+ params = {}
686
+ if isinstance(page, Page):
687
+ params["page"] = page._channel
688
+ elif isinstance(page, Frame):
689
+ params["frame"] = page._channel
690
+ else:
691
+ raise Error("page: expected Page or Frame")
692
+ return from_channel(await self._channel.send("newCDPSession", params))
693
+
694
+ @property
695
+ def tracing(self) -> Tracing:
696
+ return self._tracing
697
+
698
+ @property
699
+ def request(self) -> "APIRequestContext":
700
+ return self._request
701
+
702
+ @property
703
+ def clock(self) -> Clock:
704
+ return self._clock
705
+
706
+ route_injecting = False
707
+
708
+ async def install_inject_route(self) -> None:
709
+ from patchright._impl._impl_to_api_mapping import ImplToApiMapping
710
+
711
+ mapping = ImplToApiMapping()
712
+
713
+ async def route_handler(route: Route) -> None:
714
+ try:
715
+ if (
716
+ route.request.resource_type == "document"
717
+ and route.request.url.startswith("http")
718
+ ):
719
+ protocol = route.request.url.split(":")[0]
720
+ await route.continue_(
721
+ url=f"{protocol}://patchright-init-script-inject.internal/"
722
+ )
723
+ else:
724
+ await route.continue_()
725
+ except:
726
+ await route.continue_()
727
+
728
+ if not self.route_injecting:
729
+ if self._connection._is_sync:
730
+ self._routes.insert(
731
+ 0,
732
+ RouteHandler(
733
+ self._options.get("baseURL"),
734
+ "**/*",
735
+ mapping.wrap_handler(route_handler),
736
+ False,
737
+ None,
738
+ ),
739
+ )
740
+ await self._update_interception_patterns()
741
+ else:
742
+ await self.route("**/*", mapping.wrap_handler(route_handler))
743
+ self.route_injecting = True