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