osn-selenium 0.0.0__py3-none-any.whl → 1.1.0__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 (635) hide show
  1. osn_selenium/_base_models.py +41 -0
  2. osn_selenium/_cdp_import.py +253 -0
  3. osn_selenium/_functions.py +84 -0
  4. osn_selenium/_typehints.py +19 -0
  5. osn_selenium/abstract/executors/cdp/__init__.py +435 -0
  6. osn_selenium/abstract/executors/cdp/accessibility.py +62 -0
  7. osn_selenium/abstract/executors/cdp/animation.py +47 -0
  8. osn_selenium/abstract/executors/cdp/audits.py +39 -0
  9. osn_selenium/abstract/executors/cdp/autofill.py +34 -0
  10. osn_selenium/abstract/executors/cdp/background_service.py +22 -0
  11. osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +95 -0
  12. osn_selenium/abstract/executors/cdp/browser.py +122 -0
  13. osn_selenium/abstract/executors/cdp/cache_storage.py +49 -0
  14. osn_selenium/abstract/executors/cdp/cast.py +31 -0
  15. osn_selenium/abstract/executors/cdp/console.py +18 -0
  16. osn_selenium/abstract/executors/cdp/css.py +197 -0
  17. osn_selenium/abstract/executors/cdp/debugger.py +198 -0
  18. osn_selenium/abstract/executors/cdp/device_access.py +22 -0
  19. osn_selenium/abstract/executors/cdp/device_orientation.py +14 -0
  20. osn_selenium/abstract/executors/cdp/dom.py +305 -0
  21. osn_selenium/abstract/executors/cdp/dom_debugger.py +57 -0
  22. osn_selenium/abstract/executors/cdp/dom_snapshot.py +42 -0
  23. osn_selenium/abstract/executors/cdp/dom_storage.py +31 -0
  24. osn_selenium/abstract/executors/cdp/emulation.py +259 -0
  25. osn_selenium/abstract/executors/cdp/event_breakpoints.py +18 -0
  26. osn_selenium/abstract/executors/cdp/extensions.py +31 -0
  27. osn_selenium/abstract/executors/cdp/fed_cm.py +35 -0
  28. osn_selenium/abstract/executors/cdp/fetch.py +76 -0
  29. osn_selenium/abstract/executors/cdp/file_system.py +11 -0
  30. osn_selenium/abstract/executors/cdp/headless_experimental.py +30 -0
  31. osn_selenium/abstract/executors/cdp/heap_profiler.py +73 -0
  32. osn_selenium/abstract/executors/cdp/indexed_db.py +99 -0
  33. osn_selenium/abstract/executors/cdp/input.py +158 -0
  34. osn_selenium/abstract/executors/cdp/inspector.py +14 -0
  35. osn_selenium/abstract/executors/cdp/io.py +24 -0
  36. osn_selenium/abstract/executors/cdp/layer_tree.py +61 -0
  37. osn_selenium/abstract/executors/cdp/log.py +27 -0
  38. osn_selenium/abstract/executors/cdp/media.py +14 -0
  39. osn_selenium/abstract/executors/cdp/memory.py +61 -0
  40. osn_selenium/abstract/executors/cdp/network.py +252 -0
  41. osn_selenium/abstract/executors/cdp/overlay.py +166 -0
  42. osn_selenium/abstract/executors/cdp/page.py +347 -0
  43. osn_selenium/abstract/executors/cdp/performance.py +28 -0
  44. osn_selenium/abstract/executors/cdp/performance_timeline.py +11 -0
  45. osn_selenium/abstract/executors/cdp/preload.py +14 -0
  46. osn_selenium/abstract/executors/cdp/profiler.py +54 -0
  47. osn_selenium/abstract/executors/cdp/pwa.py +46 -0
  48. osn_selenium/abstract/executors/cdp/runtime.py +176 -0
  49. osn_selenium/abstract/executors/cdp/schema.py +11 -0
  50. osn_selenium/abstract/executors/cdp/security.py +26 -0
  51. osn_selenium/abstract/executors/cdp/service_worker.py +54 -0
  52. osn_selenium/abstract/executors/cdp/storage.py +175 -0
  53. osn_selenium/abstract/executors/cdp/system_info.py +24 -0
  54. osn_selenium/abstract/executors/cdp/target.py +125 -0
  55. osn_selenium/abstract/executors/cdp/tethering.py +14 -0
  56. osn_selenium/abstract/executors/cdp/tracing.py +48 -0
  57. osn_selenium/abstract/executors/cdp/web_audio.py +19 -0
  58. osn_selenium/abstract/executors/cdp/web_authn.py +76 -0
  59. osn_selenium/abstract/executors/cdp.py +63 -0
  60. osn_selenium/abstract/executors/javascript.py +203 -0
  61. osn_selenium/abstract/instances/action_chains/__init__.py +12 -0
  62. osn_selenium/abstract/instances/action_chains/base.py +25 -0
  63. osn_selenium/abstract/instances/action_chains/click.py +93 -0
  64. osn_selenium/abstract/instances/action_chains/drag_and_drop.py +46 -0
  65. osn_selenium/abstract/instances/action_chains/hm_keyboard.py +44 -0
  66. osn_selenium/abstract/instances/action_chains/hm_move.py +104 -0
  67. osn_selenium/abstract/instances/action_chains/hm_scroll.py +75 -0
  68. osn_selenium/abstract/instances/action_chains/keyboard.py +79 -0
  69. osn_selenium/abstract/instances/action_chains/move.py +60 -0
  70. osn_selenium/abstract/instances/action_chains/scroll.py +61 -0
  71. osn_selenium/abstract/instances/action_chains/utils.py +44 -0
  72. osn_selenium/abstract/instances/alert.py +67 -0
  73. osn_selenium/abstract/instances/browser.py +76 -0
  74. osn_selenium/abstract/instances/browsing_context.py +310 -0
  75. osn_selenium/abstract/instances/dialog.py +107 -0
  76. osn_selenium/abstract/instances/fedcm.py +133 -0
  77. osn_selenium/abstract/instances/mobile.py +79 -0
  78. osn_selenium/abstract/instances/network.py +100 -0
  79. osn_selenium/abstract/instances/permissions.py +52 -0
  80. osn_selenium/abstract/instances/script.py +109 -0
  81. osn_selenium/abstract/instances/shadow_root.py +81 -0
  82. osn_selenium/abstract/instances/storage.py +98 -0
  83. osn_selenium/abstract/instances/switch_to.py +104 -0
  84. osn_selenium/abstract/instances/web_driver_wait.py +57 -0
  85. osn_selenium/abstract/instances/web_element.py +395 -0
  86. osn_selenium/abstract/instances/web_extension.py +70 -0
  87. osn_selenium/abstract/webdriver/blink/__init__.py +18 -0
  88. osn_selenium/abstract/webdriver/blink/base.py +80 -0
  89. osn_selenium/abstract/webdriver/blink/casting.py +82 -0
  90. osn_selenium/abstract/webdriver/blink/features.py +51 -0
  91. osn_selenium/abstract/webdriver/blink/lifecycle.py +76 -0
  92. osn_selenium/abstract/webdriver/blink/logging.py +40 -0
  93. osn_selenium/abstract/webdriver/blink/network.py +45 -0
  94. osn_selenium/abstract/webdriver/blink/settings.py +68 -0
  95. osn_selenium/abstract/webdriver/chrome/__init__.py +18 -0
  96. osn_selenium/abstract/webdriver/chrome/base.py +36 -0
  97. osn_selenium/abstract/webdriver/chrome/lifecycle.py +92 -0
  98. osn_selenium/abstract/webdriver/chrome/settings.py +110 -0
  99. osn_selenium/abstract/webdriver/core/__init__.py +16 -0
  100. osn_selenium/abstract/webdriver/core/actions.py +58 -0
  101. osn_selenium/abstract/webdriver/core/auth.py +145 -0
  102. osn_selenium/abstract/webdriver/core/base.py +298 -0
  103. osn_selenium/abstract/webdriver/core/capture.py +84 -0
  104. osn_selenium/abstract/webdriver/core/components.py +82 -0
  105. osn_selenium/abstract/webdriver/core/devtools.py +69 -0
  106. osn_selenium/abstract/webdriver/core/element.py +55 -0
  107. osn_selenium/abstract/webdriver/core/file.py +82 -0
  108. osn_selenium/abstract/webdriver/core/lifecycle.py +103 -0
  109. osn_selenium/abstract/webdriver/core/navigation.py +65 -0
  110. osn_selenium/abstract/webdriver/core/script.py +88 -0
  111. osn_selenium/abstract/webdriver/core/settings.py +43 -0
  112. osn_selenium/abstract/webdriver/core/storage.py +81 -0
  113. osn_selenium/abstract/webdriver/core/timeouts.py +101 -0
  114. osn_selenium/abstract/webdriver/core/window.py +237 -0
  115. osn_selenium/abstract/webdriver/edge/__init__.py +18 -0
  116. osn_selenium/abstract/webdriver/edge/base.py +36 -0
  117. osn_selenium/abstract/webdriver/edge/lifecycle.py +92 -0
  118. osn_selenium/abstract/webdriver/edge/settings.py +110 -0
  119. osn_selenium/abstract/webdriver/yandex/__init__.py +18 -0
  120. osn_selenium/abstract/webdriver/yandex/base.py +18 -0
  121. osn_selenium/abstract/webdriver/yandex/lifecycle.py +92 -0
  122. osn_selenium/abstract/webdriver/yandex/settings.py +110 -0
  123. osn_selenium/base_mixin.py +122 -0
  124. osn_selenium/browsers_handler/__init__.py +47 -17
  125. osn_selenium/browsers_handler/_linux.py +226 -0
  126. osn_selenium/browsers_handler/_windows.py +21 -14
  127. osn_selenium/browsers_handler/{types.py → models.py} +5 -2
  128. osn_selenium/dev_tools/_decorators.py +149 -0
  129. osn_selenium/dev_tools/_exception_helpers.py +116 -0
  130. osn_selenium/dev_tools/_functions.py +174 -0
  131. osn_selenium/dev_tools/_system_utils.py +35 -0
  132. osn_selenium/dev_tools/_typehints.py +35 -0
  133. osn_selenium/dev_tools/_validators.py +227 -0
  134. osn_selenium/dev_tools/_wrappers.py +92 -0
  135. osn_selenium/dev_tools/domains/__init__.py +7 -40
  136. osn_selenium/dev_tools/domains/abstract.py +98 -254
  137. osn_selenium/dev_tools/domains/fetch.py +229 -906
  138. osn_selenium/dev_tools/domains_default/fetch.py +40 -28
  139. osn_selenium/dev_tools/filters.py +40 -0
  140. osn_selenium/dev_tools/logger/main.py +214 -0
  141. osn_selenium/dev_tools/logger/models.py +232 -0
  142. osn_selenium/dev_tools/logger/target.py +278 -0
  143. osn_selenium/dev_tools/manager/__init__.py +16 -0
  144. osn_selenium/dev_tools/manager/base.py +124 -0
  145. osn_selenium/dev_tools/manager/lifecycle.py +236 -0
  146. osn_selenium/dev_tools/manager/logging.py +153 -0
  147. osn_selenium/dev_tools/manager/settings.py +89 -0
  148. osn_selenium/dev_tools/manager/targets.py +175 -0
  149. osn_selenium/dev_tools/models.py +49 -0
  150. osn_selenium/dev_tools/settings.py +139 -0
  151. osn_selenium/dev_tools/target/__init__.py +16 -0
  152. osn_selenium/dev_tools/target/base.py +427 -0
  153. osn_selenium/dev_tools/target/detach.py +54 -0
  154. osn_selenium/dev_tools/target/discovery.py +112 -0
  155. osn_selenium/dev_tools/target/events.py +120 -0
  156. osn_selenium/dev_tools/target/fingerprint.py +126 -0
  157. osn_selenium/dev_tools/target/lifecycle.py +184 -0
  158. osn_selenium/dev_tools/target/logging.py +163 -0
  159. osn_selenium/exceptions/__init__.py +1 -0
  160. osn_selenium/exceptions/base.py +9 -0
  161. osn_selenium/exceptions/configuration.py +84 -0
  162. osn_selenium/exceptions/dependencies.py +60 -0
  163. osn_selenium/exceptions/devtools.py +114 -0
  164. osn_selenium/exceptions/flags.py +45 -0
  165. osn_selenium/exceptions/instance.py +92 -0
  166. osn_selenium/exceptions/javascript.py +31 -0
  167. osn_selenium/exceptions/logic.py +31 -0
  168. osn_selenium/exceptions/path.py +77 -0
  169. osn_selenium/exceptions/platform.py +33 -0
  170. osn_selenium/exceptions/protocol.py +86 -0
  171. osn_selenium/exceptions/webdriver.py +44 -0
  172. osn_selenium/exceptions/window.py +63 -0
  173. osn_selenium/executors/__init__.py +1 -0
  174. osn_selenium/executors/sync/__init__.py +1 -0
  175. osn_selenium/executors/sync/cdp/__init__.py +550 -0
  176. osn_selenium/executors/sync/cdp/accessibility.py +74 -0
  177. osn_selenium/executors/sync/cdp/animation.py +50 -0
  178. osn_selenium/executors/sync/cdp/audits.py +48 -0
  179. osn_selenium/executors/sync/cdp/autofill.py +39 -0
  180. osn_selenium/executors/sync/cdp/background_service.py +30 -0
  181. osn_selenium/executors/sync/cdp/bluetooth_emulation.py +101 -0
  182. osn_selenium/executors/sync/cdp/browser.py +131 -0
  183. osn_selenium/executors/sync/cdp/cache_storage.py +66 -0
  184. osn_selenium/executors/sync/cdp/cast.py +38 -0
  185. osn_selenium/executors/sync/cdp/console.py +24 -0
  186. osn_selenium/executors/sync/cdp/css.py +187 -0
  187. osn_selenium/executors/sync/cdp/debugger.py +206 -0
  188. osn_selenium/executors/sync/cdp/device_access.py +27 -0
  189. osn_selenium/executors/sync/cdp/device_orientation.py +24 -0
  190. osn_selenium/executors/sync/cdp/dom.py +310 -0
  191. osn_selenium/executors/sync/cdp/dom_debugger.py +56 -0
  192. osn_selenium/executors/sync/cdp/dom_snapshot.py +58 -0
  193. osn_selenium/executors/sync/cdp/dom_storage.py +38 -0
  194. osn_selenium/executors/sync/cdp/emulation.py +270 -0
  195. osn_selenium/executors/sync/cdp/event_breakpoints.py +27 -0
  196. osn_selenium/executors/sync/cdp/extensions.py +39 -0
  197. osn_selenium/executors/sync/cdp/fed_cm.py +45 -0
  198. osn_selenium/executors/sync/cdp/fetch.py +96 -0
  199. osn_selenium/executors/sync/cdp/file_system.py +18 -0
  200. osn_selenium/executors/sync/cdp/headless_experimental.py +44 -0
  201. osn_selenium/executors/sync/cdp/heap_profiler.py +89 -0
  202. osn_selenium/executors/sync/cdp/indexed_db.py +142 -0
  203. osn_selenium/executors/sync/cdp/input.py +233 -0
  204. osn_selenium/executors/sync/cdp/inspector.py +21 -0
  205. osn_selenium/executors/sync/cdp/io.py +33 -0
  206. osn_selenium/executors/sync/cdp/layer_tree.py +71 -0
  207. osn_selenium/executors/sync/cdp/log.py +35 -0
  208. osn_selenium/executors/sync/cdp/media.py +21 -0
  209. osn_selenium/executors/sync/cdp/memory.py +62 -0
  210. osn_selenium/executors/sync/cdp/network.py +287 -0
  211. osn_selenium/executors/sync/cdp/overlay.py +174 -0
  212. osn_selenium/executors/sync/cdp/page.py +365 -0
  213. osn_selenium/executors/sync/cdp/performance.py +33 -0
  214. osn_selenium/executors/sync/cdp/performance_timeline.py +26 -0
  215. osn_selenium/executors/sync/cdp/preload.py +21 -0
  216. osn_selenium/executors/sync/cdp/profiler.py +58 -0
  217. osn_selenium/executors/sync/cdp/pwa.py +55 -0
  218. osn_selenium/executors/sync/cdp/runtime.py +221 -0
  219. osn_selenium/executors/sync/cdp/schema.py +23 -0
  220. osn_selenium/executors/sync/cdp/security.py +30 -0
  221. osn_selenium/executors/sync/cdp/service_worker.py +56 -0
  222. osn_selenium/executors/sync/cdp/storage.py +151 -0
  223. osn_selenium/executors/sync/cdp/system_info.py +30 -0
  224. osn_selenium/executors/sync/cdp/target.py +147 -0
  225. osn_selenium/executors/sync/cdp/tethering.py +21 -0
  226. osn_selenium/executors/sync/cdp/tracing.py +62 -0
  227. osn_selenium/executors/sync/cdp/web_audio.py +24 -0
  228. osn_selenium/executors/sync/cdp/web_authn.py +82 -0
  229. osn_selenium/executors/sync/cdp.py +100 -0
  230. osn_selenium/executors/sync/javascript.py +79 -0
  231. osn_selenium/executors/trio_threads/__init__.py +1 -0
  232. osn_selenium/executors/trio_threads/cdp/__init__.py +771 -0
  233. osn_selenium/executors/trio_threads/cdp/accessibility.py +87 -0
  234. osn_selenium/executors/trio_threads/cdp/animation.py +63 -0
  235. osn_selenium/executors/trio_threads/cdp/audits.py +57 -0
  236. osn_selenium/executors/trio_threads/cdp/autofill.py +52 -0
  237. osn_selenium/executors/trio_threads/cdp/background_service.py +40 -0
  238. osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +111 -0
  239. osn_selenium/executors/trio_threads/cdp/browser.py +140 -0
  240. osn_selenium/executors/trio_threads/cdp/cache_storage.py +79 -0
  241. osn_selenium/executors/trio_threads/cdp/cast.py +47 -0
  242. osn_selenium/executors/trio_threads/cdp/console.py +33 -0
  243. osn_selenium/executors/trio_threads/cdp/css.py +196 -0
  244. osn_selenium/executors/trio_threads/cdp/debugger.py +219 -0
  245. osn_selenium/executors/trio_threads/cdp/device_access.py +40 -0
  246. osn_selenium/executors/trio_threads/cdp/device_orientation.py +34 -0
  247. osn_selenium/executors/trio_threads/cdp/dom.py +319 -0
  248. osn_selenium/executors/trio_threads/cdp/dom_debugger.py +69 -0
  249. osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +71 -0
  250. osn_selenium/executors/trio_threads/cdp/dom_storage.py +51 -0
  251. osn_selenium/executors/trio_threads/cdp/emulation.py +283 -0
  252. osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +37 -0
  253. osn_selenium/executors/trio_threads/cdp/extensions.py +52 -0
  254. osn_selenium/executors/trio_threads/cdp/fed_cm.py +54 -0
  255. osn_selenium/executors/trio_threads/cdp/fetch.py +105 -0
  256. osn_selenium/executors/trio_threads/cdp/file_system.py +31 -0
  257. osn_selenium/executors/trio_threads/cdp/headless_experimental.py +54 -0
  258. osn_selenium/executors/trio_threads/cdp/heap_profiler.py +102 -0
  259. osn_selenium/executors/trio_threads/cdp/indexed_db.py +155 -0
  260. osn_selenium/executors/trio_threads/cdp/input.py +242 -0
  261. osn_selenium/executors/trio_threads/cdp/inspector.py +34 -0
  262. osn_selenium/executors/trio_threads/cdp/io.py +42 -0
  263. osn_selenium/executors/trio_threads/cdp/layer_tree.py +84 -0
  264. osn_selenium/executors/trio_threads/cdp/log.py +44 -0
  265. osn_selenium/executors/trio_threads/cdp/media.py +30 -0
  266. osn_selenium/executors/trio_threads/cdp/memory.py +71 -0
  267. osn_selenium/executors/trio_threads/cdp/network.py +296 -0
  268. osn_selenium/executors/trio_threads/cdp/overlay.py +183 -0
  269. osn_selenium/executors/trio_threads/cdp/page.py +374 -0
  270. osn_selenium/executors/trio_threads/cdp/performance.py +46 -0
  271. osn_selenium/executors/trio_threads/cdp/performance_timeline.py +36 -0
  272. osn_selenium/executors/trio_threads/cdp/preload.py +30 -0
  273. osn_selenium/executors/trio_threads/cdp/profiler.py +71 -0
  274. osn_selenium/executors/trio_threads/cdp/pwa.py +64 -0
  275. osn_selenium/executors/trio_threads/cdp/runtime.py +230 -0
  276. osn_selenium/executors/trio_threads/cdp/schema.py +32 -0
  277. osn_selenium/executors/trio_threads/cdp/security.py +43 -0
  278. osn_selenium/executors/trio_threads/cdp/service_worker.py +69 -0
  279. osn_selenium/executors/trio_threads/cdp/storage.py +162 -0
  280. osn_selenium/executors/trio_threads/cdp/system_info.py +43 -0
  281. osn_selenium/executors/trio_threads/cdp/target.py +156 -0
  282. osn_selenium/executors/trio_threads/cdp/tethering.py +34 -0
  283. osn_selenium/executors/trio_threads/cdp/tracing.py +71 -0
  284. osn_selenium/executors/trio_threads/cdp/web_audio.py +37 -0
  285. osn_selenium/executors/trio_threads/cdp/web_authn.py +95 -0
  286. osn_selenium/executors/trio_threads/cdp.py +104 -0
  287. osn_selenium/executors/trio_threads/javascript.py +90 -0
  288. osn_selenium/executors/unified/__init__.py +1 -0
  289. osn_selenium/executors/unified/cdp/__init__.py +1 -0
  290. osn_selenium/executors/unified/cdp/accessibility.py +81 -0
  291. osn_selenium/executors/unified/cdp/animation.py +50 -0
  292. osn_selenium/executors/unified/cdp/audits.py +45 -0
  293. osn_selenium/executors/unified/cdp/autofill.py +41 -0
  294. osn_selenium/executors/unified/cdp/background_service.py +24 -0
  295. osn_selenium/executors/unified/cdp/bluetooth_emulation.py +132 -0
  296. osn_selenium/executors/unified/cdp/browser.py +143 -0
  297. osn_selenium/executors/unified/cdp/cache_storage.py +69 -0
  298. osn_selenium/executors/unified/cdp/cast.py +32 -0
  299. osn_selenium/executors/unified/cdp/console.py +18 -0
  300. osn_selenium/executors/unified/cdp/css.py +237 -0
  301. osn_selenium/executors/unified/cdp/debugger.py +243 -0
  302. osn_selenium/executors/unified/cdp/device_access.py +21 -0
  303. osn_selenium/executors/unified/cdp/device_orientation.py +18 -0
  304. osn_selenium/executors/unified/cdp/dom.py +380 -0
  305. osn_selenium/executors/unified/cdp/dom_debugger.py +65 -0
  306. osn_selenium/executors/unified/cdp/dom_snapshot.py +58 -0
  307. osn_selenium/executors/unified/cdp/dom_storage.py +38 -0
  308. osn_selenium/executors/unified/cdp/emulation.py +312 -0
  309. osn_selenium/executors/unified/cdp/event_breakpoints.py +24 -0
  310. osn_selenium/executors/unified/cdp/extensions.py +45 -0
  311. osn_selenium/executors/unified/cdp/fed_cm.py +51 -0
  312. osn_selenium/executors/unified/cdp/fetch.py +111 -0
  313. osn_selenium/executors/unified/cdp/file_system.py +15 -0
  314. osn_selenium/executors/unified/cdp/headless_experimental.py +38 -0
  315. osn_selenium/executors/unified/cdp/heap_profiler.py +101 -0
  316. osn_selenium/executors/unified/cdp/indexed_db.py +157 -0
  317. osn_selenium/executors/unified/cdp/input.py +254 -0
  318. osn_selenium/executors/unified/cdp/inspector.py +15 -0
  319. osn_selenium/executors/unified/cdp/io.py +29 -0
  320. osn_selenium/executors/unified/cdp/layer_tree.py +71 -0
  321. osn_selenium/executors/unified/cdp/log.py +29 -0
  322. osn_selenium/executors/unified/cdp/media.py +15 -0
  323. osn_selenium/executors/unified/cdp/memory.py +59 -0
  324. osn_selenium/executors/unified/cdp/network.py +323 -0
  325. osn_selenium/executors/unified/cdp/overlay.py +209 -0
  326. osn_selenium/executors/unified/cdp/page.py +410 -0
  327. osn_selenium/executors/unified/cdp/performance.py +27 -0
  328. osn_selenium/executors/unified/cdp/performance_timeline.py +17 -0
  329. osn_selenium/executors/unified/cdp/preload.py +15 -0
  330. osn_selenium/executors/unified/cdp/profiler.py +55 -0
  331. osn_selenium/executors/unified/cdp/pwa.py +55 -0
  332. osn_selenium/executors/unified/cdp/runtime.py +245 -0
  333. osn_selenium/executors/unified/cdp/schema.py +17 -0
  334. osn_selenium/executors/unified/cdp/security.py +27 -0
  335. osn_selenium/executors/unified/cdp/service_worker.py +62 -0
  336. osn_selenium/executors/unified/cdp/storage.py +178 -0
  337. osn_selenium/executors/unified/cdp/system_info.py +24 -0
  338. osn_selenium/executors/unified/cdp/target.py +165 -0
  339. osn_selenium/executors/unified/cdp/tethering.py +15 -0
  340. osn_selenium/executors/unified/cdp/tracing.py +62 -0
  341. osn_selenium/executors/unified/cdp/web_audio.py +18 -0
  342. osn_selenium/executors/unified/cdp/web_authn.py +103 -0
  343. osn_selenium/executors/unified/javascript.py +104 -0
  344. osn_selenium/flags/__init__.py +1 -0
  345. osn_selenium/flags/_functions.py +45 -0
  346. osn_selenium/flags/_typehints.py +34 -0
  347. osn_selenium/flags/_validators.py +101 -0
  348. osn_selenium/{webdrivers/BaseDriver/flags.py → flags/base.py} +159 -245
  349. osn_selenium/{webdrivers/Blink/flags.py → flags/blink.py} +130 -374
  350. osn_selenium/flags/chrome.py +259 -0
  351. osn_selenium/flags/edge.py +259 -0
  352. osn_selenium/flags/models/__init__.py +1 -0
  353. osn_selenium/flags/models/base.py +130 -0
  354. osn_selenium/flags/models/blink.py +263 -0
  355. osn_selenium/{webdrivers/Chrome/flags.py → flags/models/chrome.py} +25 -75
  356. osn_selenium/{webdrivers/Edge/flags.py → flags/models/edge.py} +25 -75
  357. osn_selenium/flags/models/values.py +44 -0
  358. osn_selenium/{webdrivers/Yandex/flags.py → flags/models/yandex.py} +26 -76
  359. osn_selenium/flags/yandex.py +259 -0
  360. osn_selenium/instances/__init__.py +1 -0
  361. osn_selenium/instances/_functions.py +242 -0
  362. osn_selenium/instances/_typehints.py +148 -0
  363. osn_selenium/instances/_utils.py +143 -0
  364. osn_selenium/instances/convert.py +287 -0
  365. osn_selenium/instances/protocols.py +105 -0
  366. osn_selenium/instances/sync/__init__.py +1 -0
  367. osn_selenium/instances/sync/action_chains/__init__.py +32 -0
  368. osn_selenium/instances/sync/action_chains/base.py +74 -0
  369. osn_selenium/instances/sync/action_chains/click.py +61 -0
  370. osn_selenium/instances/sync/action_chains/drag_and_drop.py +45 -0
  371. osn_selenium/instances/sync/action_chains/hm_keyboard.py +37 -0
  372. osn_selenium/instances/sync/action_chains/hm_move.py +81 -0
  373. osn_selenium/instances/sync/action_chains/hm_scroll.py +60 -0
  374. osn_selenium/instances/sync/action_chains/keyboard.py +55 -0
  375. osn_selenium/instances/sync/action_chains/move.py +46 -0
  376. osn_selenium/instances/sync/action_chains/scroll.py +43 -0
  377. osn_selenium/instances/sync/action_chains/utils.py +30 -0
  378. osn_selenium/instances/sync/alert.py +69 -0
  379. osn_selenium/instances/sync/browser.py +72 -0
  380. osn_selenium/instances/sync/browsing_context.py +193 -0
  381. osn_selenium/instances/sync/dialog.py +81 -0
  382. osn_selenium/instances/sync/fedcm.py +92 -0
  383. osn_selenium/instances/sync/mobile.py +75 -0
  384. osn_selenium/instances/sync/network.py +90 -0
  385. osn_selenium/instances/sync/permissions.py +80 -0
  386. osn_selenium/instances/sync/script.py +77 -0
  387. osn_selenium/instances/sync/shadow_root.py +113 -0
  388. osn_selenium/instances/sync/storage.py +91 -0
  389. osn_selenium/instances/sync/switch_to.py +92 -0
  390. osn_selenium/instances/sync/web_driver_wait.py +83 -0
  391. osn_selenium/instances/sync/web_element.py +179 -0
  392. osn_selenium/instances/sync/web_extension.py +77 -0
  393. osn_selenium/instances/trio_threads/__init__.py +1 -0
  394. osn_selenium/instances/trio_threads/action_chains/__init__.py +32 -0
  395. osn_selenium/instances/trio_threads/action_chains/base.py +88 -0
  396. osn_selenium/instances/trio_threads/action_chains/click.py +71 -0
  397. osn_selenium/instances/trio_threads/action_chains/drag_and_drop.py +49 -0
  398. osn_selenium/instances/trio_threads/action_chains/hm_keyboard.py +41 -0
  399. osn_selenium/instances/trio_threads/action_chains/hm_move.py +91 -0
  400. osn_selenium/instances/trio_threads/action_chains/hm_scroll.py +66 -0
  401. osn_selenium/instances/trio_threads/action_chains/keyboard.py +63 -0
  402. osn_selenium/instances/trio_threads/action_chains/move.py +52 -0
  403. osn_selenium/instances/trio_threads/action_chains/scroll.py +49 -0
  404. osn_selenium/instances/trio_threads/action_chains/utils.py +32 -0
  405. osn_selenium/instances/trio_threads/alert.py +87 -0
  406. osn_selenium/instances/trio_threads/browser.py +90 -0
  407. osn_selenium/instances/trio_threads/browsing_context.py +216 -0
  408. osn_selenium/instances/trio_threads/dialog.py +99 -0
  409. osn_selenium/instances/trio_threads/fedcm.py +110 -0
  410. osn_selenium/instances/trio_threads/mobile.py +93 -0
  411. osn_selenium/instances/trio_threads/network.py +108 -0
  412. osn_selenium/instances/trio_threads/permissions.py +102 -0
  413. osn_selenium/instances/trio_threads/script.py +95 -0
  414. osn_selenium/instances/trio_threads/shadow_root.py +154 -0
  415. osn_selenium/instances/trio_threads/storage.py +109 -0
  416. osn_selenium/instances/trio_threads/switch_to.py +124 -0
  417. osn_selenium/instances/trio_threads/web_driver_wait.py +101 -0
  418. osn_selenium/instances/trio_threads/web_element.py +217 -0
  419. osn_selenium/instances/trio_threads/web_extension.py +99 -0
  420. osn_selenium/instances/unified/__init__.py +1 -0
  421. osn_selenium/instances/unified/action_chains/__init__.py +22 -0
  422. osn_selenium/instances/unified/action_chains/base.py +31 -0
  423. osn_selenium/instances/unified/action_chains/click.py +27 -0
  424. osn_selenium/instances/unified/action_chains/drag_and_drop.py +24 -0
  425. osn_selenium/instances/unified/action_chains/hm_keyboard.py +30 -0
  426. osn_selenium/instances/unified/action_chains/hm_move.py +66 -0
  427. osn_selenium/instances/unified/action_chains/hm_scroll.py +79 -0
  428. osn_selenium/instances/unified/action_chains/keyboard.py +24 -0
  429. osn_selenium/instances/unified/action_chains/move.py +24 -0
  430. osn_selenium/instances/unified/action_chains/scroll.py +21 -0
  431. osn_selenium/instances/unified/action_chains/utils.py +19 -0
  432. osn_selenium/instances/unified/alert.py +29 -0
  433. osn_selenium/instances/unified/browser.py +33 -0
  434. osn_selenium/instances/unified/browsing_context.py +151 -0
  435. osn_selenium/instances/unified/dialog.py +42 -0
  436. osn_selenium/instances/unified/fedcm.py +48 -0
  437. osn_selenium/instances/unified/mobile.py +36 -0
  438. osn_selenium/instances/unified/network.py +50 -0
  439. osn_selenium/instances/unified/permissions.py +43 -0
  440. osn_selenium/instances/unified/script.py +38 -0
  441. osn_selenium/instances/unified/shadow_root.py +46 -0
  442. osn_selenium/instances/unified/storage.py +48 -0
  443. osn_selenium/instances/unified/switch_to.py +49 -0
  444. osn_selenium/instances/unified/web_driver_wait.py +45 -0
  445. osn_selenium/instances/unified/web_element.py +145 -0
  446. osn_selenium/instances/unified/web_extension.py +38 -0
  447. osn_selenium/javascript/__init__.py +1 -0
  448. osn_selenium/javascript/_functions.py +63 -0
  449. osn_selenium/javascript/fingerprint/__init__.py +120 -0
  450. osn_selenium/javascript/fingerprint/_decorators.py +41 -0
  451. osn_selenium/javascript/fingerprint/_detect/__init__.py +1 -0
  452. osn_selenium/javascript/fingerprint/_detect/functions.py +253 -0
  453. osn_selenium/javascript/fingerprint/_detect/templates.py +128 -0
  454. osn_selenium/javascript/fingerprint/_functions.py +35 -0
  455. osn_selenium/javascript/fingerprint/_typehints.py +27 -0
  456. osn_selenium/javascript/fingerprint/registry/__init__.py +7 -0
  457. osn_selenium/javascript/fingerprint/registry/_core_functions.py +236 -0
  458. osn_selenium/javascript/fingerprint/registry/_functions.py +923 -0
  459. osn_selenium/javascript/fingerprint/registry/_typehints.py +6 -0
  460. osn_selenium/javascript/fingerprint/registry/_utils.py +6 -0
  461. osn_selenium/javascript/fingerprint/registry/models.py +41 -0
  462. osn_selenium/javascript/fingerprint/spoof/__init__.py +1 -0
  463. osn_selenium/javascript/fingerprint/spoof/_functions.py +172 -0
  464. osn_selenium/javascript/fingerprint/spoof/_templates.py +134 -0
  465. osn_selenium/javascript/fingerprint/spoof/_typehints.py +22 -0
  466. osn_selenium/javascript/fingerprint/spoof/core_rules.py +141 -0
  467. osn_selenium/javascript/fingerprint/spoof/noise.py +51 -0
  468. osn_selenium/javascript/fingerprint/spoof/rules.py +313 -0
  469. osn_selenium/javascript/functions.py +44 -0
  470. osn_selenium/javascript/models.py +35 -0
  471. osn_selenium/javascript/scripts/start_fingerprint_detection.js +56 -0
  472. osn_selenium/models.py +94 -0
  473. osn_selenium/trio_threads_mixin.py +159 -0
  474. osn_selenium/webdrivers/_args_helpers.py +181 -0
  475. osn_selenium/webdrivers/_bridges.py +57 -0
  476. osn_selenium/webdrivers/_decorators.py +83 -0
  477. osn_selenium/webdrivers/_executable_tables/__init__.py +1 -0
  478. osn_selenium/webdrivers/_executable_tables/functions.py +113 -0
  479. osn_selenium/webdrivers/_executable_tables/models.py +19 -0
  480. osn_selenium/webdrivers/_typehints.py +10 -0
  481. osn_selenium/webdrivers/protocols.py +50 -0
  482. osn_selenium/webdrivers/sync/__init__.py +1 -0
  483. osn_selenium/webdrivers/sync/blink/__init__.py +124 -0
  484. osn_selenium/webdrivers/sync/blink/base.py +140 -0
  485. osn_selenium/webdrivers/sync/blink/casting.py +34 -0
  486. osn_selenium/webdrivers/sync/blink/features.py +28 -0
  487. osn_selenium/webdrivers/sync/blink/lifecycle.py +66 -0
  488. osn_selenium/webdrivers/sync/blink/logging.py +25 -0
  489. osn_selenium/webdrivers/sync/blink/network.py +28 -0
  490. osn_selenium/webdrivers/sync/blink/settings.py +63 -0
  491. osn_selenium/webdrivers/sync/chrome/__init__.py +102 -0
  492. osn_selenium/webdrivers/sync/chrome/base.py +118 -0
  493. osn_selenium/webdrivers/sync/chrome/lifecycle.py +63 -0
  494. osn_selenium/webdrivers/sync/chrome/settings.py +58 -0
  495. osn_selenium/webdrivers/sync/core/__init__.py +100 -0
  496. osn_selenium/webdrivers/sync/core/actions.py +59 -0
  497. osn_selenium/webdrivers/sync/core/auth.py +77 -0
  498. osn_selenium/webdrivers/sync/core/base.py +175 -0
  499. osn_selenium/webdrivers/sync/core/capture.py +37 -0
  500. osn_selenium/webdrivers/sync/core/comonents.py +57 -0
  501. osn_selenium/webdrivers/sync/core/devtools.py +47 -0
  502. osn_selenium/webdrivers/sync/core/element.py +42 -0
  503. osn_selenium/webdrivers/sync/core/file.py +40 -0
  504. osn_selenium/webdrivers/sync/core/lifecycle.py +59 -0
  505. osn_selenium/webdrivers/sync/core/navigation.py +36 -0
  506. osn_selenium/webdrivers/sync/core/script.py +53 -0
  507. osn_selenium/webdrivers/sync/core/settings.py +35 -0
  508. osn_selenium/webdrivers/sync/core/storage.py +48 -0
  509. osn_selenium/webdrivers/sync/core/timeouts.py +59 -0
  510. osn_selenium/webdrivers/sync/core/window.py +99 -0
  511. osn_selenium/webdrivers/sync/edge/__init__.py +102 -0
  512. osn_selenium/webdrivers/sync/edge/base.py +114 -0
  513. osn_selenium/webdrivers/sync/edge/lifecycle.py +63 -0
  514. osn_selenium/webdrivers/sync/edge/settings.py +58 -0
  515. osn_selenium/webdrivers/sync/yandex/__init__.py +102 -0
  516. osn_selenium/webdrivers/sync/yandex/base.py +111 -0
  517. osn_selenium/webdrivers/sync/yandex/lifecycle.py +63 -0
  518. osn_selenium/webdrivers/sync/yandex/settings.py +58 -0
  519. osn_selenium/webdrivers/trio_threads/__init__.py +1 -0
  520. osn_selenium/webdrivers/trio_threads/blink/__init__.py +134 -0
  521. osn_selenium/webdrivers/trio_threads/blink/base.py +143 -0
  522. osn_selenium/webdrivers/trio_threads/blink/casting.py +35 -0
  523. osn_selenium/webdrivers/trio_threads/blink/features.py +29 -0
  524. osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +66 -0
  525. osn_selenium/webdrivers/trio_threads/blink/logging.py +26 -0
  526. osn_selenium/webdrivers/trio_threads/blink/network.py +29 -0
  527. osn_selenium/webdrivers/trio_threads/blink/settings.py +63 -0
  528. osn_selenium/webdrivers/trio_threads/chrome/__init__.py +114 -0
  529. osn_selenium/webdrivers/trio_threads/chrome/base.py +119 -0
  530. osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +63 -0
  531. osn_selenium/webdrivers/trio_threads/chrome/settings.py +63 -0
  532. osn_selenium/webdrivers/trio_threads/core/__init__.py +115 -0
  533. osn_selenium/webdrivers/trio_threads/core/actions.py +72 -0
  534. osn_selenium/webdrivers/trio_threads/core/auth.py +88 -0
  535. osn_selenium/webdrivers/trio_threads/core/base.py +199 -0
  536. osn_selenium/webdrivers/trio_threads/core/capture.py +38 -0
  537. osn_selenium/webdrivers/trio_threads/core/comonents.py +92 -0
  538. osn_selenium/webdrivers/trio_threads/core/devtools.py +53 -0
  539. osn_selenium/webdrivers/trio_threads/core/element.py +58 -0
  540. osn_selenium/webdrivers/trio_threads/core/file.py +45 -0
  541. osn_selenium/webdrivers/trio_threads/core/lifecycle.py +60 -0
  542. osn_selenium/webdrivers/trio_threads/core/navigation.py +41 -0
  543. osn_selenium/webdrivers/trio_threads/core/script.py +59 -0
  544. osn_selenium/webdrivers/trio_threads/core/settings.py +36 -0
  545. osn_selenium/webdrivers/trio_threads/core/storage.py +54 -0
  546. osn_selenium/webdrivers/trio_threads/core/timeouts.py +60 -0
  547. osn_selenium/webdrivers/trio_threads/core/window.py +105 -0
  548. osn_selenium/webdrivers/trio_threads/edge/__init__.py +114 -0
  549. osn_selenium/webdrivers/trio_threads/edge/base.py +115 -0
  550. osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +63 -0
  551. osn_selenium/webdrivers/trio_threads/edge/settings.py +63 -0
  552. osn_selenium/webdrivers/trio_threads/yandex/__init__.py +114 -0
  553. osn_selenium/webdrivers/trio_threads/yandex/base.py +112 -0
  554. osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +63 -0
  555. osn_selenium/webdrivers/trio_threads/yandex/settings.py +63 -0
  556. osn_selenium/webdrivers/unified/__init__.py +1 -0
  557. osn_selenium/webdrivers/unified/blink/__init__.py +1 -0
  558. osn_selenium/webdrivers/unified/blink/base.py +135 -0
  559. osn_selenium/webdrivers/unified/blink/casting.py +30 -0
  560. osn_selenium/webdrivers/unified/blink/features.py +22 -0
  561. osn_selenium/webdrivers/unified/blink/lifecycle.py +114 -0
  562. osn_selenium/webdrivers/unified/blink/logging.py +18 -0
  563. osn_selenium/webdrivers/unified/blink/network.py +22 -0
  564. osn_selenium/webdrivers/unified/blink/settings.py +86 -0
  565. osn_selenium/webdrivers/unified/chrome/__init__.py +1 -0
  566. osn_selenium/webdrivers/unified/chrome/base.py +58 -0
  567. osn_selenium/webdrivers/unified/chrome/lifecycle.py +88 -0
  568. osn_selenium/webdrivers/unified/chrome/settings.py +48 -0
  569. osn_selenium/webdrivers/unified/core/__init__.py +1 -0
  570. osn_selenium/webdrivers/unified/core/actions.py +43 -0
  571. osn_selenium/webdrivers/unified/core/auth.py +70 -0
  572. osn_selenium/webdrivers/unified/core/base.py +139 -0
  573. osn_selenium/webdrivers/unified/core/capture.py +32 -0
  574. osn_selenium/webdrivers/unified/core/components.py +32 -0
  575. osn_selenium/webdrivers/unified/core/devtools.py +35 -0
  576. osn_selenium/webdrivers/unified/core/element.py +24 -0
  577. osn_selenium/webdrivers/unified/core/file.py +35 -0
  578. osn_selenium/webdrivers/unified/core/lifecycle.py +84 -0
  579. osn_selenium/webdrivers/unified/core/navigation.py +31 -0
  580. osn_selenium/webdrivers/unified/core/script.py +32 -0
  581. osn_selenium/webdrivers/unified/core/settings.py +44 -0
  582. osn_selenium/webdrivers/unified/core/storage.py +37 -0
  583. osn_selenium/webdrivers/unified/core/timeouts.py +56 -0
  584. osn_selenium/webdrivers/unified/core/window.py +135 -0
  585. osn_selenium/webdrivers/unified/edge/__init__.py +1 -0
  586. osn_selenium/webdrivers/unified/edge/base.py +56 -0
  587. osn_selenium/webdrivers/unified/edge/lifecycle.py +88 -0
  588. osn_selenium/webdrivers/unified/edge/settings.py +48 -0
  589. osn_selenium/webdrivers/unified/yandex/__init__.py +1 -0
  590. osn_selenium/webdrivers/unified/yandex/base.py +58 -0
  591. osn_selenium/webdrivers/unified/yandex/lifecycle.py +58 -0
  592. osn_selenium/webdrivers/unified/yandex/settings.py +48 -0
  593. osn_selenium-1.1.0.dist-info/METADATA +252 -0
  594. osn_selenium-1.1.0.dist-info/RECORD +615 -0
  595. {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/WHEEL +1 -1
  596. osn_selenium/captcha_workers/__init__.py +0 -26
  597. osn_selenium/dev_tools/_types.py +0 -22
  598. osn_selenium/dev_tools/errors.py +0 -89
  599. osn_selenium/dev_tools/logger.py +0 -558
  600. osn_selenium/dev_tools/manager.py +0 -1551
  601. osn_selenium/dev_tools/utils.py +0 -509
  602. osn_selenium/errors.py +0 -16
  603. osn_selenium/types.py +0 -118
  604. osn_selenium/webdrivers/BaseDriver/_utils.py +0 -37
  605. osn_selenium/webdrivers/BaseDriver/protocols.py +0 -2135
  606. osn_selenium/webdrivers/BaseDriver/trio_wrapper.py +0 -71
  607. osn_selenium/webdrivers/BaseDriver/webdriver.py +0 -2626
  608. osn_selenium/webdrivers/Blink/protocols.py +0 -330
  609. osn_selenium/webdrivers/Blink/webdriver.py +0 -637
  610. osn_selenium/webdrivers/Chrome/protocols.py +0 -228
  611. osn_selenium/webdrivers/Chrome/webdriver.py +0 -394
  612. osn_selenium/webdrivers/Edge/protocols.py +0 -228
  613. osn_selenium/webdrivers/Edge/webdriver.py +0 -394
  614. osn_selenium/webdrivers/Yandex/protocols.py +0 -211
  615. osn_selenium/webdrivers/Yandex/webdriver.py +0 -350
  616. osn_selenium/webdrivers/_functions.py +0 -504
  617. osn_selenium/webdrivers/types.py +0 -390
  618. osn_selenium-0.0.0.dist-info/METADATA +0 -710
  619. osn_selenium-0.0.0.dist-info/RECORD +0 -57
  620. /osn_selenium/{webdrivers/BaseDriver → abstract}/__init__.py +0 -0
  621. /osn_selenium/{webdrivers/Blink → abstract/executors}/__init__.py +0 -0
  622. /osn_selenium/{webdrivers/Chrome → abstract/instances}/__init__.py +0 -0
  623. /osn_selenium/{webdrivers/Edge → abstract/webdriver}/__init__.py +0 -0
  624. /osn_selenium/{webdrivers/Yandex → dev_tools/logger}/__init__.py +0 -0
  625. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/check_element_in_viewport.js +0 -0
  626. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_document_scroll_size.js +0 -0
  627. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_css.js +0 -0
  628. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_rect_in_viewport.js +0 -0
  629. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_random_element_point_in_viewport.js +0 -0
  630. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_position.js +0 -0
  631. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_rect.js +0 -0
  632. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_size.js +0 -0
  633. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/open_new_tab.js +0 -0
  634. /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/stop_window_loading.js +0 -0
  635. {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,278 @@
1
+ import trio
2
+ import pathlib
3
+ from typing import (
4
+ Callable,
5
+ Optional,
6
+ Tuple
7
+ )
8
+ from osn_selenium.dev_tools.models import TargetData
9
+ from osn_selenium.dev_tools.settings import LoggerSettings
10
+ from osn_selenium.exceptions.devtools import TrioEndExceptions
11
+ from osn_selenium.dev_tools._validators import validate_log_filter
12
+ from osn_selenium.dev_tools._exception_helpers import log_exception
13
+ from osn_selenium.dev_tools.logger.models import (
14
+ CDPTargetLogEntry,
15
+ FingerprintTargetLogEntry
16
+ )
17
+
18
+
19
+ __all__ = ["TargetLogger", "build_target_logger"]
20
+
21
+
22
+ class TargetLogger:
23
+ """
24
+ Manages logging for a specific browser target (e.g., a tab or iframe).
25
+
26
+ Each `TargetLogger` instance is responsible for writing log entries
27
+ related to its associated `TargetData` to a dedicated file.
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ logger_settings: LoggerSettings,
33
+ nursery_object: trio.Nursery,
34
+ target_data: TargetData,
35
+ cdp_receive_channel: Optional[trio.MemoryReceiveChannel[CDPTargetLogEntry]],
36
+ fingerprint_receive_channel: Optional[trio.MemoryReceiveChannel[FingerprintTargetLogEntry]],
37
+ ):
38
+ """
39
+ Initializes the TargetLogger.
40
+
41
+ Args:
42
+ logger_settings (LoggerSettings): Configuration for logging.
43
+ nursery_object (trio.Nursery): The Trio nursery to spawn background tasks.
44
+ target_data (TargetData): The data of the browser target this logger will log for.
45
+ cdp_receive_channel (Optional[trio.MemoryReceiveChannel[CDPTargetLogEntry]]):
46
+ Channel to receive CDP logs.
47
+ fingerprint_receive_channel (Optional[trio.MemoryReceiveChannel[FingerprintTargetLogEntry]]):
48
+ Channel to receive fingerprint logs.
49
+
50
+ Raises:
51
+ ValueError: If settings require logging but `dir_path` is not set.
52
+ """
53
+
54
+ self._target_data = target_data
55
+ self._nursery_object = nursery_object
56
+ self._cdp_receive_channel = cdp_receive_channel
57
+ self._fingerprint_receive_channel = fingerprint_receive_channel
58
+ self._cdp_file_path: Optional[pathlib.Path] = None
59
+ self._cdp_log_level_filter: Optional[Callable[[str], bool]] = None
60
+ self._cdp_target_type_filter: Optional[Callable[[str], bool]] = None
61
+ self._fingerprint_file_path: Optional[pathlib.Path] = None
62
+ self._fingerprint_log_level_filter: Optional[Callable[[str], bool]] = None
63
+ self._fingerprint_target_type_filter: Optional[Callable[[str], bool]] = None
64
+
65
+ if logger_settings.dir_path is None:
66
+ if logger_settings.cdp_settings:
67
+ raise ValueError("Can't log CDP without LoggerSettings.dir_path!")
68
+
69
+ if logger_settings.fingerprint_settings:
70
+ raise ValueError("Can't log Fingerprint without LoggerSettings.log_dir_path!")
71
+ else:
72
+ logdir_path = logger_settings.dir_path.joinpath(target_data.target_id)
73
+ logdir_path.mkdir(exist_ok=True)
74
+
75
+ if logger_settings.cdp_settings:
76
+ self._cdp_file_path = logdir_path.joinpath(f"cdp_log.txt")
77
+
78
+ self._cdp_log_level_filter = validate_log_filter(
79
+ logger_settings.cdp_settings.log_level_filter_mode,
80
+ logger_settings.cdp_settings.log_level_filter
81
+ )
82
+
83
+ self._cdp_target_type_filter = validate_log_filter(
84
+ logger_settings.cdp_settings.target_type_filter_mode,
85
+ logger_settings.cdp_settings.target_type_filter
86
+ )
87
+
88
+ if logger_settings.fingerprint_settings:
89
+ self._fingerprint_file_path = logdir_path.joinpath(f"fingerprint_log.txt")
90
+
91
+ self._fingerprint_log_level_filter = validate_log_filter(
92
+ logger_settings.fingerprint_settings.log_level_filter_mode,
93
+ logger_settings.fingerprint_settings.log_level_filter
94
+ )
95
+
96
+ self._fingerprint_category_filter = validate_log_filter(
97
+ logger_settings.fingerprint_settings.category_filter_mode,
98
+ logger_settings.fingerprint_settings.category_filter
99
+ )
100
+
101
+ self._cdp_file_writing_stopped: Optional[trio.Event] = None
102
+ self._fingerprint_file_writing_stopped: Optional[trio.Event] = None
103
+ self._is_active = False
104
+
105
+ def filter_cdp_log(self, log_entry: CDPTargetLogEntry) -> bool:
106
+ """
107
+ Applies configured filters to a CDP log entry.
108
+
109
+ Args:
110
+ log_entry (CDPTargetLogEntry): The log entry to check.
111
+
112
+ Returns:
113
+ bool: True if the log entry passes filters, False otherwise.
114
+ """
115
+
116
+ return self._cdp_log_level_filter(log_entry.level) and self._cdp_target_type_filter(log_entry.target_data.type_)
117
+
118
+ def filter_fingerprint_log(self, log_entry: FingerprintTargetLogEntry) -> bool:
119
+ """
120
+ Applies configured filters to a fingerprint log entry.
121
+
122
+ Args:
123
+ log_entry (FingerprintTargetLogEntry): The log entry to check.
124
+
125
+ Returns:
126
+ bool: True if the log entry passes filters, False otherwise.
127
+ """
128
+
129
+ return self._fingerprint_log_level_filter(log_entry.level) and self._fingerprint_category_filter(log_entry.api)
130
+
131
+ @property
132
+ def is_active(self) -> bool:
133
+ """
134
+ Checks if the target logger is currently active.
135
+
136
+ Returns:
137
+ bool: True if the logger is active and running, False otherwise.
138
+ """
139
+
140
+ return self._is_active
141
+
142
+ async def close(self):
143
+ """
144
+ Closes the target logger, including its receive channels and stops writing tasks.
145
+ """
146
+
147
+ if self._cdp_receive_channel is not None:
148
+ await self._cdp_receive_channel.aclose()
149
+ self._cdp_receive_channel = None
150
+
151
+ if self._cdp_file_writing_stopped is not None:
152
+ await self._cdp_file_writing_stopped.wait()
153
+ self._cdp_file_writing_stopped = None
154
+
155
+ if self._fingerprint_receive_channel is not None:
156
+ await self._fingerprint_receive_channel.aclose()
157
+ self._fingerprint_receive_channel = None
158
+
159
+ if self._fingerprint_file_writing_stopped is not None:
160
+ await self._fingerprint_file_writing_stopped.wait()
161
+ self._fingerprint_file_writing_stopped = None
162
+
163
+ self._is_active = False
164
+
165
+ async def _write_fingerprint_file(self):
166
+ """
167
+ Asynchronously writes fingerprint log entries to the target-specific file.
168
+
169
+ This method continuously receives `FingerprintTargetLogEntry` objects,
170
+ filters them, and appends them to the log file.
171
+ """
172
+
173
+ try:
174
+ end_of_entry = "\n\n" + "=" * 100 + "\n\n"
175
+
176
+ async with await trio.open_file(self._fingerprint_file_path, "a+", encoding="utf-8") as file:
177
+ async for log_entry in self._fingerprint_receive_channel:
178
+ await file.write(log_entry.model_dump_json(indent=4) + end_of_entry)
179
+ await file.flush()
180
+ except* TrioEndExceptions:
181
+ pass
182
+ except* BaseException as error:
183
+ log_exception(error)
184
+ finally:
185
+ if self._fingerprint_file_writing_stopped is not None:
186
+ self._fingerprint_file_writing_stopped.set()
187
+
188
+ async def _write_cdp_file(self):
189
+ """
190
+ Asynchronously writes CDP log entries to the target-specific file.
191
+
192
+ This method continuously receives `CDPTargetLogEntry` objects from its channel
193
+ and appends their string representation to the configured file,
194
+ applying log level and target type filters.
195
+ It runs as a background task.
196
+ """
197
+
198
+ try:
199
+ end_of_entry = "\n\n" + "=" * 100 + "\n\n"
200
+
201
+ async with await trio.open_file(self._cdp_file_path, "a+", encoding="utf-8") as file:
202
+ async for log_entry in self._cdp_receive_channel:
203
+ await file.write(log_entry.model_dump_json(indent=4) + end_of_entry)
204
+ await file.flush()
205
+ except* TrioEndExceptions:
206
+ pass
207
+ except* BaseException as error:
208
+ log_exception(error)
209
+ finally:
210
+ if self._cdp_file_writing_stopped is not None:
211
+ self._cdp_file_writing_stopped.set()
212
+
213
+ async def run(self):
214
+ """
215
+ Starts the target logger, setting up its receive channel and file writing task.
216
+ """
217
+
218
+ try:
219
+ if not self._is_active:
220
+ self._cdp_file_writing_stopped = trio.Event()
221
+
222
+ if self._cdp_file_path is not None:
223
+ self._nursery_object.start_soon(self._write_cdp_file)
224
+
225
+ self._fingerprint_file_writing_stopped = trio.Event()
226
+
227
+ if self._fingerprint_file_path is not None:
228
+ self._nursery_object.start_soon(self._write_fingerprint_file)
229
+
230
+ self._is_active = True
231
+ except* TrioEndExceptions:
232
+ await self.close()
233
+ except* BaseException as error:
234
+ log_exception(error)
235
+ await self.close()
236
+
237
+
238
+ def build_target_logger(
239
+ target_data: TargetData,
240
+ nursery_object: trio.Nursery,
241
+ logger_settings: LoggerSettings
242
+ ) -> Tuple[
243
+ Optional[trio.MemorySendChannel[CDPTargetLogEntry]],
244
+ Optional[trio.MemorySendChannel[FingerprintTargetLogEntry]],
245
+ TargetLogger
246
+ ]:
247
+ """
248
+ Builds and initializes a `TargetLogger` instance.
249
+
250
+ Args:
251
+ target_data (TargetData): Data associated with the target.
252
+ nursery_object (trio.Nursery): Trio nursery for background tasks.
253
+ logger_settings (LoggerSettings): Logger configuration.
254
+
255
+ Returns:
256
+ Tuple[Optional[trio.MemorySendChannel[CDPTargetLogEntry]], Optional[trio.MemorySendChannel[FingerprintTargetLogEntry]], TargetLogger]:
257
+ Tuple containing send channels for logs and the initialized logger instance.
258
+ """
259
+
260
+ if logger_settings.cdp_settings is not None:
261
+ cdp_send, cdp_recv = trio.open_memory_channel(logger_settings.cdp_settings.buffer_size)
262
+ else:
263
+ cdp_send, cdp_recv = None, None
264
+
265
+ if logger_settings.fingerprint_settings is not None:
266
+ fp_send, fp_recv = trio.open_memory_channel(logger_settings.fingerprint_settings.buffer_size)
267
+ else:
268
+ fp_send, fp_recv = None, None
269
+
270
+ target_logger = TargetLogger(
271
+ logger_settings=logger_settings,
272
+ nursery_object=nursery_object,
273
+ target_data=target_data,
274
+ cdp_receive_channel=cdp_recv,
275
+ fingerprint_receive_channel=fp_recv,
276
+ )
277
+
278
+ return cdp_send, fp_send, target_logger
@@ -0,0 +1,16 @@
1
+ from osn_selenium.dev_tools.manager.settings import SettingsMixin
2
+ from osn_selenium.dev_tools.manager.lifecycle import LifecycleMixin
3
+
4
+
5
+ __all__ = ["DevTools"]
6
+
7
+
8
+ class DevTools(LifecycleMixin, SettingsMixin):
9
+ """
10
+ Main entry point for managing Chrome DevTools Protocol (CDP) interactions.
11
+
12
+ This class combines lifecycle management, settings configuration, and target handling
13
+ to provide a comprehensive interface for controlling browser behavior via CDP.
14
+ """
15
+
16
+ pass
@@ -0,0 +1,124 @@
1
+ import trio
2
+ from contextlib import (
3
+ AbstractAsyncContextManager
4
+ )
5
+ from osn_selenium.dev_tools.target import DevToolsTarget
6
+ from osn_selenium.dev_tools.logger.main import MainLogger
7
+ from osn_selenium.dev_tools.domains import DomainsSettings
8
+ from osn_selenium.dev_tools._wrappers import DevToolsPackage
9
+ from osn_selenium.dev_tools.settings import DevToolsSettings
10
+ from typing import (
11
+ Any,
12
+ Dict,
13
+ Optional,
14
+ TYPE_CHECKING
15
+ )
16
+ from osn_selenium.dev_tools._system_utils import prepare_log_dir
17
+ from selenium.webdriver.remote.bidi_connection import BidiConnection
18
+ from osn_selenium.dev_tools.logger.models import (
19
+ CDPLogLevelStats,
20
+ CDPMainLogEntry,
21
+ CDPTargetTypeStats,
22
+ FingerprintAPIStats,
23
+ FingerprintLogLevelStats,
24
+ FingerprintMainLogEntry
25
+ )
26
+
27
+
28
+ __all__ = ["BaseMixin"]
29
+
30
+ if TYPE_CHECKING:
31
+ from osn_selenium.webdrivers.trio_threads.core import CoreWebDriver
32
+
33
+
34
+ class BaseMixin:
35
+ """
36
+ Base class for handling DevTools functionalities in Selenium WebDriver.
37
+
38
+ Provides an interface to interact with Chrome DevTools Protocol (CDP)
39
+ for advanced browser control and monitoring. This class supports event handling
40
+ and allows for dynamic modifications of browser behavior, such as network request interception,
41
+ by using an asynchronous context manager.
42
+
43
+ Attributes:
44
+ targets_lock (trio.Lock): A lock used for synchronizing access to shared resources, like the List of handled targets.
45
+ exit_event (Optional[trio.Event]): Trio Event to signal exiting of DevTools event handling.
46
+ """
47
+
48
+ def __init__(
49
+ self,
50
+ parent_webdriver: "CoreWebDriver",
51
+ devtools_settings: Optional[DevToolsSettings] = None
52
+ ):
53
+ """
54
+ Initializes the DevTools manager.
55
+
56
+ Args:
57
+ parent_webdriver (CoreWebDriver): The WebDriver instance to which this DevTools manager is attached.
58
+ devtools_settings (Optional[DevToolsSettings]): Configuration settings for DevTools.
59
+ If None, default settings will be used.
60
+ """
61
+
62
+ if devtools_settings is None:
63
+ devtools_settings = DevToolsSettings()
64
+
65
+ self._webdriver = parent_webdriver
66
+ self._logger_settings = devtools_settings.logger_settings
67
+ self._domains_settings = devtools_settings.domains_settings
68
+ self._fingerprint_settings = devtools_settings.fingerprint_settings
69
+ self._new_targets_buffer_size = devtools_settings.new_targets_buffer_size
70
+ self._target_background_task = devtools_settings.target_background_task
71
+
72
+ self._new_targets_filter = [
73
+ filter_.model_dump(exclude_none=True, by_alias=True)
74
+ for filter_ in devtools_settings.new_targets_filter
75
+ ] if devtools_settings.new_targets_filter is not None else None
76
+
77
+ self._bidi_connection: Optional[AbstractAsyncContextManager[BidiConnection, Any]] = None
78
+ self._bidi_connection_object: Optional[BidiConnection] = None
79
+ self._devtools_package: Optional[DevToolsPackage] = None
80
+ self._websocket_url: Optional[str] = None
81
+ self._nursery: Optional[AbstractAsyncContextManager[trio.Nursery, Optional[bool]]] = None
82
+ self._nursery_object: Optional[trio.Nursery] = None
83
+ self._handling_targets: Dict[str, DevToolsTarget] = {}
84
+ self.targets_lock = trio.Lock()
85
+ self.exit_event: Optional[trio.Event] = None
86
+ self._is_active = False
87
+ self._is_closing = False
88
+ self._num_cdp_logs = 0
89
+ self._num_fingerprint_logs = 0
90
+ self._cdp_targets_types_stats: Dict[str, CDPTargetTypeStats] = {}
91
+ self._cdp_log_level_stats: Dict[str, CDPLogLevelStats] = {}
92
+ self._main_logger_cdp_send_channel: Optional[trio.MemorySendChannel[CDPMainLogEntry]] = None
93
+ self._fingerprint_categories_stats: Dict[str, FingerprintAPIStats] = {}
94
+ self._fingerprint_log_level_stats: Dict[str, FingerprintLogLevelStats] = {}
95
+ self._main_logger_fingerprint_send_channel: Optional[trio.MemorySendChannel[FingerprintMainLogEntry]] = None
96
+ self._main_logger: Optional[MainLogger] = None
97
+ self._fingerprint_injection_script: Optional[str] = None
98
+
99
+ prepare_log_dir(logger_settings=devtools_settings.logger_settings)
100
+
101
+ @property
102
+ def is_active(self) -> bool:
103
+ """
104
+ Checks if DevTools is currently active.
105
+
106
+ Returns:
107
+ bool: True if DevTools event handler context manager is active, False otherwise.
108
+ """
109
+
110
+ return self._is_active
111
+
112
+ @property
113
+ def websocket_url(self) -> Optional[str]:
114
+ """
115
+ Gets the WebSocket URL for the DevTools session.
116
+
117
+ This URL is used to establish a direct Chrome DevTools Protocol (CDP) connection
118
+ to the browser, enabling low-level control and event listening.
119
+
120
+ Returns:
121
+ Optional[str]: The WebSocket URL, or None if it has not been retrieved yet.
122
+ """
123
+
124
+ return self._websocket_url
@@ -0,0 +1,236 @@
1
+ import trio
2
+ from types import TracebackType
3
+ from typing import Optional, Type
4
+ from osn_selenium.dev_tools._decorators import log_on_error
5
+ from osn_selenium.dev_tools._wrappers import DevToolsPackage
6
+ from osn_selenium.dev_tools.manager.targets import TargetsMixin
7
+ from osn_selenium.dev_tools.logger.main import build_main_logger
8
+ from osn_selenium.dev_tools._exception_helpers import log_exception
9
+ from osn_selenium.exceptions.devtools import (
10
+ BidiConnectionNotEstablishedError,
11
+ CDPEndExceptions,
12
+ CantEnterDevToolsContextError
13
+ )
14
+
15
+
16
+ __all__ = ["LifecycleMixin"]
17
+
18
+
19
+ class LifecycleMixin(TargetsMixin):
20
+ """
21
+ Mixin managing the lifecycle of the DevTools context, including connection setup and teardown.
22
+ """
23
+
24
+ def _get_websocket_url(self) -> None:
25
+ """
26
+ Retrieves the WebSocket URL for DevTools from the WebDriver.
27
+
28
+ This method attempts to get the WebSocket URL from the WebDriver capabilities or by directly querying the CDP details.
29
+ The WebSocket URL is necessary to establish a connection to the browser's DevTools.
30
+
31
+ Returns:
32
+ None: The WebSocket URL for DevTools, or None if it cannot be retrieved.
33
+
34
+ Raises:
35
+ CDPEndExceptions: If a CDP-related connection error occurs.
36
+ BaseException: If another unexpected error occurs during URL retrieval.
37
+ """
38
+
39
+ try:
40
+ driver = self._webdriver.driver
41
+
42
+ if driver is None:
43
+ self._websocket_url = None
44
+
45
+ if driver.caps.get("se:cdp"):
46
+ self._websocket_url = driver.caps.get("se:cdp")
47
+
48
+ self._websocket_url = driver._get_cdp_details()[1]
49
+ except CDPEndExceptions as error:
50
+ raise error
51
+ except BaseException as error:
52
+ log_exception(error)
53
+ raise error
54
+
55
+ def _get_devtools_package(self) -> None:
56
+ """
57
+ Retrieves the DevTools protocol package from the active BiDi connection.
58
+
59
+ Returns:
60
+ DevToolsPackage: The DevTools protocol package object, providing access to CDP domains and commands.
61
+
62
+ Raises:
63
+ BidiConnectionNotEstablishedError: If the BiDi connection is not active.
64
+ """
65
+
66
+ try:
67
+ if self._bidi_connection_object is not None:
68
+ self._devtools_package = DevToolsPackage(package=self._bidi_connection_object.devtools)
69
+ else:
70
+ raise BidiConnectionNotEstablishedError()
71
+ except CDPEndExceptions as error:
72
+ raise error
73
+ except BaseException as error:
74
+ log_exception(error)
75
+ raise error
76
+
77
+ async def run(self) -> None:
78
+ """
79
+ Initializes and runs the DevTools manager.
80
+
81
+ This method sets up the BiDi connection, starts the Trio nursery, retrieves
82
+ necessary CDP packages and URLs, initializes the main logger, and adds the
83
+ initial target to be monitored.
84
+
85
+ Raises:
86
+ CantEnterDevToolsContextError: If the WebDriver is not initialized.
87
+ """
88
+
89
+ if self._webdriver.driver is None:
90
+ raise CantEnterDevToolsContextError(reason="Driver is not initialized")
91
+
92
+ self._bidi_connection = self._webdriver.bidi_connection()
93
+ self._bidi_connection_object = await self._bidi_connection.__aenter__()
94
+
95
+ self._nursery = trio.open_nursery()
96
+ self._nursery_object = await self._nursery.__aenter__()
97
+
98
+ self._get_devtools_package()
99
+ self._get_websocket_url()
100
+
101
+ self._main_logger_cdp_send_channel, self._main_logger_fingerprint_send_channel, self._main_logger = build_main_logger(self._nursery_object, self._logger_settings)
102
+ await self._main_logger.run()
103
+
104
+ self.exit_event = trio.Event()
105
+
106
+ self._fingerprint_injection_script = await self._webdriver.sync_to_trio(sync_function=self._fingerprint_settings.generate_js)()
107
+ main_target = (await self._get_all_targets())[0]
108
+
109
+ await self._add_target(target_event=main_target, is_main_target=True)
110
+
111
+ self._is_active = True
112
+
113
+ async def __aenter__(self):
114
+ """
115
+ Enters the asynchronous context for DevTools event handling.
116
+
117
+ This method establishes the BiDi connection, initializes the Trio nursery,
118
+ sets up the main target, and starts listening for DevTools events.
119
+
120
+ Raises:
121
+ CantEnterDevToolsContextError: If the WebDriver is not initialized.
122
+ BaseException: If any other unexpected error occurs during context entry.
123
+ """
124
+
125
+ await self.run()
126
+
127
+ async def stop(
128
+ self,
129
+ exc_type: Optional[Type[BaseException]],
130
+ exc_val: Optional[BaseException],
131
+ exc_tb: Optional[TracebackType],
132
+ ) -> None:
133
+ """
134
+ Stops the DevTools manager and cleans up resources.
135
+
136
+ This method signals all targets to stop, closes the main logger, cancels the nursery,
137
+ and closes the BiDi connection.
138
+
139
+ Args:
140
+ exc_type (Optional[Type[BaseException]]): The exception type if stopping due to an error.
141
+ exc_val (Optional[BaseException]): The exception value if stopping due to an error.
142
+ exc_tb (Optional[TracebackType]): The traceback if stopping due to an error.
143
+ """
144
+
145
+ @log_on_error
146
+ async def _stop_main_logger():
147
+ """Stops the main logger and closes its channels."""
148
+
149
+ if self._main_logger_cdp_send_channel is not None:
150
+ await self._main_logger_cdp_send_channel.aclose()
151
+ self._main_logger_cdp_send_channel = None
152
+
153
+ if self._main_logger_fingerprint_send_channel is not None:
154
+ await self._main_logger_fingerprint_send_channel.aclose()
155
+ self._main_logger_fingerprint_send_channel = None
156
+
157
+ if self._main_logger is not None:
158
+ await self._main_logger.close()
159
+ self._main_logger = None
160
+
161
+ @log_on_error
162
+ async def _stop_all_targets():
163
+ """Signals all active targets to stop and waits for their completion."""
164
+
165
+ for target in self._handling_targets.copy().values():
166
+ try:
167
+ await target.stop()
168
+ await target.stopped_event.wait()
169
+ except (BaseException,):
170
+ pass
171
+
172
+ self._handling_targets = {}
173
+
174
+ @log_on_error
175
+ async def _close_nursery():
176
+ """Asynchronously exits the Trio nursery context manager."""
177
+
178
+ if self._nursery_object is not None:
179
+ self._nursery_object.cancel_scope.cancel()
180
+ self._nursery_object = None
181
+
182
+ if self._nursery is not None:
183
+ await self._nursery.__aexit__(exc_type, exc_val, exc_tb)
184
+ self._nursery = None
185
+
186
+ @log_on_error
187
+ async def _close_bidi_connection():
188
+ """Asynchronously exits the BiDi connection context manager."""
189
+
190
+ if self._bidi_connection is not None:
191
+ await self._bidi_connection.__aexit__(exc_type, exc_val, exc_tb)
192
+ self._bidi_connection = None
193
+ self._bidi_connection_object = None
194
+
195
+ if self._is_active:
196
+ self._is_closing = True
197
+ self.exit_event.set()
198
+
199
+ await _stop_all_targets()
200
+ await _stop_main_logger()
201
+ await _close_nursery()
202
+ await _close_bidi_connection()
203
+
204
+ self.exit_event = None
205
+ self._devtools_package = None
206
+ self._websocket_url = None
207
+ self._num_cdp_logs = 0
208
+ self._num_fingerprint_logs = 0
209
+ self._cdp_targets_types_stats = {}
210
+ self._cdp_log_level_stats = {}
211
+ self._fingerprint_categories_stats = {}
212
+ self._fingerprint_log_level_stats = {}
213
+ self._is_active = False
214
+ self._is_closing = False
215
+
216
+ async def __aexit__(
217
+ self,
218
+ exc_type: Optional[Type[BaseException]],
219
+ exc_val: Optional[BaseException],
220
+ exc_tb: Optional[TracebackType],
221
+ ):
222
+ """
223
+ Asynchronously exits the DevTools event handling context.
224
+
225
+ This method is called when exiting an `async with` block with a DevTools instance.
226
+ It ensures that all event listeners are cancelled, the Trio nursery is closed,
227
+ and the BiDi connection is properly shut down. Cleanup attempts are made even if
228
+ an exception occurred within the `async with` block.
229
+
230
+ Args:
231
+ exc_type (Optional[Type[BaseException]]): The exception type, if any, that caused the context to be exited.
232
+ exc_val (Optional[BaseException]): The exception value, if any.
233
+ exc_tb (Optional[TracebackType]): The exception traceback, if any.
234
+ """
235
+
236
+ await self.stop(exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb)