osn-selenium 1.0.0__py3-none-any.whl → 1.2.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 (475) hide show
  1. osn_selenium/_base_models.py +41 -0
  2. osn_selenium/_cdp_import.py +253 -0
  3. osn_selenium/_decorators.py +57 -0
  4. osn_selenium/_trio_threads_helpers.py +157 -0
  5. osn_selenium/_typehints.py +1 -1
  6. osn_selenium/abstract/executors/cdp.py +63 -0
  7. osn_selenium/abstract/webdriver/blink/base.py +14 -0
  8. osn_selenium/abstract/webdriver/blink/lifecycle.py +8 -8
  9. osn_selenium/abstract/webdriver/core/base.py +0 -14
  10. osn_selenium/abstract/webdriver/core/capture.py +4 -3
  11. osn_selenium/abstract/webdriver/core/lifecycle.py +8 -8
  12. osn_selenium/abstract/webdriver/core/script.py +5 -4
  13. osn_selenium/abstract/webdriver/core/window.py +11 -11
  14. osn_selenium/browsers_handler/models.py +1 -1
  15. osn_selenium/dev_tools/_decorators.py +19 -51
  16. osn_selenium/dev_tools/_functions.py +2 -4
  17. osn_selenium/dev_tools/_typehints.py +5 -2
  18. osn_selenium/dev_tools/_wrappers.py +0 -3
  19. osn_selenium/dev_tools/domains/__init__.py +2 -2
  20. osn_selenium/dev_tools/domains/abstract.py +1 -1
  21. osn_selenium/dev_tools/domains/fetch.py +6 -8
  22. osn_selenium/dev_tools/domains_default/fetch.py +2 -2
  23. osn_selenium/dev_tools/filters.py +1 -1
  24. osn_selenium/dev_tools/logger/main.py +9 -21
  25. osn_selenium/dev_tools/logger/models.py +1 -1
  26. osn_selenium/dev_tools/logger/target.py +49 -29
  27. osn_selenium/dev_tools/manager/base.py +10 -42
  28. osn_selenium/dev_tools/manager/lifecycle.py +84 -75
  29. osn_selenium/dev_tools/manager/logging.py +1 -1
  30. osn_selenium/dev_tools/manager/targets.py +13 -5
  31. osn_selenium/dev_tools/models.py +1 -1
  32. osn_selenium/dev_tools/settings.py +9 -5
  33. osn_selenium/dev_tools/target/base.py +30 -34
  34. osn_selenium/dev_tools/target/discovery.py +1 -1
  35. osn_selenium/dev_tools/target/events.py +2 -2
  36. osn_selenium/dev_tools/target/fingerprint.py +1 -1
  37. osn_selenium/dev_tools/target/lifecycle.py +103 -38
  38. osn_selenium/dev_tools/target/logging.py +11 -3
  39. osn_selenium/exceptions/__init__.py +0 -1
  40. osn_selenium/exceptions/base.py +28 -1
  41. osn_selenium/exceptions/bidi_bridge.py +59 -0
  42. osn_selenium/exceptions/configuration.py +1 -8
  43. osn_selenium/exceptions/dependencies.py +60 -0
  44. osn_selenium/exceptions/devtools.py +9 -39
  45. osn_selenium/exceptions/experimental.py +26 -0
  46. osn_selenium/exceptions/flags.py +0 -2
  47. osn_selenium/exceptions/instance.py +1 -9
  48. osn_selenium/exceptions/javascript.py +0 -2
  49. osn_selenium/exceptions/logic.py +0 -2
  50. osn_selenium/exceptions/path.py +1 -9
  51. osn_selenium/exceptions/platform.py +0 -2
  52. osn_selenium/exceptions/protocol.py +0 -3
  53. osn_selenium/exceptions/webdriver.py +1 -7
  54. osn_selenium/exceptions/window.py +1 -8
  55. osn_selenium/executors/sync/cdp.py +95 -0
  56. osn_selenium/executors/trio_bidi/cdp.py +101 -0
  57. osn_selenium/executors/trio_bidi/javascript.py +101 -0
  58. osn_selenium/executors/trio_threads/cdp.py +99 -0
  59. osn_selenium/executors/trio_threads/javascript.py +1 -1
  60. osn_selenium/executors/unified/javascript.py +0 -4
  61. osn_selenium/flags/base.py +7 -13
  62. osn_selenium/flags/blink.py +2 -8
  63. osn_selenium/flags/chrome.py +6 -6
  64. osn_selenium/flags/edge.py +6 -6
  65. osn_selenium/flags/models/base.py +4 -4
  66. osn_selenium/flags/models/blink.py +1 -1
  67. osn_selenium/flags/models/values.py +1 -1
  68. osn_selenium/instances/convert.py +44 -3
  69. osn_selenium/instances/protocols.py +47 -1
  70. osn_selenium/instances/sync/action_chains/__init__.py +6 -0
  71. osn_selenium/instances/sync/browsing_context.py +2 -2
  72. osn_selenium/instances/sync/script.py +7 -2
  73. osn_selenium/instances/sync/shadow_root.py +30 -8
  74. osn_selenium/instances/sync/web_element.py +1 -1
  75. osn_selenium/instances/trio_bidi/__init__.py +1 -0
  76. osn_selenium/instances/trio_bidi/shadow_root.py +180 -0
  77. osn_selenium/instances/trio_bidi/switch_to.py +143 -0
  78. osn_selenium/instances/trio_bidi/web_driver_wait.py +124 -0
  79. osn_selenium/instances/trio_bidi/web_element.py +239 -0
  80. osn_selenium/instances/trio_threads/action_chains/__init__.py +6 -0
  81. osn_selenium/instances/trio_threads/action_chains/base.py +1 -1
  82. osn_selenium/instances/trio_threads/alert.py +1 -1
  83. osn_selenium/instances/trio_threads/browser.py +1 -1
  84. osn_selenium/instances/trio_threads/browsing_context.py +3 -3
  85. osn_selenium/instances/trio_threads/dialog.py +1 -1
  86. osn_selenium/instances/trio_threads/fedcm.py +1 -1
  87. osn_selenium/instances/trio_threads/mobile.py +1 -1
  88. osn_selenium/instances/trio_threads/network.py +1 -1
  89. osn_selenium/instances/trio_threads/permissions.py +1 -1
  90. osn_selenium/instances/trio_threads/script.py +8 -3
  91. osn_selenium/instances/trio_threads/shadow_root.py +46 -15
  92. osn_selenium/instances/trio_threads/storage.py +1 -1
  93. osn_selenium/instances/trio_threads/switch_to.py +1 -1
  94. osn_selenium/instances/trio_threads/web_driver_wait.py +1 -1
  95. osn_selenium/instances/trio_threads/web_element.py +1 -1
  96. osn_selenium/instances/trio_threads/web_extension.py +1 -1
  97. osn_selenium/instances/unified/browsing_context.py +2 -2
  98. osn_selenium/instances/unified/script.py +2 -2
  99. osn_selenium/instances/unified/web_element.py +3 -5
  100. osn_selenium/javascript/fingerprint/__init__.py +3 -2
  101. osn_selenium/javascript/fingerprint/registry/models.py +1 -1
  102. osn_selenium/javascript/fingerprint/spoof/core_rules.py +1 -1
  103. osn_selenium/javascript/fingerprint/spoof/noise.py +1 -1
  104. osn_selenium/javascript/models.py +1 -1
  105. osn_selenium/models.py +2 -47
  106. osn_selenium/trio_bidi/__init__.py +1 -0
  107. osn_selenium/trio_bidi/_context_vars.py +12 -0
  108. osn_selenium/trio_bidi/_error_mappings.py +123 -0
  109. osn_selenium/trio_bidi/_error_redirects.py +194 -0
  110. osn_selenium/trio_bidi/_file_functions.py +28 -0
  111. osn_selenium/trio_bidi/_internal_mappings.py +10 -0
  112. osn_selenium/trio_bidi/_models.py +199 -0
  113. osn_selenium/trio_bidi/_typehints.py +20 -0
  114. osn_selenium/trio_bidi/connection_pool.py +587 -0
  115. osn_selenium/trio_bidi/mapping/__init__.py +1 -0
  116. osn_selenium/trio_bidi/mapping/_constants.py +14 -0
  117. osn_selenium/trio_bidi/mapping/_js_snippets.py +285 -0
  118. osn_selenium/trio_bidi/mapping/_utils.py +4 -0
  119. osn_selenium/trio_bidi/mapping/request_functions/__init__.py +87 -0
  120. osn_selenium/trio_bidi/mapping/request_functions/_alert.py +102 -0
  121. osn_selenium/trio_bidi/mapping/request_functions/_args_helpers.py +225 -0
  122. osn_selenium/trio_bidi/mapping/request_functions/_capture.py +71 -0
  123. osn_selenium/trio_bidi/mapping/request_functions/_cdp.py +40 -0
  124. osn_selenium/trio_bidi/mapping/request_functions/_element.py +55 -0
  125. osn_selenium/trio_bidi/mapping/request_functions/_file.py +32 -0
  126. osn_selenium/trio_bidi/mapping/request_functions/_navigation.py +147 -0
  127. osn_selenium/trio_bidi/mapping/request_functions/_script.py +85 -0
  128. osn_selenium/trio_bidi/mapping/request_functions/_shadow_root.py +65 -0
  129. osn_selenium/trio_bidi/mapping/request_functions/_switch_to.py +59 -0
  130. osn_selenium/trio_bidi/mapping/request_functions/_web_element.py +448 -0
  131. osn_selenium/trio_bidi/mapping/request_functions/_window.py +125 -0
  132. osn_selenium/trio_bidi/mapping/response_functions/__init__.py +86 -0
  133. osn_selenium/trio_bidi/mapping/response_functions/_alert.py +81 -0
  134. osn_selenium/trio_bidi/mapping/response_functions/_args_helpers.py +183 -0
  135. osn_selenium/trio_bidi/mapping/response_functions/_args_validators.py +153 -0
  136. osn_selenium/trio_bidi/mapping/response_functions/_capture.py +71 -0
  137. osn_selenium/trio_bidi/mapping/response_functions/_cdp.py +26 -0
  138. osn_selenium/trio_bidi/mapping/response_functions/_element.py +58 -0
  139. osn_selenium/trio_bidi/mapping/response_functions/_file.py +30 -0
  140. osn_selenium/trio_bidi/mapping/response_functions/_navigation.py +120 -0
  141. osn_selenium/trio_bidi/mapping/response_functions/_script.py +57 -0
  142. osn_selenium/trio_bidi/mapping/response_functions/_shadow_root.py +58 -0
  143. osn_selenium/trio_bidi/mapping/response_functions/_switch_to.py +57 -0
  144. osn_selenium/trio_bidi/mapping/response_functions/_web_element.py +368 -0
  145. osn_selenium/trio_bidi/mapping/response_functions/_window.py +119 -0
  146. osn_selenium/trio_bidi/mixin.py +186 -0
  147. osn_selenium/trio_bidi/remote_connection.py +164 -0
  148. osn_selenium/{base_mixin.py → trio_threads_mixin.py} +31 -40
  149. osn_selenium/webdrivers/_args_helpers.py +120 -7
  150. osn_selenium/webdrivers/_bridges.py +2 -2
  151. osn_selenium/webdrivers/_executable_tables/models.py +1 -1
  152. osn_selenium/webdrivers/_typehints.py +9 -3
  153. osn_selenium/webdrivers/protocols.py +81 -1
  154. osn_selenium/webdrivers/sync/blink/__init__.py +11 -1
  155. osn_selenium/webdrivers/sync/blink/base.py +23 -1
  156. osn_selenium/webdrivers/sync/blink/lifecycle.py +26 -8
  157. osn_selenium/webdrivers/sync/chrome/__init__.py +36 -1
  158. osn_selenium/webdrivers/sync/chrome/base.py +13 -1
  159. osn_selenium/webdrivers/sync/chrome/lifecycle.py +23 -5
  160. osn_selenium/webdrivers/sync/chrome/settings.py +6 -1
  161. osn_selenium/webdrivers/sync/core/__init__.py +10 -1
  162. osn_selenium/webdrivers/sync/core/base.py +18 -18
  163. osn_selenium/webdrivers/sync/core/capture.py +3 -2
  164. osn_selenium/webdrivers/sync/core/file.py +3 -2
  165. osn_selenium/webdrivers/sync/core/lifecycle.py +44 -10
  166. osn_selenium/webdrivers/sync/core/script.py +3 -2
  167. osn_selenium/webdrivers/sync/core/window.py +3 -3
  168. osn_selenium/webdrivers/sync/edge/__init__.py +36 -1
  169. osn_selenium/webdrivers/sync/edge/base.py +13 -1
  170. osn_selenium/webdrivers/sync/edge/lifecycle.py +23 -5
  171. osn_selenium/webdrivers/sync/edge/settings.py +6 -1
  172. osn_selenium/webdrivers/sync/yandex/__init__.py +36 -1
  173. osn_selenium/webdrivers/sync/yandex/base.py +13 -1
  174. osn_selenium/webdrivers/sync/yandex/lifecycle.py +23 -5
  175. osn_selenium/webdrivers/sync/yandex/settings.py +6 -1
  176. osn_selenium/webdrivers/trio_bidi/__init__.py +1 -0
  177. osn_selenium/webdrivers/trio_bidi/blink/__init__.py +132 -0
  178. osn_selenium/webdrivers/trio_bidi/blink/base.py +167 -0
  179. osn_selenium/webdrivers/trio_bidi/blink/lifecycle.py +89 -0
  180. osn_selenium/webdrivers/trio_bidi/blink/settings.py +63 -0
  181. osn_selenium/webdrivers/trio_bidi/chrome/__init__.py +114 -0
  182. osn_selenium/webdrivers/trio_bidi/chrome/base.py +127 -0
  183. osn_selenium/webdrivers/trio_bidi/chrome/lifecycle.py +85 -0
  184. osn_selenium/webdrivers/trio_bidi/chrome/settings.py +63 -0
  185. osn_selenium/webdrivers/trio_bidi/core/__init__.py +95 -0
  186. osn_selenium/webdrivers/trio_bidi/core/actions.py +70 -0
  187. osn_selenium/webdrivers/trio_bidi/core/base.py +200 -0
  188. osn_selenium/webdrivers/trio_bidi/core/capture.py +39 -0
  189. osn_selenium/webdrivers/trio_bidi/core/devtools.py +49 -0
  190. osn_selenium/webdrivers/trio_bidi/core/element.py +64 -0
  191. osn_selenium/webdrivers/trio_bidi/core/lifecycle.py +135 -0
  192. osn_selenium/webdrivers/trio_bidi/core/navigation.py +37 -0
  193. osn_selenium/webdrivers/trio_bidi/core/script.py +56 -0
  194. osn_selenium/webdrivers/trio_bidi/core/settings.py +36 -0
  195. osn_selenium/webdrivers/trio_bidi/core/window.py +134 -0
  196. osn_selenium/webdrivers/trio_bidi/edge/__init__.py +114 -0
  197. osn_selenium/webdrivers/trio_bidi/edge/base.py +123 -0
  198. osn_selenium/webdrivers/trio_bidi/edge/lifecycle.py +85 -0
  199. osn_selenium/webdrivers/trio_bidi/edge/settings.py +63 -0
  200. osn_selenium/webdrivers/trio_bidi/yandex/__init__.py +114 -0
  201. osn_selenium/webdrivers/trio_bidi/yandex/base.py +120 -0
  202. osn_selenium/webdrivers/trio_bidi/yandex/lifecycle.py +85 -0
  203. osn_selenium/webdrivers/trio_bidi/yandex/settings.py +63 -0
  204. osn_selenium/webdrivers/trio_threads/blink/__init__.py +18 -2
  205. osn_selenium/webdrivers/trio_threads/blink/base.py +25 -1
  206. osn_selenium/webdrivers/trio_threads/blink/casting.py +1 -1
  207. osn_selenium/webdrivers/trio_threads/blink/features.py +1 -1
  208. osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +26 -8
  209. osn_selenium/webdrivers/trio_threads/blink/logging.py +1 -1
  210. osn_selenium/webdrivers/trio_threads/blink/network.py +1 -1
  211. osn_selenium/webdrivers/trio_threads/chrome/__init__.py +34 -1
  212. osn_selenium/webdrivers/trio_threads/chrome/base.py +14 -2
  213. osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +23 -5
  214. osn_selenium/webdrivers/trio_threads/chrome/settings.py +1 -1
  215. osn_selenium/webdrivers/trio_threads/core/__init__.py +10 -14
  216. osn_selenium/webdrivers/trio_threads/core/actions.py +1 -1
  217. osn_selenium/webdrivers/trio_threads/core/auth.py +1 -1
  218. osn_selenium/webdrivers/trio_threads/core/base.py +18 -22
  219. osn_selenium/webdrivers/trio_threads/core/capture.py +4 -3
  220. osn_selenium/webdrivers/trio_threads/core/comonents.py +1 -1
  221. osn_selenium/webdrivers/trio_threads/core/devtools.py +1 -1
  222. osn_selenium/webdrivers/trio_threads/core/element.py +1 -1
  223. osn_selenium/webdrivers/trio_threads/core/file.py +5 -4
  224. osn_selenium/webdrivers/trio_threads/core/lifecycle.py +45 -11
  225. osn_selenium/webdrivers/trio_threads/core/navigation.py +1 -1
  226. osn_selenium/webdrivers/trio_threads/core/script.py +4 -3
  227. osn_selenium/webdrivers/trio_threads/core/settings.py +1 -1
  228. osn_selenium/webdrivers/trio_threads/core/storage.py +1 -1
  229. osn_selenium/webdrivers/trio_threads/core/timeouts.py +1 -1
  230. osn_selenium/webdrivers/trio_threads/core/window.py +6 -6
  231. osn_selenium/webdrivers/trio_threads/edge/__init__.py +34 -1
  232. osn_selenium/webdrivers/trio_threads/edge/base.py +14 -2
  233. osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +23 -5
  234. osn_selenium/webdrivers/trio_threads/edge/settings.py +1 -1
  235. osn_selenium/webdrivers/trio_threads/yandex/__init__.py +34 -1
  236. osn_selenium/webdrivers/trio_threads/yandex/base.py +14 -2
  237. osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +23 -5
  238. osn_selenium/webdrivers/trio_threads/yandex/settings.py +1 -1
  239. osn_selenium/webdrivers/unified/blink/base.py +9 -1
  240. osn_selenium/webdrivers/unified/blink/lifecycle.py +4 -2
  241. osn_selenium/webdrivers/unified/chrome/base.py +9 -1
  242. osn_selenium/webdrivers/unified/core/auth.py +4 -2
  243. osn_selenium/webdrivers/unified/core/base.py +19 -6
  244. osn_selenium/webdrivers/unified/core/capture.py +3 -2
  245. osn_selenium/webdrivers/unified/core/components.py +12 -7
  246. osn_selenium/webdrivers/unified/core/devtools.py +2 -1
  247. osn_selenium/webdrivers/unified/core/file.py +3 -2
  248. osn_selenium/webdrivers/unified/core/lifecycle.py +5 -3
  249. osn_selenium/webdrivers/unified/core/script.py +5 -3
  250. osn_selenium/webdrivers/unified/core/storage.py +2 -1
  251. osn_selenium/webdrivers/unified/core/window.py +9 -8
  252. osn_selenium/webdrivers/unified/edge/base.py +9 -1
  253. osn_selenium/webdrivers/unified/yandex/base.py +9 -1
  254. {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/METADATA +24 -10
  255. osn_selenium-1.2.0.dist-info/RECORD +480 -0
  256. {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/WHEEL +1 -1
  257. osn_selenium/abstract/executors/cdp/__init__.py +0 -435
  258. osn_selenium/abstract/executors/cdp/accessibility.py +0 -62
  259. osn_selenium/abstract/executors/cdp/animation.py +0 -47
  260. osn_selenium/abstract/executors/cdp/audits.py +0 -39
  261. osn_selenium/abstract/executors/cdp/autofill.py +0 -34
  262. osn_selenium/abstract/executors/cdp/background_service.py +0 -22
  263. osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +0 -95
  264. osn_selenium/abstract/executors/cdp/browser.py +0 -122
  265. osn_selenium/abstract/executors/cdp/cache_storage.py +0 -49
  266. osn_selenium/abstract/executors/cdp/cast.py +0 -31
  267. osn_selenium/abstract/executors/cdp/console.py +0 -18
  268. osn_selenium/abstract/executors/cdp/css.py +0 -197
  269. osn_selenium/abstract/executors/cdp/debugger.py +0 -198
  270. osn_selenium/abstract/executors/cdp/device_access.py +0 -22
  271. osn_selenium/abstract/executors/cdp/device_orientation.py +0 -14
  272. osn_selenium/abstract/executors/cdp/dom.py +0 -305
  273. osn_selenium/abstract/executors/cdp/dom_debugger.py +0 -57
  274. osn_selenium/abstract/executors/cdp/dom_snapshot.py +0 -42
  275. osn_selenium/abstract/executors/cdp/dom_storage.py +0 -31
  276. osn_selenium/abstract/executors/cdp/emulation.py +0 -259
  277. osn_selenium/abstract/executors/cdp/event_breakpoints.py +0 -18
  278. osn_selenium/abstract/executors/cdp/extensions.py +0 -31
  279. osn_selenium/abstract/executors/cdp/fed_cm.py +0 -35
  280. osn_selenium/abstract/executors/cdp/fetch.py +0 -76
  281. osn_selenium/abstract/executors/cdp/file_system.py +0 -11
  282. osn_selenium/abstract/executors/cdp/headless_experimental.py +0 -30
  283. osn_selenium/abstract/executors/cdp/heap_profiler.py +0 -73
  284. osn_selenium/abstract/executors/cdp/indexed_db.py +0 -99
  285. osn_selenium/abstract/executors/cdp/input.py +0 -158
  286. osn_selenium/abstract/executors/cdp/inspector.py +0 -14
  287. osn_selenium/abstract/executors/cdp/io.py +0 -24
  288. osn_selenium/abstract/executors/cdp/layer_tree.py +0 -61
  289. osn_selenium/abstract/executors/cdp/log.py +0 -27
  290. osn_selenium/abstract/executors/cdp/media.py +0 -14
  291. osn_selenium/abstract/executors/cdp/memory.py +0 -61
  292. osn_selenium/abstract/executors/cdp/network.py +0 -252
  293. osn_selenium/abstract/executors/cdp/overlay.py +0 -166
  294. osn_selenium/abstract/executors/cdp/page.py +0 -347
  295. osn_selenium/abstract/executors/cdp/performance.py +0 -28
  296. osn_selenium/abstract/executors/cdp/performance_timeline.py +0 -11
  297. osn_selenium/abstract/executors/cdp/preload.py +0 -14
  298. osn_selenium/abstract/executors/cdp/profiler.py +0 -54
  299. osn_selenium/abstract/executors/cdp/pwa.py +0 -46
  300. osn_selenium/abstract/executors/cdp/runtime.py +0 -176
  301. osn_selenium/abstract/executors/cdp/schema.py +0 -11
  302. osn_selenium/abstract/executors/cdp/security.py +0 -26
  303. osn_selenium/abstract/executors/cdp/service_worker.py +0 -54
  304. osn_selenium/abstract/executors/cdp/storage.py +0 -175
  305. osn_selenium/abstract/executors/cdp/system_info.py +0 -24
  306. osn_selenium/abstract/executors/cdp/target.py +0 -125
  307. osn_selenium/abstract/executors/cdp/tethering.py +0 -14
  308. osn_selenium/abstract/executors/cdp/tracing.py +0 -48
  309. osn_selenium/abstract/executors/cdp/web_audio.py +0 -19
  310. osn_selenium/abstract/executors/cdp/web_authn.py +0 -76
  311. osn_selenium/executors/sync/cdp/__init__.py +0 -550
  312. osn_selenium/executors/sync/cdp/accessibility.py +0 -74
  313. osn_selenium/executors/sync/cdp/animation.py +0 -50
  314. osn_selenium/executors/sync/cdp/audits.py +0 -48
  315. osn_selenium/executors/sync/cdp/autofill.py +0 -39
  316. osn_selenium/executors/sync/cdp/background_service.py +0 -30
  317. osn_selenium/executors/sync/cdp/bluetooth_emulation.py +0 -101
  318. osn_selenium/executors/sync/cdp/browser.py +0 -131
  319. osn_selenium/executors/sync/cdp/cache_storage.py +0 -66
  320. osn_selenium/executors/sync/cdp/cast.py +0 -38
  321. osn_selenium/executors/sync/cdp/console.py +0 -24
  322. osn_selenium/executors/sync/cdp/css.py +0 -187
  323. osn_selenium/executors/sync/cdp/debugger.py +0 -206
  324. osn_selenium/executors/sync/cdp/device_access.py +0 -27
  325. osn_selenium/executors/sync/cdp/device_orientation.py +0 -24
  326. osn_selenium/executors/sync/cdp/dom.py +0 -310
  327. osn_selenium/executors/sync/cdp/dom_debugger.py +0 -56
  328. osn_selenium/executors/sync/cdp/dom_snapshot.py +0 -58
  329. osn_selenium/executors/sync/cdp/dom_storage.py +0 -38
  330. osn_selenium/executors/sync/cdp/emulation.py +0 -270
  331. osn_selenium/executors/sync/cdp/event_breakpoints.py +0 -27
  332. osn_selenium/executors/sync/cdp/extensions.py +0 -39
  333. osn_selenium/executors/sync/cdp/fed_cm.py +0 -45
  334. osn_selenium/executors/sync/cdp/fetch.py +0 -96
  335. osn_selenium/executors/sync/cdp/file_system.py +0 -18
  336. osn_selenium/executors/sync/cdp/headless_experimental.py +0 -44
  337. osn_selenium/executors/sync/cdp/heap_profiler.py +0 -89
  338. osn_selenium/executors/sync/cdp/indexed_db.py +0 -142
  339. osn_selenium/executors/sync/cdp/input.py +0 -233
  340. osn_selenium/executors/sync/cdp/inspector.py +0 -21
  341. osn_selenium/executors/sync/cdp/io.py +0 -33
  342. osn_selenium/executors/sync/cdp/layer_tree.py +0 -71
  343. osn_selenium/executors/sync/cdp/log.py +0 -35
  344. osn_selenium/executors/sync/cdp/media.py +0 -21
  345. osn_selenium/executors/sync/cdp/memory.py +0 -62
  346. osn_selenium/executors/sync/cdp/network.py +0 -287
  347. osn_selenium/executors/sync/cdp/overlay.py +0 -174
  348. osn_selenium/executors/sync/cdp/page.py +0 -365
  349. osn_selenium/executors/sync/cdp/performance.py +0 -33
  350. osn_selenium/executors/sync/cdp/performance_timeline.py +0 -26
  351. osn_selenium/executors/sync/cdp/preload.py +0 -21
  352. osn_selenium/executors/sync/cdp/profiler.py +0 -58
  353. osn_selenium/executors/sync/cdp/pwa.py +0 -55
  354. osn_selenium/executors/sync/cdp/runtime.py +0 -221
  355. osn_selenium/executors/sync/cdp/schema.py +0 -23
  356. osn_selenium/executors/sync/cdp/security.py +0 -30
  357. osn_selenium/executors/sync/cdp/service_worker.py +0 -56
  358. osn_selenium/executors/sync/cdp/storage.py +0 -151
  359. osn_selenium/executors/sync/cdp/system_info.py +0 -30
  360. osn_selenium/executors/sync/cdp/target.py +0 -147
  361. osn_selenium/executors/sync/cdp/tethering.py +0 -21
  362. osn_selenium/executors/sync/cdp/tracing.py +0 -62
  363. osn_selenium/executors/sync/cdp/web_audio.py +0 -24
  364. osn_selenium/executors/sync/cdp/web_authn.py +0 -82
  365. osn_selenium/executors/trio_threads/cdp/__init__.py +0 -771
  366. osn_selenium/executors/trio_threads/cdp/accessibility.py +0 -87
  367. osn_selenium/executors/trio_threads/cdp/animation.py +0 -63
  368. osn_selenium/executors/trio_threads/cdp/audits.py +0 -57
  369. osn_selenium/executors/trio_threads/cdp/autofill.py +0 -52
  370. osn_selenium/executors/trio_threads/cdp/background_service.py +0 -40
  371. osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +0 -111
  372. osn_selenium/executors/trio_threads/cdp/browser.py +0 -140
  373. osn_selenium/executors/trio_threads/cdp/cache_storage.py +0 -79
  374. osn_selenium/executors/trio_threads/cdp/cast.py +0 -47
  375. osn_selenium/executors/trio_threads/cdp/console.py +0 -33
  376. osn_selenium/executors/trio_threads/cdp/css.py +0 -196
  377. osn_selenium/executors/trio_threads/cdp/debugger.py +0 -219
  378. osn_selenium/executors/trio_threads/cdp/device_access.py +0 -40
  379. osn_selenium/executors/trio_threads/cdp/device_orientation.py +0 -34
  380. osn_selenium/executors/trio_threads/cdp/dom.py +0 -319
  381. osn_selenium/executors/trio_threads/cdp/dom_debugger.py +0 -69
  382. osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +0 -71
  383. osn_selenium/executors/trio_threads/cdp/dom_storage.py +0 -51
  384. osn_selenium/executors/trio_threads/cdp/emulation.py +0 -283
  385. osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +0 -37
  386. osn_selenium/executors/trio_threads/cdp/extensions.py +0 -52
  387. osn_selenium/executors/trio_threads/cdp/fed_cm.py +0 -54
  388. osn_selenium/executors/trio_threads/cdp/fetch.py +0 -105
  389. osn_selenium/executors/trio_threads/cdp/file_system.py +0 -31
  390. osn_selenium/executors/trio_threads/cdp/headless_experimental.py +0 -54
  391. osn_selenium/executors/trio_threads/cdp/heap_profiler.py +0 -102
  392. osn_selenium/executors/trio_threads/cdp/indexed_db.py +0 -155
  393. osn_selenium/executors/trio_threads/cdp/input.py +0 -242
  394. osn_selenium/executors/trio_threads/cdp/inspector.py +0 -34
  395. osn_selenium/executors/trio_threads/cdp/io.py +0 -42
  396. osn_selenium/executors/trio_threads/cdp/layer_tree.py +0 -84
  397. osn_selenium/executors/trio_threads/cdp/log.py +0 -44
  398. osn_selenium/executors/trio_threads/cdp/media.py +0 -30
  399. osn_selenium/executors/trio_threads/cdp/memory.py +0 -71
  400. osn_selenium/executors/trio_threads/cdp/network.py +0 -296
  401. osn_selenium/executors/trio_threads/cdp/overlay.py +0 -183
  402. osn_selenium/executors/trio_threads/cdp/page.py +0 -374
  403. osn_selenium/executors/trio_threads/cdp/performance.py +0 -46
  404. osn_selenium/executors/trio_threads/cdp/performance_timeline.py +0 -36
  405. osn_selenium/executors/trio_threads/cdp/preload.py +0 -30
  406. osn_selenium/executors/trio_threads/cdp/profiler.py +0 -71
  407. osn_selenium/executors/trio_threads/cdp/pwa.py +0 -64
  408. osn_selenium/executors/trio_threads/cdp/runtime.py +0 -230
  409. osn_selenium/executors/trio_threads/cdp/schema.py +0 -32
  410. osn_selenium/executors/trio_threads/cdp/security.py +0 -43
  411. osn_selenium/executors/trio_threads/cdp/service_worker.py +0 -69
  412. osn_selenium/executors/trio_threads/cdp/storage.py +0 -162
  413. osn_selenium/executors/trio_threads/cdp/system_info.py +0 -43
  414. osn_selenium/executors/trio_threads/cdp/target.py +0 -156
  415. osn_selenium/executors/trio_threads/cdp/tethering.py +0 -34
  416. osn_selenium/executors/trio_threads/cdp/tracing.py +0 -71
  417. osn_selenium/executors/trio_threads/cdp/web_audio.py +0 -37
  418. osn_selenium/executors/trio_threads/cdp/web_authn.py +0 -95
  419. osn_selenium/executors/unified/cdp/accessibility.py +0 -81
  420. osn_selenium/executors/unified/cdp/animation.py +0 -50
  421. osn_selenium/executors/unified/cdp/audits.py +0 -45
  422. osn_selenium/executors/unified/cdp/autofill.py +0 -41
  423. osn_selenium/executors/unified/cdp/background_service.py +0 -24
  424. osn_selenium/executors/unified/cdp/bluetooth_emulation.py +0 -132
  425. osn_selenium/executors/unified/cdp/browser.py +0 -143
  426. osn_selenium/executors/unified/cdp/cache_storage.py +0 -69
  427. osn_selenium/executors/unified/cdp/cast.py +0 -32
  428. osn_selenium/executors/unified/cdp/console.py +0 -18
  429. osn_selenium/executors/unified/cdp/css.py +0 -237
  430. osn_selenium/executors/unified/cdp/debugger.py +0 -243
  431. osn_selenium/executors/unified/cdp/device_access.py +0 -21
  432. osn_selenium/executors/unified/cdp/device_orientation.py +0 -18
  433. osn_selenium/executors/unified/cdp/dom.py +0 -380
  434. osn_selenium/executors/unified/cdp/dom_debugger.py +0 -65
  435. osn_selenium/executors/unified/cdp/dom_snapshot.py +0 -58
  436. osn_selenium/executors/unified/cdp/dom_storage.py +0 -38
  437. osn_selenium/executors/unified/cdp/emulation.py +0 -312
  438. osn_selenium/executors/unified/cdp/event_breakpoints.py +0 -24
  439. osn_selenium/executors/unified/cdp/extensions.py +0 -45
  440. osn_selenium/executors/unified/cdp/fed_cm.py +0 -51
  441. osn_selenium/executors/unified/cdp/fetch.py +0 -111
  442. osn_selenium/executors/unified/cdp/file_system.py +0 -15
  443. osn_selenium/executors/unified/cdp/headless_experimental.py +0 -38
  444. osn_selenium/executors/unified/cdp/heap_profiler.py +0 -101
  445. osn_selenium/executors/unified/cdp/indexed_db.py +0 -157
  446. osn_selenium/executors/unified/cdp/input.py +0 -254
  447. osn_selenium/executors/unified/cdp/inspector.py +0 -15
  448. osn_selenium/executors/unified/cdp/io.py +0 -29
  449. osn_selenium/executors/unified/cdp/layer_tree.py +0 -71
  450. osn_selenium/executors/unified/cdp/log.py +0 -29
  451. osn_selenium/executors/unified/cdp/media.py +0 -15
  452. osn_selenium/executors/unified/cdp/memory.py +0 -59
  453. osn_selenium/executors/unified/cdp/network.py +0 -323
  454. osn_selenium/executors/unified/cdp/overlay.py +0 -209
  455. osn_selenium/executors/unified/cdp/page.py +0 -410
  456. osn_selenium/executors/unified/cdp/performance.py +0 -27
  457. osn_selenium/executors/unified/cdp/performance_timeline.py +0 -17
  458. osn_selenium/executors/unified/cdp/preload.py +0 -15
  459. osn_selenium/executors/unified/cdp/profiler.py +0 -55
  460. osn_selenium/executors/unified/cdp/pwa.py +0 -55
  461. osn_selenium/executors/unified/cdp/runtime.py +0 -245
  462. osn_selenium/executors/unified/cdp/schema.py +0 -17
  463. osn_selenium/executors/unified/cdp/security.py +0 -27
  464. osn_selenium/executors/unified/cdp/service_worker.py +0 -62
  465. osn_selenium/executors/unified/cdp/storage.py +0 -178
  466. osn_selenium/executors/unified/cdp/system_info.py +0 -24
  467. osn_selenium/executors/unified/cdp/target.py +0 -165
  468. osn_selenium/executors/unified/cdp/tethering.py +0 -15
  469. osn_selenium/executors/unified/cdp/tracing.py +0 -62
  470. osn_selenium/executors/unified/cdp/web_audio.py +0 -18
  471. osn_selenium/executors/unified/cdp/web_authn.py +0 -103
  472. osn_selenium-1.0.0.dist-info/RECORD +0 -608
  473. /osn_selenium/{dev_tools/_exception_helpers.py → _exception_helpers.py} +0 -0
  474. /osn_selenium/executors/{unified/cdp → trio_bidi}/__init__.py +0 -0
  475. {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,15 @@
1
1
  import trio
2
- from contextlib import (
3
- AbstractAsyncContextManager
4
- )
2
+ from typing import Dict, Optional
3
+ from contextlib import AsyncExitStack
5
4
  from osn_selenium.dev_tools.target import DevToolsTarget
6
5
  from osn_selenium.dev_tools.logger.main import MainLogger
7
- from osn_selenium.dev_tools.domains import DomainsSettings
8
6
  from osn_selenium.dev_tools._wrappers import DevToolsPackage
9
7
  from osn_selenium.dev_tools.settings import DevToolsSettings
10
- from typing import (
11
- Any,
12
- Dict,
13
- Optional,
14
- TYPE_CHECKING
15
- )
16
8
  from osn_selenium.dev_tools._system_utils import prepare_log_dir
17
9
  from selenium.webdriver.remote.bidi_connection import BidiConnection
10
+ from osn_selenium.webdrivers._typehints import (
11
+ ANY_TRIO_WEBDRIVER_TYPEHINT
12
+ )
18
13
  from osn_selenium.dev_tools.logger.models import (
19
14
  CDPLogLevelStats,
20
15
  CDPMainLogEntry,
@@ -27,9 +22,6 @@ from osn_selenium.dev_tools.logger.models import (
27
22
 
28
23
  __all__ = ["BaseMixin"]
29
24
 
30
- if TYPE_CHECKING:
31
- from osn_selenium.webdrivers.trio_threads.core import CoreWebDriver
32
-
33
25
 
34
26
  class BaseMixin:
35
27
  """
@@ -41,43 +33,20 @@ class BaseMixin:
41
33
  by using an asynchronous context manager.
42
34
 
43
35
  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
36
  targets_lock (trio.Lock): A lock used for synchronizing access to shared resources, like the List of handled targets.
56
37
  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
38
  """
70
39
 
71
40
  def __init__(
72
41
  self,
73
- parent_webdriver: "CoreWebDriver",
42
+ parent_webdriver: ANY_TRIO_WEBDRIVER_TYPEHINT,
74
43
  devtools_settings: Optional[DevToolsSettings] = None
75
44
  ):
76
45
  """
77
46
  Initializes the DevTools manager.
78
47
 
79
48
  Args:
80
- parent_webdriver (CoreWebDriver): The WebDriver instance to which this DevTools manager is attached.
49
+ parent_webdriver (ANY_TRIO_WEBDRIVER_TYPEHINT): The WebDriver instance to which this DevTools manager is attached.
81
50
  devtools_settings (Optional[DevToolsSettings]): Configuration settings for DevTools.
82
51
  If None, default settings will be used.
83
52
  """
@@ -97,12 +66,11 @@ class BaseMixin:
97
66
  for filter_ in devtools_settings.new_targets_filter
98
67
  ] if devtools_settings.new_targets_filter is not None else None
99
68
 
100
- self._bidi_connection: Optional[AbstractAsyncContextManager[BidiConnection, Any]] = None
101
- self._bidi_connection_object: Optional[BidiConnection] = None
69
+ self._bidi_connection: Optional[BidiConnection] = None
70
+ self._nursery: Optional[trio.Nursery] = None
71
+ self._exit_stack = AsyncExitStack()
102
72
  self._devtools_package: Optional[DevToolsPackage] = None
103
73
  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
74
  self._handling_targets: Dict[str, DevToolsTarget] = {}
107
75
  self.targets_lock = trio.Lock()
108
76
  self.exit_event: Optional[trio.Event] = None
@@ -1,15 +1,16 @@
1
1
  import trio
2
2
  from types import TracebackType
3
3
  from typing import Optional, Type
4
- from osn_selenium.dev_tools._decorators import log_on_error
4
+ from osn_selenium._decorators import log_on_error
5
+ from osn_selenium._exception_helpers import log_exception
5
6
  from osn_selenium.dev_tools._wrappers import DevToolsPackage
6
7
  from osn_selenium.dev_tools.manager.targets import TargetsMixin
7
8
  from osn_selenium.dev_tools.logger.main import build_main_logger
8
- from osn_selenium.dev_tools._exception_helpers import log_exception
9
9
  from osn_selenium.exceptions.devtools import (
10
10
  BidiConnectionNotEstablishedError,
11
11
  CDPEndExceptions,
12
- CantEnterDevToolsContextError
12
+ CantEnterDevToolsContextError,
13
+ TrioEndExceptions
13
14
  )
14
15
 
15
16
 
@@ -41,9 +42,11 @@ class LifecycleMixin(TargetsMixin):
41
42
 
42
43
  if driver is None:
43
44
  self._websocket_url = None
45
+ return
44
46
 
45
47
  if driver.caps.get("se:cdp"):
46
48
  self._websocket_url = driver.caps.get("se:cdp")
49
+ return
47
50
 
48
51
  self._websocket_url = driver._get_cdp_details()[1]
49
52
  except CDPEndExceptions as error:
@@ -64,8 +67,8 @@ class LifecycleMixin(TargetsMixin):
64
67
  """
65
68
 
66
69
  try:
67
- if self._bidi_connection_object is not None:
68
- self._devtools_package = DevToolsPackage(package=self._bidi_connection_object.devtools)
70
+ if self._bidi_connection is not None:
71
+ self._devtools_package = DevToolsPackage(package=self._bidi_connection.devtools)
69
72
  else:
70
73
  raise BidiConnectionNotEstablishedError()
71
74
  except CDPEndExceptions as error:
@@ -74,9 +77,9 @@ class LifecycleMixin(TargetsMixin):
74
77
  log_exception(error)
75
78
  raise error
76
79
 
77
- async def run(self) -> None:
80
+ async def start(self) -> None:
78
81
  """
79
- Initializes and runs the DevTools manager.
82
+ Initializes and starts the DevTools manager.
80
83
 
81
84
  This method sets up the BiDi connection, starts the Trio nursery, retrieves
82
85
  necessary CDP packages and URLs, initializes the main logger, and adds the
@@ -89,21 +92,18 @@ class LifecycleMixin(TargetsMixin):
89
92
  if self._webdriver.driver is None:
90
93
  raise CantEnterDevToolsContextError(reason="Driver is not initialized")
91
94
 
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__()
95
+ self._nursery = await self._exit_stack.enter_async_context(trio.open_nursery())
96
+ self._bidi_connection = await self._exit_stack.enter_async_context(self._webdriver.bidi_connection())
97
97
 
98
98
  self._get_devtools_package()
99
99
  self._get_websocket_url()
100
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)
101
+ self._main_logger_cdp_send_channel, self._main_logger_fingerprint_send_channel, self._main_logger = build_main_logger(nursery=self._nursery, logger_settings=self._logger_settings)
102
102
  await self._main_logger.run()
103
103
 
104
104
  self.exit_event = trio.Event()
105
105
 
106
- self._fingerprint_injection_script = await self._webdriver.sync_to_trio(sync_function=self._fingerprint_settings.generate_js)()
106
+ self._fingerprint_injection_script = await self._webdriver.sync_to_trio(sync_function=self._fingerprint_settings.generate_js)() if self._fingerprint_settings is not None else None
107
107
  main_target = (await self._get_all_targets())[0]
108
108
 
109
109
  await self._add_target(target_event=main_target, is_main_target=True)
@@ -122,115 +122,124 @@ class LifecycleMixin(TargetsMixin):
122
122
  BaseException: If any other unexpected error occurs during context entry.
123
123
  """
124
124
 
125
- await self.run()
125
+ await self.start()
126
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:
127
+ async def stop(self) -> None:
133
128
  """
134
129
  Stops the DevTools manager and cleans up resources.
135
130
 
136
131
  This method signals all targets to stop, closes the main logger, cancels the nursery,
137
132
  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
133
  """
144
134
 
145
135
  @log_on_error
146
- async def _stop_main_logger():
136
+ async def _stop_main_logger() -> None:
147
137
  """Stops the main logger and closes its channels."""
148
138
 
149
139
  if self._main_logger_cdp_send_channel is not None:
150
- await self._main_logger_cdp_send_channel.aclose()
140
+ try:
141
+ await self._main_logger_cdp_send_channel.aclose()
142
+ except TrioEndExceptions:
143
+ pass
144
+
151
145
  self._main_logger_cdp_send_channel = None
152
146
 
153
147
  if self._main_logger_fingerprint_send_channel is not None:
154
- await self._main_logger_fingerprint_send_channel.aclose()
148
+ try:
149
+ await self._main_logger_fingerprint_send_channel.aclose()
150
+ except TrioEndExceptions:
151
+ pass
152
+
155
153
  self._main_logger_fingerprint_send_channel = None
156
154
 
157
155
  if self._main_logger is not None:
158
- await self._main_logger.close()
156
+ try:
157
+ await self._main_logger.close()
158
+ except TrioEndExceptions:
159
+ pass
160
+
159
161
  self._main_logger = None
160
162
 
161
163
  @log_on_error
162
- async def _stop_all_targets():
164
+ async def _stop_all_targets() -> None:
163
165
  """Signals all active targets to stop and waits for their completion."""
164
166
 
165
167
  for target in self._handling_targets.copy().values():
166
168
  try:
167
169
  await target.stop()
168
170
  await target.stopped_event.wait()
169
- except (BaseException):
171
+ except (BaseException,):
170
172
  pass
171
173
 
172
- self._handling_targets = {}
174
+ self._handling_targets.clear()
173
175
 
174
176
  @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
177
+ async def _close_async_stack() -> None:
178
+ """
179
+ Closes the asynchronous resource stack.
180
+ """
181
181
 
182
182
  if self._nursery is not None:
183
- await self._nursery.__aexit__(exc_type, exc_val, exc_tb)
183
+ try:
184
+ self._nursery.cancel_scope.cancel()
185
+ except TrioEndExceptions:
186
+ pass
187
+
184
188
  self._nursery = None
185
-
186
- @log_on_error
187
- async def _close_bidi_connection():
188
- """Asynchronously exits the BiDi connection context manager."""
189
189
 
190
190
  if self._bidi_connection is not None:
191
- await self._bidi_connection.__aexit__(exc_type, exc_val, exc_tb)
192
191
  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
192
+
193
+ try:
194
+ await self._exit_stack.aclose()
195
+ except TrioEndExceptions:
196
+ pass
197
+ except AssertionError:
198
+ pass # TODO solve exit issue
199
+
200
+ if not self._is_active:
201
+ return
202
+
203
+ self._is_closing = True
204
+ self.exit_event.set()
205
+
206
+ await _stop_all_targets()
207
+ await _stop_main_logger()
208
+ await _close_async_stack()
209
+
210
+ self.exit_event = None
211
+ self._devtools_package = None
212
+ self._websocket_url = None
213
+ self._num_cdp_logs = 0
214
+ self._num_fingerprint_logs = 0
215
+ self._cdp_targets_types_stats.clear()
216
+ self._cdp_log_level_stats.clear()
217
+ self._fingerprint_categories_stats.clear()
218
+ self._fingerprint_log_level_stats.clear()
219
+ self._is_active = False
220
+ self._is_closing = False
215
221
 
216
222
  async def __aexit__(
217
223
  self,
218
224
  exc_type: Optional[Type[BaseException]],
219
225
  exc_val: Optional[BaseException],
220
226
  exc_tb: Optional[TracebackType],
221
- ):
227
+ ) -> bool:
222
228
  """
223
229
  Asynchronously exits the DevTools event handling context.
224
230
 
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
231
  Args:
231
- exc_type (Optional[Type[BaseException]]): The exception type, if any, that caused the context to be exited.
232
+ exc_type (Optional[Type[BaseException]]): The exception type, if any.
232
233
  exc_val (Optional[BaseException]): The exception value, if any.
233
234
  exc_tb (Optional[TracebackType]): The exception traceback, if any.
235
+
236
+ Returns:
237
+ bool: True if an exception was suppressed, False otherwise.
234
238
  """
235
239
 
236
- await self.stop(exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb)
240
+ await self.stop()
241
+
242
+ if exc_type is not None and exc_val is not None and exc_tb is not None:
243
+ return True
244
+
245
+ return False
@@ -1,7 +1,7 @@
1
1
  import trio
2
2
  from osn_selenium.dev_tools.manager.base import BaseMixin
3
+ from osn_selenium._exception_helpers import log_exception
3
4
  from osn_selenium.exceptions.devtools import CDPEndExceptions
4
- from osn_selenium.dev_tools._exception_helpers import log_exception
5
5
  from osn_selenium.dev_tools.logger.models import (
6
6
  CDPLogLevelStats,
7
7
  CDPMainLogEntry,
@@ -1,8 +1,11 @@
1
1
  from typing import Any, List, Optional
2
+
3
+ import trio
4
+
2
5
  from osn_selenium.dev_tools.models import TargetData
3
6
  from osn_selenium.dev_tools.target import DevToolsTarget
7
+ from osn_selenium._exception_helpers import log_exception
4
8
  from osn_selenium.dev_tools.manager.logging import LoggingMixin
5
- from osn_selenium.dev_tools._exception_helpers import log_exception
6
9
  from osn_selenium.dev_tools.logger.models import CDPTargetTypeStats
7
10
  from osn_selenium.exceptions.devtools import (
8
11
  BidiConnectionNotEstablishedError,
@@ -106,7 +109,7 @@ class TargetsMixin(LoggingMixin):
106
109
  websocket_url=self._websocket_url,
107
110
  new_targets_filter_list=self._new_targets_filter,
108
111
  new_targets_buffer_size=self._new_targets_buffer_size,
109
- nursery=self._nursery_object,
112
+ nursery=self._nursery,
110
113
  exit_event=self.exit_event,
111
114
  fingerprint_injection_script=self._fingerprint_injection_script,
112
115
  target_background_task=self._target_background_task,
@@ -123,7 +126,12 @@ class TargetsMixin(LoggingMixin):
123
126
 
124
127
  await self._add_main_cdp_log()
125
128
 
126
- self._nursery_object.start_soon(self._handling_targets[target_id].run)
129
+ if is_main_target:
130
+ self._nursery.start_soon(self._handling_targets[target_id].run)
131
+ await self._handling_targets[target_id].started_event.wait()
132
+ await trio.sleep(1.0)
133
+ else:
134
+ self._nursery.start_soon(self._handling_targets[target_id].run)
127
135
 
128
136
  return True
129
137
  else:
@@ -156,7 +164,7 @@ class TargetsMixin(LoggingMixin):
156
164
  """
157
165
 
158
166
  try:
159
- if self._bidi_connection_object is not None:
167
+ if self._bidi_connection is not None:
160
168
  targets_filter = self._devtools_package.get("target.TargetFilter")(
161
169
  [
162
170
  {"exclude": False, "type": "page"},
@@ -165,7 +173,7 @@ class TargetsMixin(LoggingMixin):
165
173
  ]
166
174
  )
167
175
 
168
- return await self._bidi_connection_object.session.execute(self._devtools_package.get("target.get_targets")(targets_filter))
176
+ return await self._bidi_connection.session.execute(self._devtools_package.get("target.get_targets")(targets_filter))
169
177
 
170
178
  raise BidiConnectionNotEstablishedError()
171
179
  except CDPEndExceptions as error:
@@ -1,5 +1,5 @@
1
1
  from typing import Optional
2
- from osn_selenium.models import DictModel
2
+ from osn_selenium._base_models import DictModel
3
3
 
4
4
 
5
5
  __all__ = ["FingerprintData", "TargetData"]
@@ -1,6 +1,6 @@
1
1
  from pathlib import Path
2
2
  from pydantic import Field
3
- from osn_selenium.models import DictModel
3
+ from osn_selenium._base_models import DictModel
4
4
  from osn_selenium.dev_tools.filters import TargetFilter
5
5
  from osn_selenium.dev_tools.domains import DomainsSettings
6
6
  from typing import (
@@ -39,6 +39,7 @@ class FingerprintLoggerSettings(DictModel):
39
39
  Defaults to "exclude".
40
40
  category_filter (Optional[Union[str, Sequence[str]]]): Specific categories to filter.
41
41
  Defaults to None.
42
+ send_wait (bool): Whether to wait for the log to be sent. Defaults to False.
42
43
  """
43
44
 
44
45
  buffer_size: int = 100
@@ -51,6 +52,7 @@ class FingerprintLoggerSettings(DictModel):
51
52
  ] = None
52
53
  category_filter_mode: Literal["exclude", "include"] = "exclude"
53
54
  category_filter: Optional[Union[str, Sequence[str]]] = None
55
+ send_wait: bool = False
54
56
 
55
57
 
56
58
  class CDPLoggerSettings(DictModel):
@@ -62,24 +64,26 @@ class CDPLoggerSettings(DictModel):
62
64
  log_level_filter_mode (Literal["exclude", "include"]): The mode for filtering log levels.
63
65
  "exclude" means log levels in `log_level_filter` will be excluded.
64
66
  "include" means only log levels in `log_level_filter` will be included.
65
- Defaults to "exclude".
67
+ Defaults to "include".
66
68
  log_level_filter (Optional[Union[CDPLogLevelsType, Sequence[CDPLogLevelsType]]]):
67
69
  A single log level or a sequence of log levels to filter by.
68
70
  Used in conjunction with `log_level_filter_mode`. Defaults to None.
69
71
  target_type_filter_mode (Literal["exclude", "include"]): The mode for filtering target types.
70
72
  "exclude" means target types in `target_type_filter` will be excluded.
71
73
  "include" means only target types in `target_type_filter` will be included.
72
- Defaults to "exclude".
74
+ Defaults to "include".
73
75
  target_type_filter (Optional[Union[str, Sequence[str]]]):
74
76
  A single target type string or a sequence of target type strings to filter by.
75
77
  Used in conjunction with `target_type_filter_mode`. Defaults to None.
78
+ send_wait (bool): Whether to wait for the log to be sent. Defaults to False.
76
79
  """
77
80
 
78
81
  buffer_size: int = 100
79
- log_level_filter_mode: Literal["exclude", "include"] = "exclude"
82
+ log_level_filter_mode: Literal["exclude", "include"] = "include"
80
83
  log_level_filter: Optional[Union[CDP_LOG_LEVELS_TYPEHINT, Sequence[CDP_LOG_LEVELS_TYPEHINT]]] = None
81
- target_type_filter_mode: Literal["exclude", "include"] = "exclude"
84
+ target_type_filter_mode: Literal["exclude", "include"] = "include"
82
85
  target_type_filter: Optional[Union[str, Sequence[str]]] = None
86
+ send_wait: bool = False
83
87
 
84
88
 
85
89
  class LoggerSettings(DictModel):
@@ -50,29 +50,6 @@ class BaseMixin:
50
50
  about_to_stop_event (trio.Event): Event set when the target is about to stop.
51
51
  stopped_event (trio.Event): Event set when the target handling has fully stopped.
52
52
  background_task_ended (Optional[trio.Event]): Event set when the background task completes.
53
- _is_main_target (bool): Whether this is the primary target.
54
- _logger_settings ("LoggerSettings"): Configuration for logging.
55
- _domains_settings (Optional["DomainsSettings"]): Configuration for enabled domains and handlers.
56
- _new_targets_filter_list (Sequence[Mapping[str, Any]]): Filters for discovering new targets.
57
- _new_targets_buffer_size (int): Buffer size for new target events.
58
- _nursery_object (trio.Nursery): Trio nursery for background tasks.
59
- _target_background_task (Optional[devtools_background_func_type]): Optional background task to run.
60
- _add_target_func (Callable): Callback to add a new target.
61
- _remove_target_func (Callable): Callback to remove this target.
62
- _add_cdp_log_func (Callable): Callback to record a CDP log entry.
63
- _add_fingerprint_log_func (Callable): Callback to record a fingerprint log entry.
64
- _fingerprint_injection_script (Optional[str]): JS script to inject into the target.
65
- _new_targets_events_filters (Any): Validated filters for target events.
66
- _cdp_target_type_log_accepted (bool): Whether CDP logging is enabled for this target type.
67
- _cdp_log_stats (CDPLoggerChannelStats): Statistics for CDP logs.
68
- _fingerprint_log_stats (FingerprintLoggerChannelStats): Statistics for fingerprint logs.
69
- _logger_cdp_send_channel (Optional[trio.MemorySendChannel]): Channel to send CDP logs to the logger.
70
- _logger_fingerprint_send_channel (Optional[trio.MemorySendChannel]): Channel to send fingerprint logs.
71
- _logger (Optional[TargetLogger]): The logger instance for this target.
72
- _cdp_session (Optional[CdpSession]): The active CDP session.
73
- _new_target_receive_channel (Optional[Tuple[trio.MemoryReceiveChannel, trio.Event]]): Channel for new target events.
74
- _detached_receive_channel (Optional[trio.MemoryReceiveChannel]): Channel for detach events.
75
- _events_receive_channels (Dict[str, Tuple[trio.MemoryReceiveChannel, trio.Event]]): Channels for domain events.
76
53
  """
77
54
 
78
55
  def __init__(
@@ -124,7 +101,7 @@ class BaseMixin:
124
101
  self.websocket_url = websocket_url
125
102
  self._new_targets_filter_list = new_targets_filter_list
126
103
  self._new_targets_buffer_size = new_targets_buffer_size
127
- self._nursery_object = nursery
104
+ self._nursery = nursery
128
105
  self.exit_event = exit_event
129
106
  self._target_background_task = target_background_task
130
107
  self._add_target_func = add_target_func
@@ -135,11 +112,14 @@ class BaseMixin:
135
112
 
136
113
  self._new_targets_events_filters = validate_target_event_filter(filter_=new_targets_filter_list)
137
114
 
138
- self._cdp_target_type_log_accepted = validate_type_filter(
139
- type_=self.type_,
140
- filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
141
- filter_instances=self._logger_settings.cdp_settings.target_type_filter
142
- )
115
+ if self._logger_settings.cdp_settings is not None:
116
+ self._cdp_target_type_log_accepted = validate_type_filter(
117
+ type_=self.type_,
118
+ filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
119
+ filter_instances=self._logger_settings.cdp_settings.target_type_filter
120
+ )
121
+ else:
122
+ self._cdp_target_type_log_accepted = False
143
123
 
144
124
  self._cdp_log_stats = CDPLoggerChannelStats(
145
125
  target_id=target_data.target_id,
@@ -164,6 +144,7 @@ class BaseMixin:
164
144
  self._new_target_receive_channel: Optional[Tuple[trio.MemoryReceiveChannel, trio.Event]] = None
165
145
  self._detached_receive_channel: Optional[trio.MemoryReceiveChannel] = None
166
146
  self._events_receive_channels: Dict[str, Tuple[trio.MemoryReceiveChannel, trio.Event]] = {}
147
+ self._cancel_scopes: Dict[str, trio.CancelScope] = {}
167
148
 
168
149
  @property
169
150
  def type_(self) -> Optional[str]:
@@ -185,11 +166,15 @@ class BaseMixin:
185
166
  value (Optional[str]): The new target type.
186
167
  """
187
168
 
188
- self._cdp_target_type_log_accepted = validate_type_filter(
189
- type_=value,
190
- filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
191
- filter_instances=self._logger_settings.cdp_settings.target_type_filter
192
- )
169
+ if self._logger_settings.cdp_settings is not None:
170
+ self._cdp_target_type_log_accepted = validate_type_filter(
171
+ type_=value,
172
+ filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
173
+ filter_instances=self._logger_settings.cdp_settings.target_type_filter
174
+ )
175
+ else:
176
+ self._cdp_target_type_log_accepted = False
177
+
193
178
  self.target_data.type_ = value
194
179
 
195
180
  @property
@@ -258,6 +243,17 @@ class BaseMixin:
258
243
 
259
244
  self.target_data.can_access_opener = value
260
245
 
246
+ @property
247
+ def cancel_scopes(self) -> Dict[str, trio.CancelScope]:
248
+ """
249
+ Provides access to the dictionary of cancellation scopes.
250
+
251
+ Returns:
252
+ Dict[str, trio.CancelScope]: The cancel scopes dictionary.
253
+ """
254
+
255
+ return self._cancel_scopes
256
+
261
257
  @property
262
258
  def cdp_log_stats(self) -> CDPLoggerChannelStats:
263
259
  """
@@ -65,7 +65,7 @@ class DiscoveryMixin(LoggingMixin):
65
65
  flatten=True
66
66
  )
67
67
 
68
- self._nursery_object.start_soon(self._add_target_func, event)
68
+ self._nursery.start_soon(self._add_target_func, event)
69
69
  except* CDPEndExceptions:
70
70
  keep_alive = False
71
71
  except* BaseException as error:
@@ -59,7 +59,7 @@ class EventHandlersMixin(LoggingMixin):
59
59
  while keep_alive:
60
60
  try:
61
61
  event = await receiver_channel.receive()
62
- self._nursery_object.start_soon(handler, self, event_config, event)
62
+ self._nursery.start_soon(handler, self, event_config, event)
63
63
  except* CDPEndExceptions:
64
64
  keep_alive = False
65
65
  except* BaseException as error:
@@ -99,7 +99,7 @@ class EventHandlersMixin(LoggingMixin):
99
99
  event_handler_ready_event = trio.Event()
100
100
  events_handlers_ready_events.append(event_handler_ready_event)
101
101
 
102
- self._nursery_object.start_soon(
102
+ self._nursery.start_soon(
103
103
  self._run_event_handler,
104
104
  event_handler_ready_event,
105
105
  getattr(domain_config.handlers, event_name)
@@ -118,7 +118,7 @@ class FingerprintMixin(LoggingMixin):
118
118
  run_immediately=True,
119
119
  )
120
120
 
121
- self._nursery_object.start_soon(self._run_fingerprint_detect_listener, ready_event)
121
+ self._nursery.start_soon(self._run_fingerprint_detect_listener, ready_event)
122
122
  except* CDPEndExceptions as error:
123
123
  raise error
124
124
  except* BaseException as error: