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.
Files changed (406) 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 +17 -0
  6. patchright/_impl/__pyinstaller/hook-playwright.sync_api.py +17 -0
  7. patchright/_impl/_accessibility.py +50 -0
  8. patchright/_impl/_api_structures.py +271 -0
  9. patchright/_impl/_artifact.py +45 -0
  10. patchright/_impl/_assertions.py +779 -0
  11. patchright/_impl/_async_base.py +92 -0
  12. patchright/_impl/_browser.py +243 -0
  13. patchright/_impl/_browser_context.py +724 -0
  14. patchright/_impl/_browser_type.py +264 -0
  15. patchright/_impl/_cdp_session.py +21 -0
  16. patchright/_impl/_clock.py +57 -0
  17. patchright/_impl/_connection.py +554 -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 +26 -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 +511 -0
  26. patchright/_impl/_file_chooser.py +43 -0
  27. patchright/_impl/_frame.py +755 -0
  28. patchright/_impl/_glob.py +51 -0
  29. patchright/_impl/_greenlets.py +39 -0
  30. patchright/_impl/_har_router.py +99 -0
  31. patchright/_impl/_helper.py +421 -0
  32. patchright/_impl/_impl_to_api_mapping.py +123 -0
  33. patchright/_impl/_input.py +71 -0
  34. patchright/_impl/_js_handle.py +234 -0
  35. patchright/_impl/_json_pipe.py +56 -0
  36. patchright/_impl/_local_utils.py +73 -0
  37. patchright/_impl/_locator.py +784 -0
  38. patchright/_impl/_map.py +19 -0
  39. patchright/_impl/_network.py +934 -0
  40. patchright/_impl/_object_factory.py +91 -0
  41. patchright/_impl/_page.py +1446 -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 +103 -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 +22 -0
  54. patchright/_impl/_writable_stream.py +27 -0
  55. patchright/_repo_version.py +12 -0
  56. patchright/async_api/__init__.py +177 -0
  57. patchright/async_api/_context_manager.py +39 -0
  58. patchright/async_api/_generated.py +19960 -0
  59. patchright/driver/LICENSE +2174 -0
  60. patchright/driver/README.md +1 -0
  61. patchright/driver/node.exe +0 -0
  62. patchright/driver/package/README.md +3 -0
  63. patchright/driver/package/ThirdPartyNotices.txt +1548 -0
  64. patchright/driver/package/api.json +1 -0
  65. patchright/driver/package/bin/PrintDeps.exe +0 -0
  66. patchright/driver/package/bin/README.md +2 -0
  67. patchright/driver/package/bin/install_media_pack.ps1 +5 -0
  68. patchright/driver/package/bin/reinstall_chrome_beta_linux.sh +40 -0
  69. patchright/driver/package/bin/reinstall_chrome_beta_mac.sh +13 -0
  70. patchright/driver/package/bin/reinstall_chrome_beta_win.ps1 +24 -0
  71. patchright/driver/package/bin/reinstall_chrome_stable_linux.sh +40 -0
  72. patchright/driver/package/bin/reinstall_chrome_stable_mac.sh +12 -0
  73. patchright/driver/package/bin/reinstall_chrome_stable_win.ps1 +24 -0
  74. patchright/driver/package/bin/reinstall_msedge_beta_linux.sh +40 -0
  75. patchright/driver/package/bin/reinstall_msedge_beta_mac.sh +11 -0
  76. patchright/driver/package/bin/reinstall_msedge_beta_win.ps1 +23 -0
  77. patchright/driver/package/bin/reinstall_msedge_dev_linux.sh +40 -0
  78. patchright/driver/package/bin/reinstall_msedge_dev_mac.sh +11 -0
  79. patchright/driver/package/bin/reinstall_msedge_dev_win.ps1 +23 -0
  80. patchright/driver/package/bin/reinstall_msedge_stable_linux.sh +40 -0
  81. patchright/driver/package/bin/reinstall_msedge_stable_mac.sh +11 -0
  82. patchright/driver/package/bin/reinstall_msedge_stable_win.ps1 +24 -0
  83. patchright/driver/package/browsers.json +57 -0
  84. patchright/driver/package/cli.js +18 -0
  85. patchright/driver/package/index.d.ts +17 -0
  86. patchright/driver/package/index.js +33 -0
  87. patchright/driver/package/index.mjs +28 -0
  88. patchright/driver/package/lib/androidServerImpl.js +69 -0
  89. patchright/driver/package/lib/browserServerImpl.js +92 -0
  90. patchright/driver/package/lib/cli/driver.js +95 -0
  91. patchright/driver/package/lib/cli/program.js +587 -0
  92. patchright/driver/package/lib/cli/programWithTestStub.js +67 -0
  93. patchright/driver/package/lib/client/accessibility.js +50 -0
  94. patchright/driver/package/lib/client/android.js +473 -0
  95. patchright/driver/package/lib/client/api.js +285 -0
  96. patchright/driver/package/lib/client/artifact.js +79 -0
  97. patchright/driver/package/lib/client/browser.js +145 -0
  98. patchright/driver/package/lib/client/browserContext.js +559 -0
  99. patchright/driver/package/lib/client/browserType.js +241 -0
  100. patchright/driver/package/lib/client/cdpSession.js +53 -0
  101. patchright/driver/package/lib/client/channelOwner.js +235 -0
  102. patchright/driver/package/lib/client/clientHelper.js +57 -0
  103. patchright/driver/package/lib/client/clientInstrumentation.js +50 -0
  104. patchright/driver/package/lib/client/clock.js +68 -0
  105. patchright/driver/package/lib/client/connection.js +333 -0
  106. patchright/driver/package/lib/client/consoleMessage.js +55 -0
  107. patchright/driver/package/lib/client/coverage.js +41 -0
  108. patchright/driver/package/lib/client/dialog.js +57 -0
  109. patchright/driver/package/lib/client/download.js +62 -0
  110. patchright/driver/package/lib/client/electron.js +135 -0
  111. patchright/driver/package/lib/client/elementHandle.js +321 -0
  112. patchright/driver/package/lib/client/errors.js +77 -0
  113. patchright/driver/package/lib/client/eventEmitter.js +314 -0
  114. patchright/driver/package/lib/client/events.js +94 -0
  115. patchright/driver/package/lib/client/fetch.js +391 -0
  116. patchright/driver/package/lib/client/fileChooser.js +45 -0
  117. patchright/driver/package/lib/client/frame.js +504 -0
  118. patchright/driver/package/lib/client/harRouter.js +99 -0
  119. patchright/driver/package/lib/client/input.js +111 -0
  120. patchright/driver/package/lib/client/jsHandle.js +121 -0
  121. patchright/driver/package/lib/client/jsonPipe.js +35 -0
  122. patchright/driver/package/lib/client/localUtils.js +36 -0
  123. patchright/driver/package/lib/client/locator.js +441 -0
  124. patchright/driver/package/lib/client/network.js +762 -0
  125. patchright/driver/package/lib/client/page.js +746 -0
  126. patchright/driver/package/lib/client/playwright.js +80 -0
  127. patchright/driver/package/lib/client/selectors.js +67 -0
  128. patchright/driver/package/lib/client/stream.js +54 -0
  129. patchright/driver/package/lib/client/tracing.js +134 -0
  130. patchright/driver/package/lib/client/types.js +24 -0
  131. patchright/driver/package/lib/client/video.js +51 -0
  132. patchright/driver/package/lib/client/waiter.js +158 -0
  133. patchright/driver/package/lib/client/webError.js +37 -0
  134. patchright/driver/package/lib/client/worker.js +71 -0
  135. patchright/driver/package/lib/client/writableStream.js +54 -0
  136. patchright/driver/package/lib/common/socksProxy.js +569 -0
  137. patchright/driver/package/lib/common/timeoutSettings.js +73 -0
  138. patchright/driver/package/lib/common/types.js +5 -0
  139. patchright/driver/package/lib/generated/clockSource.js +7 -0
  140. patchright/driver/package/lib/generated/consoleApiSource.js +7 -0
  141. patchright/driver/package/lib/generated/injectedScriptSource.js +7 -0
  142. patchright/driver/package/lib/generated/pollingRecorderSource.js +7 -0
  143. patchright/driver/package/lib/generated/utilityScriptSource.js +7 -0
  144. patchright/driver/package/lib/generated/webSocketMockSource.js +7 -0
  145. patchright/driver/package/lib/image_tools/colorUtils.js +98 -0
  146. patchright/driver/package/lib/image_tools/compare.js +108 -0
  147. patchright/driver/package/lib/image_tools/imageChannel.js +70 -0
  148. patchright/driver/package/lib/image_tools/stats.js +102 -0
  149. patchright/driver/package/lib/inProcessFactory.js +54 -0
  150. patchright/driver/package/lib/inprocess.js +20 -0
  151. patchright/driver/package/lib/outofprocess.js +67 -0
  152. patchright/driver/package/lib/protocol/debug.js +27 -0
  153. patchright/driver/package/lib/protocol/serializers.js +173 -0
  154. patchright/driver/package/lib/protocol/transport.js +82 -0
  155. patchright/driver/package/lib/protocol/validator.js +2759 -0
  156. patchright/driver/package/lib/protocol/validatorPrimitives.js +139 -0
  157. patchright/driver/package/lib/remote/playwrightConnection.js +274 -0
  158. patchright/driver/package/lib/remote/playwrightServer.js +110 -0
  159. patchright/driver/package/lib/server/accessibility.js +62 -0
  160. patchright/driver/package/lib/server/android/android.js +441 -0
  161. patchright/driver/package/lib/server/android/backendAdb.js +172 -0
  162. patchright/driver/package/lib/server/artifact.js +104 -0
  163. patchright/driver/package/lib/server/bidi/bidiBrowser.js +311 -0
  164. patchright/driver/package/lib/server/bidi/bidiChromium.js +124 -0
  165. patchright/driver/package/lib/server/bidi/bidiConnection.js +206 -0
  166. patchright/driver/package/lib/server/bidi/bidiExecutionContext.js +159 -0
  167. patchright/driver/package/lib/server/bidi/bidiFirefox.js +104 -0
  168. patchright/driver/package/lib/server/bidi/bidiInput.js +158 -0
  169. patchright/driver/package/lib/server/bidi/bidiNetworkManager.js +338 -0
  170. patchright/driver/package/lib/server/bidi/bidiOverCdp.js +103 -0
  171. patchright/driver/package/lib/server/bidi/bidiPage.js +529 -0
  172. patchright/driver/package/lib/server/bidi/bidiPdf.js +140 -0
  173. patchright/driver/package/lib/server/bidi/third_party/bidiDeserializer.js +93 -0
  174. patchright/driver/package/lib/server/bidi/third_party/bidiKeyboard.js +238 -0
  175. patchright/driver/package/lib/server/bidi/third_party/bidiProtocol.js +139 -0
  176. patchright/driver/package/lib/server/bidi/third_party/bidiSerializer.js +144 -0
  177. patchright/driver/package/lib/server/bidi/third_party/firefoxPrefs.js +221 -0
  178. patchright/driver/package/lib/server/browser.js +148 -0
  179. patchright/driver/package/lib/server/browserContext.js +666 -0
  180. patchright/driver/package/lib/server/browserType.js +335 -0
  181. patchright/driver/package/lib/server/chromium/appIcon.png +0 -0
  182. patchright/driver/package/lib/server/chromium/chromium.js +350 -0
  183. patchright/driver/package/lib/server/chromium/chromiumSwitches.js +36 -0
  184. patchright/driver/package/lib/server/chromium/crAccessibility.js +237 -0
  185. patchright/driver/package/lib/server/chromium/crBrowser.js +522 -0
  186. patchright/driver/package/lib/server/chromium/crConnection.js +228 -0
  187. patchright/driver/package/lib/server/chromium/crCoverage.js +246 -0
  188. patchright/driver/package/lib/server/chromium/crDevTools.js +104 -0
  189. patchright/driver/package/lib/server/chromium/crDragDrop.js +143 -0
  190. patchright/driver/package/lib/server/chromium/crExecutionContext.js +149 -0
  191. patchright/driver/package/lib/server/chromium/crInput.js +171 -0
  192. patchright/driver/package/lib/server/chromium/crNetworkManager.js +809 -0
  193. patchright/driver/package/lib/server/chromium/crPage.js +1235 -0
  194. patchright/driver/package/lib/server/chromium/crPdf.js +153 -0
  195. patchright/driver/package/lib/server/chromium/crProtocolHelper.js +133 -0
  196. patchright/driver/package/lib/server/chromium/crServiceWorker.js +111 -0
  197. patchright/driver/package/lib/server/chromium/defaultFontFamilies.js +145 -0
  198. patchright/driver/package/lib/server/chromium/videoRecorder.js +155 -0
  199. patchright/driver/package/lib/server/clock.js +133 -0
  200. patchright/driver/package/lib/server/codegen/csharp.js +299 -0
  201. patchright/driver/package/lib/server/codegen/java.js +235 -0
  202. patchright/driver/package/lib/server/codegen/javascript.js +223 -0
  203. patchright/driver/package/lib/server/codegen/jsonl.js +47 -0
  204. patchright/driver/package/lib/server/codegen/language.js +88 -0
  205. patchright/driver/package/lib/server/codegen/languages.js +30 -0
  206. patchright/driver/package/lib/server/codegen/python.js +265 -0
  207. patchright/driver/package/lib/server/codegen/types.js +5 -0
  208. patchright/driver/package/lib/server/console.js +57 -0
  209. patchright/driver/package/lib/server/cookieStore.js +185 -0
  210. patchright/driver/package/lib/server/debugController.js +234 -0
  211. patchright/driver/package/lib/server/debugger.js +132 -0
  212. patchright/driver/package/lib/server/deviceDescriptors.js +26 -0
  213. patchright/driver/package/lib/server/deviceDescriptorsSource.json +1669 -0
  214. patchright/driver/package/lib/server/dialog.js +71 -0
  215. patchright/driver/package/lib/server/dispatchers/androidDispatcher.js +193 -0
  216. patchright/driver/package/lib/server/dispatchers/artifactDispatcher.js +118 -0
  217. patchright/driver/package/lib/server/dispatchers/browserContextDispatcher.js +368 -0
  218. patchright/driver/package/lib/server/dispatchers/browserDispatcher.js +170 -0
  219. patchright/driver/package/lib/server/dispatchers/browserTypeDispatcher.js +55 -0
  220. patchright/driver/package/lib/server/dispatchers/cdpSessionDispatcher.js +48 -0
  221. patchright/driver/package/lib/server/dispatchers/debugControllerDispatcher.js +103 -0
  222. patchright/driver/package/lib/server/dispatchers/dialogDispatcher.js +44 -0
  223. patchright/driver/package/lib/server/dispatchers/dispatcher.js +395 -0
  224. patchright/driver/package/lib/server/dispatchers/electronDispatcher.js +93 -0
  225. patchright/driver/package/lib/server/dispatchers/elementHandlerDispatcher.js +228 -0
  226. patchright/driver/package/lib/server/dispatchers/frameDispatcher.js +286 -0
  227. patchright/driver/package/lib/server/dispatchers/jsHandleDispatcher.js +97 -0
  228. patchright/driver/package/lib/server/dispatchers/jsonPipeDispatcher.js +59 -0
  229. patchright/driver/package/lib/server/dispatchers/localUtilsDispatcher.js +413 -0
  230. patchright/driver/package/lib/server/dispatchers/networkDispatchers.js +221 -0
  231. patchright/driver/package/lib/server/dispatchers/pageDispatcher.js +367 -0
  232. patchright/driver/package/lib/server/dispatchers/playwrightDispatcher.js +107 -0
  233. patchright/driver/package/lib/server/dispatchers/selectorsDispatcher.js +36 -0
  234. patchright/driver/package/lib/server/dispatchers/streamDispatcher.js +62 -0
  235. patchright/driver/package/lib/server/dispatchers/tracingDispatcher.js +54 -0
  236. patchright/driver/package/lib/server/dispatchers/webSocketRouteDispatcher.js +189 -0
  237. patchright/driver/package/lib/server/dispatchers/writableStreamDispatcher.js +58 -0
  238. patchright/driver/package/lib/server/dom.js +845 -0
  239. patchright/driver/package/lib/server/download.js +60 -0
  240. patchright/driver/package/lib/server/electron/electron.js +296 -0
  241. patchright/driver/package/lib/server/electron/loader.js +57 -0
  242. patchright/driver/package/lib/server/errors.js +68 -0
  243. patchright/driver/package/lib/server/fetch.js +656 -0
  244. patchright/driver/package/lib/server/fileChooser.js +42 -0
  245. patchright/driver/package/lib/server/fileUploadUtils.js +75 -0
  246. patchright/driver/package/lib/server/firefox/ffAccessibility.js +216 -0
  247. patchright/driver/package/lib/server/firefox/ffBrowser.js +460 -0
  248. patchright/driver/package/lib/server/firefox/ffConnection.js +168 -0
  249. patchright/driver/package/lib/server/firefox/ffExecutionContext.js +135 -0
  250. patchright/driver/package/lib/server/firefox/ffInput.js +150 -0
  251. patchright/driver/package/lib/server/firefox/ffNetworkManager.js +233 -0
  252. patchright/driver/package/lib/server/firefox/ffPage.js +559 -0
  253. patchright/driver/package/lib/server/firefox/firefox.js +99 -0
  254. patchright/driver/package/lib/server/formData.js +75 -0
  255. patchright/driver/package/lib/server/frameSelectors.js +171 -0
  256. patchright/driver/package/lib/server/frames.js +1808 -0
  257. patchright/driver/package/lib/server/har/harRecorder.js +139 -0
  258. patchright/driver/package/lib/server/har/harTracer.js +542 -0
  259. patchright/driver/package/lib/server/helper.js +103 -0
  260. patchright/driver/package/lib/server/index.js +114 -0
  261. patchright/driver/package/lib/server/input.js +310 -0
  262. patchright/driver/package/lib/server/instrumentation.js +70 -0
  263. patchright/driver/package/lib/server/isomorphic/utilityScriptSerializers.js +226 -0
  264. patchright/driver/package/lib/server/javascript.js +299 -0
  265. patchright/driver/package/lib/server/launchApp.js +91 -0
  266. patchright/driver/package/lib/server/macEditingCommands.js +139 -0
  267. patchright/driver/package/lib/server/network.js +617 -0
  268. patchright/driver/package/lib/server/page.js +819 -0
  269. patchright/driver/package/lib/server/pipeTransport.js +85 -0
  270. patchright/driver/package/lib/server/playwright.js +88 -0
  271. patchright/driver/package/lib/server/progress.js +102 -0
  272. patchright/driver/package/lib/server/protocolError.js +49 -0
  273. patchright/driver/package/lib/server/recorder/contextRecorder.js +299 -0
  274. patchright/driver/package/lib/server/recorder/recorderApp.js +196 -0
  275. patchright/driver/package/lib/server/recorder/recorderCollection.js +116 -0
  276. patchright/driver/package/lib/server/recorder/recorderFrontend.js +5 -0
  277. patchright/driver/package/lib/server/recorder/recorderInTraceViewer.js +144 -0
  278. patchright/driver/package/lib/server/recorder/recorderRunner.js +155 -0
  279. patchright/driver/package/lib/server/recorder/recorderUtils.js +112 -0
  280. patchright/driver/package/lib/server/recorder/throttledFile.js +46 -0
  281. patchright/driver/package/lib/server/recorder.js +327 -0
  282. patchright/driver/package/lib/server/registry/browserFetcher.js +168 -0
  283. patchright/driver/package/lib/server/registry/dependencies.js +322 -0
  284. patchright/driver/package/lib/server/registry/index.js +1005 -0
  285. patchright/driver/package/lib/server/registry/nativeDeps.js +490 -0
  286. patchright/driver/package/lib/server/registry/oopDownloadBrowserMain.js +138 -0
  287. patchright/driver/package/lib/server/screenshotter.js +348 -0
  288. patchright/driver/package/lib/server/selectors.js +73 -0
  289. patchright/driver/package/lib/server/socksClientCertificatesInterceptor.js +340 -0
  290. patchright/driver/package/lib/server/socksInterceptor.js +100 -0
  291. patchright/driver/package/lib/server/trace/recorder/snapshotter.js +172 -0
  292. patchright/driver/package/lib/server/trace/recorder/snapshotterInjected.js +493 -0
  293. patchright/driver/package/lib/server/trace/recorder/tracing.js +542 -0
  294. patchright/driver/package/lib/server/trace/test/inMemorySnapshotter.js +93 -0
  295. patchright/driver/package/lib/server/trace/viewer/traceViewer.js +213 -0
  296. patchright/driver/package/lib/server/transport.js +191 -0
  297. patchright/driver/package/lib/server/types.js +24 -0
  298. patchright/driver/package/lib/server/usKeyboardLayout.js +555 -0
  299. patchright/driver/package/lib/server/webkit/webkit.js +87 -0
  300. patchright/driver/package/lib/server/webkit/wkAccessibility.js +194 -0
  301. patchright/driver/package/lib/server/webkit/wkBrowser.js +329 -0
  302. patchright/driver/package/lib/server/webkit/wkConnection.js +173 -0
  303. patchright/driver/package/lib/server/webkit/wkExecutionContext.js +143 -0
  304. patchright/driver/package/lib/server/webkit/wkInput.js +169 -0
  305. patchright/driver/package/lib/server/webkit/wkInterceptableRequest.js +162 -0
  306. patchright/driver/package/lib/server/webkit/wkPage.js +1219 -0
  307. patchright/driver/package/lib/server/webkit/wkProvisionalPage.js +94 -0
  308. patchright/driver/package/lib/server/webkit/wkWorkers.js +104 -0
  309. patchright/driver/package/lib/third_party/diff_match_patch.js +2222 -0
  310. patchright/driver/package/lib/third_party/pixelmatch.js +255 -0
  311. patchright/driver/package/lib/utils/ascii.js +31 -0
  312. patchright/driver/package/lib/utils/comparators.js +171 -0
  313. patchright/driver/package/lib/utils/crypto.js +174 -0
  314. patchright/driver/package/lib/utils/debug.js +46 -0
  315. patchright/driver/package/lib/utils/debugLogger.js +91 -0
  316. patchright/driver/package/lib/utils/env.js +49 -0
  317. patchright/driver/package/lib/utils/eventsHelper.js +38 -0
  318. patchright/driver/package/lib/utils/expectUtils.js +33 -0
  319. patchright/driver/package/lib/utils/fileUtils.js +205 -0
  320. patchright/driver/package/lib/utils/happy-eyeballs.js +194 -0
  321. patchright/driver/package/lib/utils/headers.js +52 -0
  322. patchright/driver/package/lib/utils/hostPlatform.js +133 -0
  323. patchright/driver/package/lib/utils/httpServer.js +237 -0
  324. patchright/driver/package/lib/utils/index.js +368 -0
  325. patchright/driver/package/lib/utils/isomorphic/cssParser.js +250 -0
  326. patchright/driver/package/lib/utils/isomorphic/cssTokenizer.js +979 -0
  327. patchright/driver/package/lib/utils/isomorphic/locatorGenerators.js +642 -0
  328. patchright/driver/package/lib/utils/isomorphic/locatorParser.js +179 -0
  329. patchright/driver/package/lib/utils/isomorphic/locatorUtils.js +62 -0
  330. patchright/driver/package/lib/utils/isomorphic/mimeType.js +29 -0
  331. patchright/driver/package/lib/utils/isomorphic/recorderUtils.js +195 -0
  332. patchright/driver/package/lib/utils/isomorphic/selectorParser.js +397 -0
  333. patchright/driver/package/lib/utils/isomorphic/stringUtils.js +139 -0
  334. patchright/driver/package/lib/utils/isomorphic/traceUtils.js +39 -0
  335. patchright/driver/package/lib/utils/isomorphic/urlMatch.js +120 -0
  336. patchright/driver/package/lib/utils/linuxUtils.js +78 -0
  337. patchright/driver/package/lib/utils/manualPromise.js +109 -0
  338. patchright/driver/package/lib/utils/multimap.js +75 -0
  339. patchright/driver/package/lib/utils/network.js +160 -0
  340. patchright/driver/package/lib/utils/processLauncher.js +248 -0
  341. patchright/driver/package/lib/utils/profiler.js +53 -0
  342. patchright/driver/package/lib/utils/rtti.js +44 -0
  343. patchright/driver/package/lib/utils/semaphore.js +51 -0
  344. patchright/driver/package/lib/utils/spawnAsync.js +45 -0
  345. patchright/driver/package/lib/utils/stackTrace.js +121 -0
  346. patchright/driver/package/lib/utils/task.js +58 -0
  347. patchright/driver/package/lib/utils/time.js +37 -0
  348. patchright/driver/package/lib/utils/timeoutRunner.js +66 -0
  349. patchright/driver/package/lib/utils/traceUtils.js +44 -0
  350. patchright/driver/package/lib/utils/userAgent.js +105 -0
  351. patchright/driver/package/lib/utils/wsServer.js +127 -0
  352. patchright/driver/package/lib/utils/zipFile.js +75 -0
  353. patchright/driver/package/lib/utils/zones.js +62 -0
  354. patchright/driver/package/lib/utilsBundle.js +82 -0
  355. patchright/driver/package/lib/utilsBundleImpl/index.js +53 -0
  356. patchright/driver/package/lib/utilsBundleImpl/xdg-open +1066 -0
  357. patchright/driver/package/lib/vite/htmlReport/index.html +66 -0
  358. patchright/driver/package/lib/vite/recorder/assets/codeMirrorModule-d0KhC1qL.js +24 -0
  359. patchright/driver/package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +1 -0
  360. patchright/driver/package/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +0 -0
  361. patchright/driver/package/lib/vite/recorder/assets/index-BW-aOBcL.css +1 -0
  362. patchright/driver/package/lib/vite/recorder/assets/index-Bxxcmxlu.js +42 -0
  363. patchright/driver/package/lib/vite/recorder/index.html +29 -0
  364. patchright/driver/package/lib/vite/recorder/playwright-logo.svg +9 -0
  365. patchright/driver/package/lib/vite/traceViewer/assets/codeMirrorModule-CZTtn9l8.js +24 -0
  366. patchright/driver/package/lib/vite/traceViewer/assets/inspectorTab-DTusvprx.js +64 -0
  367. patchright/driver/package/lib/vite/traceViewer/assets/testServerConnection-DeE2kSzz.js +1 -0
  368. patchright/driver/package/lib/vite/traceViewer/assets/workbench-DIEjrm3Z.js +9 -0
  369. patchright/driver/package/lib/vite/traceViewer/assets/xtermModule-BeNbaIVa.js +9 -0
  370. patchright/driver/package/lib/vite/traceViewer/codeMirrorModule.ez37Vkbh.css +1 -0
  371. patchright/driver/package/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +0 -0
  372. patchright/driver/package/lib/vite/traceViewer/embedded.Do_J5Hgs.js +2 -0
  373. patchright/driver/package/lib/vite/traceViewer/embedded.html +18 -0
  374. patchright/driver/package/lib/vite/traceViewer/embedded.w7WN2u1R.css +1 -0
  375. patchright/driver/package/lib/vite/traceViewer/index.B21BXreT.js +2 -0
  376. patchright/driver/package/lib/vite/traceViewer/index.CrbWWHbf.css +1 -0
  377. patchright/driver/package/lib/vite/traceViewer/index.html +29 -0
  378. patchright/driver/package/lib/vite/traceViewer/inspectorTab.DLjBDrQR.css +1 -0
  379. patchright/driver/package/lib/vite/traceViewer/playwright-logo.svg +9 -0
  380. patchright/driver/package/lib/vite/traceViewer/recorder.B_SY1GJM.css +0 -0
  381. patchright/driver/package/lib/vite/traceViewer/recorder.Bfh_9UGt.js +2 -0
  382. patchright/driver/package/lib/vite/traceViewer/recorder.html +17 -0
  383. patchright/driver/package/lib/vite/traceViewer/snapshot.html +21 -0
  384. patchright/driver/package/lib/vite/traceViewer/sw.bundle.js +3 -0
  385. patchright/driver/package/lib/vite/traceViewer/uiMode.CAYqod-m.css +1 -0
  386. patchright/driver/package/lib/vite/traceViewer/uiMode.DloKQa-h.js +5 -0
  387. patchright/driver/package/lib/vite/traceViewer/uiMode.html +20 -0
  388. patchright/driver/package/lib/vite/traceViewer/workbench.D3JVcA9K.css +1 -0
  389. patchright/driver/package/lib/vite/traceViewer/xtermModule.DSXBckUd.css +32 -0
  390. patchright/driver/package/lib/zipBundle.js +25 -0
  391. patchright/driver/package/lib/zipBundleImpl.js +5 -0
  392. patchright/driver/package/package.json +44 -0
  393. patchright/driver/package/protocol.yml +3720 -0
  394. patchright/driver/package/types/protocol.d.ts +21571 -0
  395. patchright/driver/package/types/structs.d.ts +45 -0
  396. patchright/driver/package/types/types.d.ts +22519 -0
  397. patchright/py.typed +0 -0
  398. patchright/sync_api/__init__.py +177 -0
  399. patchright/sync_api/_context_manager.py +74 -0
  400. patchright/sync_api/_generated.py +20155 -0
  401. patchright-1.48.0.dist-info/LICENSE +202 -0
  402. patchright-1.48.0.dist-info/METADATA +83 -0
  403. patchright-1.48.0.dist-info/RECORD +406 -0
  404. patchright-1.48.0.dist-info/WHEEL +5 -0
  405. patchright-1.48.0.dist-info/entry_points.txt +5 -0
  406. 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