osn-selenium 1.1.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 (418) hide show
  1. osn_selenium/_decorators.py +57 -0
  2. osn_selenium/_trio_threads_helpers.py +157 -0
  3. osn_selenium/_typehints.py +1 -1
  4. osn_selenium/abstract/webdriver/blink/base.py +14 -0
  5. osn_selenium/abstract/webdriver/blink/lifecycle.py +8 -8
  6. osn_selenium/abstract/webdriver/core/base.py +0 -14
  7. osn_selenium/abstract/webdriver/core/capture.py +4 -3
  8. osn_selenium/abstract/webdriver/core/lifecycle.py +8 -8
  9. osn_selenium/abstract/webdriver/core/script.py +5 -4
  10. osn_selenium/abstract/webdriver/core/window.py +11 -11
  11. osn_selenium/dev_tools/_decorators.py +1 -42
  12. osn_selenium/dev_tools/_functions.py +2 -4
  13. osn_selenium/dev_tools/domains/__init__.py +1 -1
  14. osn_selenium/dev_tools/domains/fetch.py +5 -7
  15. osn_selenium/dev_tools/domains_default/fetch.py +1 -1
  16. osn_selenium/dev_tools/logger/main.py +9 -9
  17. osn_selenium/dev_tools/logger/target.py +7 -7
  18. osn_selenium/dev_tools/manager/base.py +10 -19
  19. osn_selenium/dev_tools/manager/lifecycle.py +83 -74
  20. osn_selenium/dev_tools/manager/logging.py +1 -1
  21. osn_selenium/dev_tools/manager/targets.py +13 -5
  22. osn_selenium/dev_tools/settings.py +4 -4
  23. osn_selenium/dev_tools/target/base.py +18 -11
  24. osn_selenium/dev_tools/target/discovery.py +1 -1
  25. osn_selenium/dev_tools/target/events.py +2 -2
  26. osn_selenium/dev_tools/target/fingerprint.py +1 -1
  27. osn_selenium/dev_tools/target/lifecycle.py +103 -43
  28. osn_selenium/dev_tools/target/logging.py +1 -1
  29. osn_selenium/exceptions/__init__.py +0 -1
  30. osn_selenium/exceptions/base.py +28 -1
  31. osn_selenium/exceptions/bidi_bridge.py +59 -0
  32. osn_selenium/exceptions/configuration.py +1 -8
  33. osn_selenium/exceptions/dependencies.py +2 -2
  34. osn_selenium/exceptions/devtools.py +9 -39
  35. osn_selenium/exceptions/experimental.py +26 -0
  36. osn_selenium/exceptions/flags.py +0 -2
  37. osn_selenium/exceptions/instance.py +1 -9
  38. osn_selenium/exceptions/javascript.py +0 -2
  39. osn_selenium/exceptions/logic.py +0 -2
  40. osn_selenium/exceptions/path.py +1 -9
  41. osn_selenium/exceptions/platform.py +0 -2
  42. osn_selenium/exceptions/protocol.py +0 -3
  43. osn_selenium/exceptions/webdriver.py +1 -7
  44. osn_selenium/exceptions/window.py +1 -8
  45. osn_selenium/executors/sync/cdp.py +0 -5
  46. osn_selenium/executors/trio_bidi/cdp.py +101 -0
  47. osn_selenium/executors/trio_bidi/javascript.py +101 -0
  48. osn_selenium/executors/trio_threads/cdp.py +0 -5
  49. osn_selenium/flags/base.py +6 -4
  50. osn_selenium/flags/blink.py +2 -2
  51. osn_selenium/flags/chrome.py +6 -6
  52. osn_selenium/flags/edge.py +6 -6
  53. osn_selenium/instances/convert.py +44 -3
  54. osn_selenium/instances/protocols.py +47 -1
  55. osn_selenium/instances/sync/browsing_context.py +2 -2
  56. osn_selenium/instances/sync/script.py +7 -2
  57. osn_selenium/instances/sync/web_element.py +1 -1
  58. osn_selenium/instances/trio_bidi/__init__.py +1 -0
  59. osn_selenium/instances/trio_bidi/shadow_root.py +180 -0
  60. osn_selenium/instances/trio_bidi/switch_to.py +143 -0
  61. osn_selenium/instances/trio_bidi/web_driver_wait.py +124 -0
  62. osn_selenium/instances/trio_bidi/web_element.py +239 -0
  63. osn_selenium/instances/trio_threads/browsing_context.py +2 -2
  64. osn_selenium/instances/trio_threads/fedcm.py +1 -1
  65. osn_selenium/instances/trio_threads/network.py +1 -1
  66. osn_selenium/instances/trio_threads/script.py +7 -2
  67. osn_selenium/instances/trio_threads/web_extension.py +1 -1
  68. osn_selenium/instances/unified/browsing_context.py +2 -2
  69. osn_selenium/instances/unified/script.py +2 -2
  70. osn_selenium/instances/unified/web_element.py +3 -5
  71. osn_selenium/javascript/fingerprint/__init__.py +2 -1
  72. osn_selenium/trio_bidi/__init__.py +1 -0
  73. osn_selenium/trio_bidi/_context_vars.py +12 -0
  74. osn_selenium/trio_bidi/_error_mappings.py +123 -0
  75. osn_selenium/trio_bidi/_error_redirects.py +194 -0
  76. osn_selenium/trio_bidi/_file_functions.py +28 -0
  77. osn_selenium/trio_bidi/_internal_mappings.py +10 -0
  78. osn_selenium/trio_bidi/_models.py +199 -0
  79. osn_selenium/trio_bidi/_typehints.py +20 -0
  80. osn_selenium/trio_bidi/connection_pool.py +587 -0
  81. osn_selenium/trio_bidi/mapping/__init__.py +1 -0
  82. osn_selenium/trio_bidi/mapping/_constants.py +14 -0
  83. osn_selenium/trio_bidi/mapping/_js_snippets.py +285 -0
  84. osn_selenium/trio_bidi/mapping/_utils.py +4 -0
  85. osn_selenium/trio_bidi/mapping/request_functions/__init__.py +87 -0
  86. osn_selenium/trio_bidi/mapping/request_functions/_alert.py +102 -0
  87. osn_selenium/trio_bidi/mapping/request_functions/_args_helpers.py +225 -0
  88. osn_selenium/trio_bidi/mapping/request_functions/_capture.py +71 -0
  89. osn_selenium/trio_bidi/mapping/request_functions/_cdp.py +40 -0
  90. osn_selenium/trio_bidi/mapping/request_functions/_element.py +55 -0
  91. osn_selenium/trio_bidi/mapping/request_functions/_file.py +32 -0
  92. osn_selenium/trio_bidi/mapping/request_functions/_navigation.py +147 -0
  93. osn_selenium/trio_bidi/mapping/request_functions/_script.py +85 -0
  94. osn_selenium/trio_bidi/mapping/request_functions/_shadow_root.py +65 -0
  95. osn_selenium/trio_bidi/mapping/request_functions/_switch_to.py +59 -0
  96. osn_selenium/trio_bidi/mapping/request_functions/_web_element.py +448 -0
  97. osn_selenium/trio_bidi/mapping/request_functions/_window.py +125 -0
  98. osn_selenium/trio_bidi/mapping/response_functions/__init__.py +86 -0
  99. osn_selenium/trio_bidi/mapping/response_functions/_alert.py +81 -0
  100. osn_selenium/trio_bidi/mapping/response_functions/_args_helpers.py +183 -0
  101. osn_selenium/trio_bidi/mapping/response_functions/_args_validators.py +153 -0
  102. osn_selenium/trio_bidi/mapping/response_functions/_capture.py +71 -0
  103. osn_selenium/trio_bidi/mapping/response_functions/_cdp.py +26 -0
  104. osn_selenium/trio_bidi/mapping/response_functions/_element.py +58 -0
  105. osn_selenium/trio_bidi/mapping/response_functions/_file.py +30 -0
  106. osn_selenium/trio_bidi/mapping/response_functions/_navigation.py +120 -0
  107. osn_selenium/trio_bidi/mapping/response_functions/_script.py +57 -0
  108. osn_selenium/trio_bidi/mapping/response_functions/_shadow_root.py +58 -0
  109. osn_selenium/trio_bidi/mapping/response_functions/_switch_to.py +57 -0
  110. osn_selenium/trio_bidi/mapping/response_functions/_web_element.py +368 -0
  111. osn_selenium/trio_bidi/mapping/response_functions/_window.py +119 -0
  112. osn_selenium/trio_bidi/mixin.py +186 -0
  113. osn_selenium/trio_bidi/remote_connection.py +164 -0
  114. osn_selenium/trio_threads_mixin.py +22 -68
  115. osn_selenium/webdrivers/_args_helpers.py +118 -5
  116. osn_selenium/webdrivers/_typehints.py +9 -3
  117. osn_selenium/webdrivers/protocols.py +81 -1
  118. osn_selenium/webdrivers/sync/blink/base.py +10 -0
  119. osn_selenium/webdrivers/sync/blink/lifecycle.py +26 -8
  120. osn_selenium/webdrivers/sync/chrome/lifecycle.py +23 -5
  121. osn_selenium/webdrivers/sync/chrome/settings.py +6 -1
  122. osn_selenium/webdrivers/sync/core/base.py +3 -11
  123. osn_selenium/webdrivers/sync/core/capture.py +3 -2
  124. osn_selenium/webdrivers/sync/core/file.py +3 -2
  125. osn_selenium/webdrivers/sync/core/lifecycle.py +44 -10
  126. osn_selenium/webdrivers/sync/core/script.py +3 -2
  127. osn_selenium/webdrivers/sync/core/window.py +3 -3
  128. osn_selenium/webdrivers/sync/edge/lifecycle.py +23 -5
  129. osn_selenium/webdrivers/sync/edge/settings.py +6 -1
  130. osn_selenium/webdrivers/sync/yandex/lifecycle.py +23 -5
  131. osn_selenium/webdrivers/sync/yandex/settings.py +6 -1
  132. osn_selenium/webdrivers/trio_bidi/__init__.py +1 -0
  133. osn_selenium/webdrivers/trio_bidi/blink/__init__.py +132 -0
  134. osn_selenium/webdrivers/trio_bidi/blink/base.py +167 -0
  135. osn_selenium/webdrivers/trio_bidi/blink/lifecycle.py +89 -0
  136. osn_selenium/webdrivers/trio_bidi/blink/settings.py +63 -0
  137. osn_selenium/webdrivers/trio_bidi/chrome/__init__.py +114 -0
  138. osn_selenium/webdrivers/trio_bidi/chrome/base.py +127 -0
  139. osn_selenium/webdrivers/trio_bidi/chrome/lifecycle.py +85 -0
  140. osn_selenium/webdrivers/trio_bidi/chrome/settings.py +63 -0
  141. osn_selenium/webdrivers/trio_bidi/core/__init__.py +95 -0
  142. osn_selenium/webdrivers/trio_bidi/core/actions.py +70 -0
  143. osn_selenium/webdrivers/trio_bidi/core/base.py +200 -0
  144. osn_selenium/webdrivers/trio_bidi/core/capture.py +39 -0
  145. osn_selenium/webdrivers/trio_bidi/core/devtools.py +49 -0
  146. osn_selenium/webdrivers/trio_bidi/core/element.py +64 -0
  147. osn_selenium/webdrivers/trio_bidi/core/lifecycle.py +135 -0
  148. osn_selenium/webdrivers/trio_bidi/core/navigation.py +37 -0
  149. osn_selenium/webdrivers/trio_bidi/core/script.py +56 -0
  150. osn_selenium/webdrivers/trio_bidi/core/settings.py +36 -0
  151. osn_selenium/webdrivers/trio_bidi/core/window.py +134 -0
  152. osn_selenium/webdrivers/trio_bidi/edge/__init__.py +114 -0
  153. osn_selenium/webdrivers/trio_bidi/edge/base.py +123 -0
  154. osn_selenium/webdrivers/trio_bidi/edge/lifecycle.py +85 -0
  155. osn_selenium/webdrivers/trio_bidi/edge/settings.py +63 -0
  156. osn_selenium/webdrivers/trio_bidi/yandex/__init__.py +114 -0
  157. osn_selenium/webdrivers/trio_bidi/yandex/base.py +120 -0
  158. osn_selenium/webdrivers/trio_bidi/yandex/lifecycle.py +85 -0
  159. osn_selenium/webdrivers/trio_bidi/yandex/settings.py +63 -0
  160. osn_selenium/webdrivers/trio_threads/blink/__init__.py +7 -1
  161. osn_selenium/webdrivers/trio_threads/blink/base.py +14 -0
  162. osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +26 -8
  163. osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +23 -5
  164. osn_selenium/webdrivers/trio_threads/chrome/settings.py +1 -1
  165. osn_selenium/webdrivers/trio_threads/core/__init__.py +0 -10
  166. osn_selenium/webdrivers/trio_threads/core/actions.py +1 -1
  167. osn_selenium/webdrivers/trio_threads/core/auth.py +1 -1
  168. osn_selenium/webdrivers/trio_threads/core/base.py +4 -16
  169. osn_selenium/webdrivers/trio_threads/core/capture.py +3 -2
  170. osn_selenium/webdrivers/trio_threads/core/file.py +3 -2
  171. osn_selenium/webdrivers/trio_threads/core/lifecycle.py +44 -10
  172. osn_selenium/webdrivers/trio_threads/core/script.py +3 -2
  173. osn_selenium/webdrivers/trio_threads/core/settings.py +1 -1
  174. osn_selenium/webdrivers/trio_threads/core/storage.py +1 -1
  175. osn_selenium/webdrivers/trio_threads/core/timeouts.py +1 -1
  176. osn_selenium/webdrivers/trio_threads/core/window.py +4 -4
  177. osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +23 -5
  178. osn_selenium/webdrivers/trio_threads/edge/settings.py +1 -1
  179. osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +23 -5
  180. osn_selenium/webdrivers/trio_threads/yandex/settings.py +1 -1
  181. osn_selenium/webdrivers/unified/blink/base.py +5 -1
  182. osn_selenium/webdrivers/unified/blink/lifecycle.py +4 -2
  183. osn_selenium/webdrivers/unified/chrome/base.py +5 -1
  184. osn_selenium/webdrivers/unified/core/auth.py +4 -2
  185. osn_selenium/webdrivers/unified/core/base.py +16 -10
  186. osn_selenium/webdrivers/unified/core/capture.py +3 -2
  187. osn_selenium/webdrivers/unified/core/components.py +12 -7
  188. osn_selenium/webdrivers/unified/core/devtools.py +2 -1
  189. osn_selenium/webdrivers/unified/core/file.py +3 -2
  190. osn_selenium/webdrivers/unified/core/lifecycle.py +5 -3
  191. osn_selenium/webdrivers/unified/core/script.py +5 -3
  192. osn_selenium/webdrivers/unified/core/storage.py +2 -1
  193. osn_selenium/webdrivers/unified/core/window.py +9 -8
  194. osn_selenium/webdrivers/unified/edge/base.py +5 -1
  195. osn_selenium/webdrivers/unified/yandex/base.py +5 -1
  196. {osn_selenium-1.1.0.dist-info → osn_selenium-1.2.0.dist-info}/METADATA +3 -2
  197. osn_selenium-1.2.0.dist-info/RECORD +480 -0
  198. osn_selenium/abstract/executors/cdp/__init__.py +0 -435
  199. osn_selenium/abstract/executors/cdp/accessibility.py +0 -62
  200. osn_selenium/abstract/executors/cdp/animation.py +0 -47
  201. osn_selenium/abstract/executors/cdp/audits.py +0 -39
  202. osn_selenium/abstract/executors/cdp/autofill.py +0 -34
  203. osn_selenium/abstract/executors/cdp/background_service.py +0 -22
  204. osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +0 -95
  205. osn_selenium/abstract/executors/cdp/browser.py +0 -122
  206. osn_selenium/abstract/executors/cdp/cache_storage.py +0 -49
  207. osn_selenium/abstract/executors/cdp/cast.py +0 -31
  208. osn_selenium/abstract/executors/cdp/console.py +0 -18
  209. osn_selenium/abstract/executors/cdp/css.py +0 -197
  210. osn_selenium/abstract/executors/cdp/debugger.py +0 -198
  211. osn_selenium/abstract/executors/cdp/device_access.py +0 -22
  212. osn_selenium/abstract/executors/cdp/device_orientation.py +0 -14
  213. osn_selenium/abstract/executors/cdp/dom.py +0 -305
  214. osn_selenium/abstract/executors/cdp/dom_debugger.py +0 -57
  215. osn_selenium/abstract/executors/cdp/dom_snapshot.py +0 -42
  216. osn_selenium/abstract/executors/cdp/dom_storage.py +0 -31
  217. osn_selenium/abstract/executors/cdp/emulation.py +0 -259
  218. osn_selenium/abstract/executors/cdp/event_breakpoints.py +0 -18
  219. osn_selenium/abstract/executors/cdp/extensions.py +0 -31
  220. osn_selenium/abstract/executors/cdp/fed_cm.py +0 -35
  221. osn_selenium/abstract/executors/cdp/fetch.py +0 -76
  222. osn_selenium/abstract/executors/cdp/file_system.py +0 -11
  223. osn_selenium/abstract/executors/cdp/headless_experimental.py +0 -30
  224. osn_selenium/abstract/executors/cdp/heap_profiler.py +0 -73
  225. osn_selenium/abstract/executors/cdp/indexed_db.py +0 -99
  226. osn_selenium/abstract/executors/cdp/input.py +0 -158
  227. osn_selenium/abstract/executors/cdp/inspector.py +0 -14
  228. osn_selenium/abstract/executors/cdp/io.py +0 -24
  229. osn_selenium/abstract/executors/cdp/layer_tree.py +0 -61
  230. osn_selenium/abstract/executors/cdp/log.py +0 -27
  231. osn_selenium/abstract/executors/cdp/media.py +0 -14
  232. osn_selenium/abstract/executors/cdp/memory.py +0 -61
  233. osn_selenium/abstract/executors/cdp/network.py +0 -252
  234. osn_selenium/abstract/executors/cdp/overlay.py +0 -166
  235. osn_selenium/abstract/executors/cdp/page.py +0 -347
  236. osn_selenium/abstract/executors/cdp/performance.py +0 -28
  237. osn_selenium/abstract/executors/cdp/performance_timeline.py +0 -11
  238. osn_selenium/abstract/executors/cdp/preload.py +0 -14
  239. osn_selenium/abstract/executors/cdp/profiler.py +0 -54
  240. osn_selenium/abstract/executors/cdp/pwa.py +0 -46
  241. osn_selenium/abstract/executors/cdp/runtime.py +0 -176
  242. osn_selenium/abstract/executors/cdp/schema.py +0 -11
  243. osn_selenium/abstract/executors/cdp/security.py +0 -26
  244. osn_selenium/abstract/executors/cdp/service_worker.py +0 -54
  245. osn_selenium/abstract/executors/cdp/storage.py +0 -175
  246. osn_selenium/abstract/executors/cdp/system_info.py +0 -24
  247. osn_selenium/abstract/executors/cdp/target.py +0 -125
  248. osn_selenium/abstract/executors/cdp/tethering.py +0 -14
  249. osn_selenium/abstract/executors/cdp/tracing.py +0 -48
  250. osn_selenium/abstract/executors/cdp/web_audio.py +0 -19
  251. osn_selenium/abstract/executors/cdp/web_authn.py +0 -76
  252. osn_selenium/base_mixin.py +0 -122
  253. osn_selenium/executors/sync/cdp/__init__.py +0 -550
  254. osn_selenium/executors/sync/cdp/accessibility.py +0 -74
  255. osn_selenium/executors/sync/cdp/animation.py +0 -50
  256. osn_selenium/executors/sync/cdp/audits.py +0 -48
  257. osn_selenium/executors/sync/cdp/autofill.py +0 -39
  258. osn_selenium/executors/sync/cdp/background_service.py +0 -30
  259. osn_selenium/executors/sync/cdp/bluetooth_emulation.py +0 -101
  260. osn_selenium/executors/sync/cdp/browser.py +0 -131
  261. osn_selenium/executors/sync/cdp/cache_storage.py +0 -66
  262. osn_selenium/executors/sync/cdp/cast.py +0 -38
  263. osn_selenium/executors/sync/cdp/console.py +0 -24
  264. osn_selenium/executors/sync/cdp/css.py +0 -187
  265. osn_selenium/executors/sync/cdp/debugger.py +0 -206
  266. osn_selenium/executors/sync/cdp/device_access.py +0 -27
  267. osn_selenium/executors/sync/cdp/device_orientation.py +0 -24
  268. osn_selenium/executors/sync/cdp/dom.py +0 -310
  269. osn_selenium/executors/sync/cdp/dom_debugger.py +0 -56
  270. osn_selenium/executors/sync/cdp/dom_snapshot.py +0 -58
  271. osn_selenium/executors/sync/cdp/dom_storage.py +0 -38
  272. osn_selenium/executors/sync/cdp/emulation.py +0 -270
  273. osn_selenium/executors/sync/cdp/event_breakpoints.py +0 -27
  274. osn_selenium/executors/sync/cdp/extensions.py +0 -39
  275. osn_selenium/executors/sync/cdp/fed_cm.py +0 -45
  276. osn_selenium/executors/sync/cdp/fetch.py +0 -96
  277. osn_selenium/executors/sync/cdp/file_system.py +0 -18
  278. osn_selenium/executors/sync/cdp/headless_experimental.py +0 -44
  279. osn_selenium/executors/sync/cdp/heap_profiler.py +0 -89
  280. osn_selenium/executors/sync/cdp/indexed_db.py +0 -142
  281. osn_selenium/executors/sync/cdp/input.py +0 -233
  282. osn_selenium/executors/sync/cdp/inspector.py +0 -21
  283. osn_selenium/executors/sync/cdp/io.py +0 -33
  284. osn_selenium/executors/sync/cdp/layer_tree.py +0 -71
  285. osn_selenium/executors/sync/cdp/log.py +0 -35
  286. osn_selenium/executors/sync/cdp/media.py +0 -21
  287. osn_selenium/executors/sync/cdp/memory.py +0 -62
  288. osn_selenium/executors/sync/cdp/network.py +0 -287
  289. osn_selenium/executors/sync/cdp/overlay.py +0 -174
  290. osn_selenium/executors/sync/cdp/page.py +0 -365
  291. osn_selenium/executors/sync/cdp/performance.py +0 -33
  292. osn_selenium/executors/sync/cdp/performance_timeline.py +0 -26
  293. osn_selenium/executors/sync/cdp/preload.py +0 -21
  294. osn_selenium/executors/sync/cdp/profiler.py +0 -58
  295. osn_selenium/executors/sync/cdp/pwa.py +0 -55
  296. osn_selenium/executors/sync/cdp/runtime.py +0 -221
  297. osn_selenium/executors/sync/cdp/schema.py +0 -23
  298. osn_selenium/executors/sync/cdp/security.py +0 -30
  299. osn_selenium/executors/sync/cdp/service_worker.py +0 -56
  300. osn_selenium/executors/sync/cdp/storage.py +0 -151
  301. osn_selenium/executors/sync/cdp/system_info.py +0 -30
  302. osn_selenium/executors/sync/cdp/target.py +0 -147
  303. osn_selenium/executors/sync/cdp/tethering.py +0 -21
  304. osn_selenium/executors/sync/cdp/tracing.py +0 -62
  305. osn_selenium/executors/sync/cdp/web_audio.py +0 -24
  306. osn_selenium/executors/sync/cdp/web_authn.py +0 -82
  307. osn_selenium/executors/trio_threads/cdp/__init__.py +0 -771
  308. osn_selenium/executors/trio_threads/cdp/accessibility.py +0 -87
  309. osn_selenium/executors/trio_threads/cdp/animation.py +0 -63
  310. osn_selenium/executors/trio_threads/cdp/audits.py +0 -57
  311. osn_selenium/executors/trio_threads/cdp/autofill.py +0 -52
  312. osn_selenium/executors/trio_threads/cdp/background_service.py +0 -40
  313. osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +0 -111
  314. osn_selenium/executors/trio_threads/cdp/browser.py +0 -140
  315. osn_selenium/executors/trio_threads/cdp/cache_storage.py +0 -79
  316. osn_selenium/executors/trio_threads/cdp/cast.py +0 -47
  317. osn_selenium/executors/trio_threads/cdp/console.py +0 -33
  318. osn_selenium/executors/trio_threads/cdp/css.py +0 -196
  319. osn_selenium/executors/trio_threads/cdp/debugger.py +0 -219
  320. osn_selenium/executors/trio_threads/cdp/device_access.py +0 -40
  321. osn_selenium/executors/trio_threads/cdp/device_orientation.py +0 -34
  322. osn_selenium/executors/trio_threads/cdp/dom.py +0 -319
  323. osn_selenium/executors/trio_threads/cdp/dom_debugger.py +0 -69
  324. osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +0 -71
  325. osn_selenium/executors/trio_threads/cdp/dom_storage.py +0 -51
  326. osn_selenium/executors/trio_threads/cdp/emulation.py +0 -283
  327. osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +0 -37
  328. osn_selenium/executors/trio_threads/cdp/extensions.py +0 -52
  329. osn_selenium/executors/trio_threads/cdp/fed_cm.py +0 -54
  330. osn_selenium/executors/trio_threads/cdp/fetch.py +0 -105
  331. osn_selenium/executors/trio_threads/cdp/file_system.py +0 -31
  332. osn_selenium/executors/trio_threads/cdp/headless_experimental.py +0 -54
  333. osn_selenium/executors/trio_threads/cdp/heap_profiler.py +0 -102
  334. osn_selenium/executors/trio_threads/cdp/indexed_db.py +0 -155
  335. osn_selenium/executors/trio_threads/cdp/input.py +0 -242
  336. osn_selenium/executors/trio_threads/cdp/inspector.py +0 -34
  337. osn_selenium/executors/trio_threads/cdp/io.py +0 -42
  338. osn_selenium/executors/trio_threads/cdp/layer_tree.py +0 -84
  339. osn_selenium/executors/trio_threads/cdp/log.py +0 -44
  340. osn_selenium/executors/trio_threads/cdp/media.py +0 -30
  341. osn_selenium/executors/trio_threads/cdp/memory.py +0 -71
  342. osn_selenium/executors/trio_threads/cdp/network.py +0 -296
  343. osn_selenium/executors/trio_threads/cdp/overlay.py +0 -183
  344. osn_selenium/executors/trio_threads/cdp/page.py +0 -374
  345. osn_selenium/executors/trio_threads/cdp/performance.py +0 -46
  346. osn_selenium/executors/trio_threads/cdp/performance_timeline.py +0 -36
  347. osn_selenium/executors/trio_threads/cdp/preload.py +0 -30
  348. osn_selenium/executors/trio_threads/cdp/profiler.py +0 -71
  349. osn_selenium/executors/trio_threads/cdp/pwa.py +0 -64
  350. osn_selenium/executors/trio_threads/cdp/runtime.py +0 -230
  351. osn_selenium/executors/trio_threads/cdp/schema.py +0 -32
  352. osn_selenium/executors/trio_threads/cdp/security.py +0 -43
  353. osn_selenium/executors/trio_threads/cdp/service_worker.py +0 -69
  354. osn_selenium/executors/trio_threads/cdp/storage.py +0 -162
  355. osn_selenium/executors/trio_threads/cdp/system_info.py +0 -43
  356. osn_selenium/executors/trio_threads/cdp/target.py +0 -156
  357. osn_selenium/executors/trio_threads/cdp/tethering.py +0 -34
  358. osn_selenium/executors/trio_threads/cdp/tracing.py +0 -71
  359. osn_selenium/executors/trio_threads/cdp/web_audio.py +0 -37
  360. osn_selenium/executors/trio_threads/cdp/web_authn.py +0 -95
  361. osn_selenium/executors/unified/cdp/accessibility.py +0 -81
  362. osn_selenium/executors/unified/cdp/animation.py +0 -50
  363. osn_selenium/executors/unified/cdp/audits.py +0 -45
  364. osn_selenium/executors/unified/cdp/autofill.py +0 -41
  365. osn_selenium/executors/unified/cdp/background_service.py +0 -24
  366. osn_selenium/executors/unified/cdp/bluetooth_emulation.py +0 -132
  367. osn_selenium/executors/unified/cdp/browser.py +0 -143
  368. osn_selenium/executors/unified/cdp/cache_storage.py +0 -69
  369. osn_selenium/executors/unified/cdp/cast.py +0 -32
  370. osn_selenium/executors/unified/cdp/console.py +0 -18
  371. osn_selenium/executors/unified/cdp/css.py +0 -237
  372. osn_selenium/executors/unified/cdp/debugger.py +0 -243
  373. osn_selenium/executors/unified/cdp/device_access.py +0 -21
  374. osn_selenium/executors/unified/cdp/device_orientation.py +0 -18
  375. osn_selenium/executors/unified/cdp/dom.py +0 -380
  376. osn_selenium/executors/unified/cdp/dom_debugger.py +0 -65
  377. osn_selenium/executors/unified/cdp/dom_snapshot.py +0 -58
  378. osn_selenium/executors/unified/cdp/dom_storage.py +0 -38
  379. osn_selenium/executors/unified/cdp/emulation.py +0 -312
  380. osn_selenium/executors/unified/cdp/event_breakpoints.py +0 -24
  381. osn_selenium/executors/unified/cdp/extensions.py +0 -45
  382. osn_selenium/executors/unified/cdp/fed_cm.py +0 -51
  383. osn_selenium/executors/unified/cdp/fetch.py +0 -111
  384. osn_selenium/executors/unified/cdp/file_system.py +0 -15
  385. osn_selenium/executors/unified/cdp/headless_experimental.py +0 -38
  386. osn_selenium/executors/unified/cdp/heap_profiler.py +0 -101
  387. osn_selenium/executors/unified/cdp/indexed_db.py +0 -157
  388. osn_selenium/executors/unified/cdp/input.py +0 -254
  389. osn_selenium/executors/unified/cdp/inspector.py +0 -15
  390. osn_selenium/executors/unified/cdp/io.py +0 -29
  391. osn_selenium/executors/unified/cdp/layer_tree.py +0 -71
  392. osn_selenium/executors/unified/cdp/log.py +0 -29
  393. osn_selenium/executors/unified/cdp/media.py +0 -15
  394. osn_selenium/executors/unified/cdp/memory.py +0 -59
  395. osn_selenium/executors/unified/cdp/network.py +0 -323
  396. osn_selenium/executors/unified/cdp/overlay.py +0 -209
  397. osn_selenium/executors/unified/cdp/page.py +0 -410
  398. osn_selenium/executors/unified/cdp/performance.py +0 -27
  399. osn_selenium/executors/unified/cdp/performance_timeline.py +0 -17
  400. osn_selenium/executors/unified/cdp/preload.py +0 -15
  401. osn_selenium/executors/unified/cdp/profiler.py +0 -55
  402. osn_selenium/executors/unified/cdp/pwa.py +0 -55
  403. osn_selenium/executors/unified/cdp/runtime.py +0 -245
  404. osn_selenium/executors/unified/cdp/schema.py +0 -17
  405. osn_selenium/executors/unified/cdp/security.py +0 -27
  406. osn_selenium/executors/unified/cdp/service_worker.py +0 -62
  407. osn_selenium/executors/unified/cdp/storage.py +0 -178
  408. osn_selenium/executors/unified/cdp/system_info.py +0 -24
  409. osn_selenium/executors/unified/cdp/target.py +0 -165
  410. osn_selenium/executors/unified/cdp/tethering.py +0 -15
  411. osn_selenium/executors/unified/cdp/tracing.py +0 -62
  412. osn_selenium/executors/unified/cdp/web_audio.py +0 -18
  413. osn_selenium/executors/unified/cdp/web_authn.py +0 -103
  414. osn_selenium-1.1.0.dist-info/RECORD +0 -615
  415. /osn_selenium/{dev_tools/_exception_helpers.py → _exception_helpers.py} +0 -0
  416. /osn_selenium/executors/{unified/cdp → trio_bidi}/__init__.py +0 -0
  417. {osn_selenium-1.1.0.dist-info → osn_selenium-1.2.0.dist-info}/WHEEL +0 -0
  418. {osn_selenium-1.1.0.dist-info → osn_selenium-1.2.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  import trio
2
2
  from typing import List
3
+ from osn_selenium._decorators import log_on_error
3
4
  from osn_selenium.dev_tools.target.detach import DetachMixin
4
- from osn_selenium.exceptions.devtools import CDPEndExceptions
5
5
  from osn_selenium.dev_tools.target.discovery import DiscoveryMixin
6
6
  from osn_selenium.dev_tools.target.events import EventHandlersMixin
7
7
  from osn_selenium.dev_tools.logger.target import build_target_logger
@@ -17,6 +17,10 @@ from osn_selenium.dev_tools._functions import (
17
17
  execute_cdp_command,
18
18
  wait_one
19
19
  )
20
+ from osn_selenium.exceptions.devtools import (
21
+ CDPEndExceptions,
22
+ TrioEndExceptions
23
+ )
20
24
 
21
25
 
22
26
  __all__ = ["LifecycleMixin"]
@@ -32,41 +36,96 @@ class LifecycleMixin(DiscoveryMixin, EventHandlersMixin, DetachMixin, Fingerprin
32
36
  Closes all active resources, channels, and loggers associated with the target.
33
37
  """
34
38
 
35
- if self._new_target_receive_channel is not None:
36
- await self._new_target_receive_channel[0].aclose()
37
- await self._new_target_receive_channel[1].wait()
38
- self._new_target_receive_channel = None
39
-
40
- if self._detached_receive_channel is not None:
41
- await self._detached_receive_channel.aclose()
42
- self._detached_receive_channel = None
43
-
44
- if self._logger_cdp_send_channel is not None:
45
- await self._logger_cdp_send_channel.aclose()
46
- self._logger_cdp_send_channel = None
47
-
48
- if self._logger_fingerprint_send_channel is not None:
49
- await self._logger_fingerprint_send_channel.aclose()
50
- self._logger_fingerprint_send_channel = None
51
-
52
- if self._logger is not None:
53
- await self._logger.close()
54
- self._logger = None
55
-
56
- for event_name, channel in self._events_receive_channels.items():
57
- await channel[0].aclose()
58
- await channel[1].wait()
59
-
60
- self._events_receive_channels = {}
61
-
62
- for scope_name, scope in self._cancel_scopes.items():
63
- scope.cancel()
64
-
65
- self._cancel_scopes = {}
66
-
67
- if self.background_task_ended is not None:
68
- await self.background_task_ended.wait()
69
- self.background_task_ended = None
39
+ @log_on_error
40
+ async def _close_new_target_receive_channel() -> None:
41
+ if self._new_target_receive_channel is not None:
42
+ try:
43
+ await self._new_target_receive_channel[0].aclose()
44
+ await self._new_target_receive_channel[1].wait()
45
+ except TrioEndExceptions:
46
+ pass
47
+
48
+ self._new_target_receive_channel = None
49
+
50
+ @log_on_error
51
+ async def _close_logger_fingerprint_send_channel() -> None:
52
+ if self._logger_fingerprint_send_channel is not None:
53
+ try:
54
+ await self._logger_fingerprint_send_channel.aclose()
55
+ except TrioEndExceptions:
56
+ pass
57
+
58
+ self._logger_fingerprint_send_channel = None
59
+
60
+ @log_on_error
61
+ async def _close_logger_cdp_send_channel() -> None:
62
+ if self._logger_cdp_send_channel is not None:
63
+ try:
64
+ await self._logger_cdp_send_channel.aclose()
65
+ except TrioEndExceptions:
66
+ pass
67
+
68
+ self._logger_cdp_send_channel = None
69
+
70
+ @log_on_error
71
+ async def _close_logger() -> None:
72
+ if self._logger is not None:
73
+ try:
74
+ await self._logger.close()
75
+ except TrioEndExceptions:
76
+ pass
77
+
78
+ self._logger = None
79
+
80
+ @log_on_error
81
+ async def _close_events_receive_channels() -> None:
82
+ for event_name, channel in self._events_receive_channels.items():
83
+ try:
84
+ await channel[0].aclose()
85
+ await channel[1].wait()
86
+ except TrioEndExceptions:
87
+ pass
88
+
89
+ self._events_receive_channels.clear()
90
+
91
+ @log_on_error
92
+ async def _close_detached_receive_channel() -> None:
93
+ if self._detached_receive_channel is not None:
94
+ try:
95
+ await self._detached_receive_channel.aclose()
96
+ except TrioEndExceptions:
97
+ pass
98
+
99
+ self._detached_receive_channel = None
100
+
101
+ @log_on_error
102
+ def _close_cancel_scopes() -> None:
103
+ for scope_name, scope in self._cancel_scopes.items():
104
+ try:
105
+ scope.cancel()
106
+ except TrioEndExceptions:
107
+ pass
108
+
109
+ self._cancel_scopes.clear()
110
+
111
+ @log_on_error
112
+ async def _close_background_task() -> None:
113
+ if self.background_task_ended is not None:
114
+ try:
115
+ await self.background_task_ended.wait()
116
+ except TrioEndExceptions:
117
+ pass
118
+
119
+ self.background_task_ended = None
120
+
121
+ await _close_new_target_receive_channel()
122
+ await _close_detached_receive_channel()
123
+ await _close_logger_cdp_send_channel()
124
+ await _close_logger_fingerprint_send_channel()
125
+ await _close_logger()
126
+ await _close_events_receive_channels()
127
+ _close_cancel_scopes()
128
+ await _close_background_task()
70
129
 
71
130
  async def _setup_target(self):
72
131
  """
@@ -93,9 +152,9 @@ class LifecycleMixin(DiscoveryMixin, EventHandlersMixin, DetachMixin, Fingerprin
93
152
  fingerprint_detecting_ready_event = trio.Event()
94
153
  target_ready_events.append(fingerprint_detecting_ready_event)
95
154
 
96
- self._nursery_object.start_soon(self._run_new_targets_listener, new_targets_listener_ready_event)
97
- self._nursery_object.start_soon(self._setup_fingerprint_injection, fingerprint_detecting_ready_event)
98
- self._nursery_object.start_soon(self._run_detach_checking)
155
+ self._nursery.start_soon(self._run_new_targets_listener, new_targets_listener_ready_event)
156
+ self._nursery.start_soon(self._setup_fingerprint_injection, fingerprint_detecting_ready_event)
157
+ self._nursery.start_soon(self._run_detach_checking)
99
158
 
100
159
  if self._domains_settings:
101
160
  for domain_name, domain_config in self._domains_settings.model_dump(exclude_none=True).items():
@@ -117,7 +176,7 @@ class LifecycleMixin(DiscoveryMixin, EventHandlersMixin, DetachMixin, Fingerprin
117
176
 
118
177
  domain_handlers_ready_event = trio.Event()
119
178
  target_ready_events.append(domain_handlers_ready_event)
120
- self._nursery_object.start_soon(
179
+ self._nursery.start_soon(
121
180
  self._run_events_handlers,
122
181
  domain_handlers_ready_event,
123
182
  getattr(self._domains_settings, domain_name)
@@ -151,7 +210,7 @@ class LifecycleMixin(DiscoveryMixin, EventHandlersMixin, DetachMixin, Fingerprin
151
210
  """
152
211
 
153
212
  try:
154
- self._logger_cdp_send_channel, self._logger_fingerprint_send_channel, self._logger = build_target_logger(self.target_data, self._nursery_object, self._logger_settings)
213
+ self._logger_cdp_send_channel, self._logger_fingerprint_send_channel, self._logger = build_target_logger(self.target_data, self._nursery, self._logger_settings)
155
214
 
156
215
  if self._cdp_target_type_log_accepted:
157
216
  await self._logger.run()
@@ -167,8 +226,9 @@ class LifecycleMixin(DiscoveryMixin, EventHandlersMixin, DetachMixin, Fingerprin
167
226
  await self._setup_target()
168
227
 
169
228
  if self._target_background_task is not None:
170
- self._nursery_object.start_soon(background_task_decorator(self._target_background_task), self)
171
-
229
+ self._nursery.start_soon(background_task_decorator(self._target_background_task), self)
230
+
231
+ self.started_event.set()
172
232
  await wait_one(self.exit_event, self.about_to_stop_event)
173
233
  except* (BrowserError, RuntimeError):
174
234
  self.about_to_stop_event.set()
@@ -10,7 +10,7 @@ from typing import (
10
10
  Optional,
11
11
  TYPE_CHECKING
12
12
  )
13
- from osn_selenium.dev_tools._exception_helpers import (
13
+ from osn_selenium._exception_helpers import (
14
14
  extract_exception_trace,
15
15
  log_exception
16
16
  )
@@ -1 +0,0 @@
1
-
@@ -1,5 +1,8 @@
1
- __all__ = ["OSNSeleniumError"]
1
+ from osn_selenium._exception_helpers import (
2
+ extract_exception_trace
3
+ )
2
4
 
5
+ __all__ = ["ExceptionThrown", "OSNSeleniumError"]
3
6
 
4
7
  class OSNSeleniumError(Exception):
5
8
  """
@@ -7,3 +10,27 @@ class OSNSeleniumError(Exception):
7
10
  """
8
11
 
9
12
  pass
13
+
14
+
15
+ class ExceptionThrown:
16
+ """
17
+ A wrapper class to indicate that an exception was thrown during an operation.
18
+
19
+ This is used in `execute_cdp_command` when `error_mode` is "log" or "pass"
20
+ to return an object indicating an error occurred without re-raising it immediately.
21
+
22
+ Attributes:
23
+ exception (BaseException): The exception that was caught.
24
+ traceback (str): The formatted traceback string of the exception.
25
+ """
26
+
27
+ def __init__(self, exception: BaseException) -> None:
28
+ """
29
+ Initializes the ExceptionThrown wrapper.
30
+
31
+ Args:
32
+ exception (BaseException): The exception to wrap.
33
+ """
34
+
35
+ self.exception = exception
36
+ self.traceback = extract_exception_trace(exception)
@@ -0,0 +1,59 @@
1
+ from osn_selenium.exceptions.base import OSNSeleniumError
2
+
3
+ __all__ = ["BiDiBridgeError", "BiDiBridgeStoppedError", "BiDiExecutionError", "CommandNotMappedToBiDiError"]
4
+
5
+ class BiDiBridgeError(OSNSeleniumError):
6
+ """
7
+ Base class for exceptions related to the BiDi Bridge.
8
+ """
9
+
10
+ pass
11
+
12
+
13
+ class CommandNotMappedToBiDiError(BiDiBridgeError):
14
+ """
15
+ Exception raised when a requested W3C command has no corresponding BiDi mapping.
16
+ """
17
+
18
+ def __init__(self, command: str) -> None:
19
+ """
20
+ Initialize the exception.
21
+
22
+ Args:
23
+ command (str): The name of the unmapped command.
24
+ """
25
+
26
+ super().__init__(f"{command} is not mapped to BiDi.")
27
+
28
+
29
+ class BiDiExecutionError(OSNSeleniumError):
30
+ """
31
+ Exception raised when a BiDi command execution fails on the browser side.
32
+ """
33
+
34
+ def __init__(self, error: str, message: str) -> None:
35
+ """
36
+ Initialize the exception with the error type and message.
37
+
38
+ Args:
39
+ error (str): The error category or code returned by the BiDi protocol.
40
+ message (str): The detailed error message provided by the browser.
41
+ """
42
+
43
+ super().__init__(f"BiDi: {error} - {message}")
44
+
45
+
46
+ class BiDiBridgeStoppedError(BiDiBridgeError):
47
+ """
48
+ Raised when the BiDi bridge has been stopped while tasks were still pending.
49
+ """
50
+
51
+ def __init__(self, reason: str) -> None:
52
+ """
53
+ Initializes the error with the stop reason.
54
+
55
+ Args:
56
+ reason (str): The reason why the bridge stopped.
57
+ """
58
+
59
+ super().__init__(f"BiDi bridge was stopped. Reason: {reason}")
@@ -5,14 +5,7 @@ from osn_selenium._typehints import (
5
5
  TYPES_FOR_FLATTENING_TYPEHINT
6
6
  )
7
7
 
8
-
9
- __all__ = [
10
- "ConfigurationError",
11
- "DuplicationError",
12
- "NotExpectedTypeError",
13
- "NotExpectedValueError"
14
- ]
15
-
8
+ __all__ = ["ConfigurationError", "DuplicationError", "NotExpectedTypeError", "NotExpectedValueError"]
16
9
 
17
10
  class ConfigurationError(OSNSeleniumError):
18
11
  """
@@ -1,9 +1,9 @@
1
1
  from typing import Union
2
+ from osn_selenium.exceptions.base import OSNSeleniumError
2
3
  from osn_selenium._cdp_import import (
3
4
  check_cdp_version_exists_on_github
4
5
  )
5
6
 
6
-
7
7
  __all__ = ["CDPPackageError", "DependencyError"]
8
8
 
9
9
  _CDP_PACKAGE_EXISTS = """
@@ -19,7 +19,7 @@ If you need this specific version, you can generate it using the https://github.
19
19
  """.strip("\n")
20
20
 
21
21
 
22
- class DependencyError(Exception):
22
+ class DependencyError(OSNSeleniumError):
23
23
  """
24
24
  Base exception for dependency-related issues.
25
25
  """
@@ -1,48 +1,12 @@
1
1
  import trio
2
+ import trio_websocket
2
3
  from osn_selenium.exceptions.base import OSNSeleniumError
3
- from osn_selenium.dev_tools._exception_helpers import (
4
- extract_exception_trace
5
- )
6
4
  from selenium.webdriver.common.bidi.cdp import (
7
5
  BrowserError,
8
6
  CdpConnectionClosed
9
7
  )
10
8
 
11
-
12
- __all__ = [
13
- "BidiConnectionNotEstablishedError",
14
- "CDPCommandNotFoundError",
15
- "CDPEndExceptions",
16
- "CantEnterDevToolsContextError",
17
- "DevToolsError",
18
- "ExceptionThrown",
19
- "TrioEndExceptions"
20
- ]
21
-
22
-
23
- class ExceptionThrown:
24
- """
25
- A wrapper class to indicate that an exception was thrown during an operation.
26
-
27
- This is used in `execute_cdp_command` when `error_mode` is "log" or "pass"
28
- to return an object indicating an error occurred without re-raising it immediately.
29
-
30
- Attributes:
31
- exception (BaseException): The exception that was caught.
32
- traceback (str): The formatted traceback string of the exception.
33
- """
34
-
35
- def __init__(self, exception: BaseException) -> None:
36
- """
37
- Initializes the ExceptionThrown wrapper.
38
-
39
- Args:
40
- exception (BaseException): The exception to wrap.
41
- """
42
-
43
- self.exception = exception
44
- self.traceback = extract_exception_trace(exception)
45
-
9
+ __all__ = ["BidiConnectionNotEstablishedError", "CDPCommandNotFoundError", "CDPEndExceptions", "CantEnterDevToolsContextError", "DevToolsError", "TrioEndExceptions", "WebSocketEndExceptions"]
46
10
 
47
11
  class DevToolsError(OSNSeleniumError):
48
12
  """
@@ -76,7 +40,7 @@ class CDPCommandNotFoundError(DevToolsError):
76
40
  Error raised when a requested CDP command attribute is not found in the specified module.
77
41
  """
78
42
 
79
- def __init__(self, object_: str, module_: str):
43
+ def __init__(self, object_: str, module_: str) -> None:
80
44
  """
81
45
  Initializes CDPCommandNotFoundError.
82
46
 
@@ -105,6 +69,12 @@ class BidiConnectionNotEstablishedError(DevToolsError):
105
69
 
106
70
 
107
71
  TrioEndExceptions = (trio.Cancelled, trio.EndOfChannel, trio.ClosedResourceError)
72
+ WebSocketEndExceptions = (
73
+ trio.Cancelled,
74
+ trio.EndOfChannel,
75
+ trio.ClosedResourceError,
76
+ trio_websocket.ConnectionClosed
77
+ )
108
78
  CDPEndExceptions = (
109
79
  trio.Cancelled,
110
80
  trio.EndOfChannel,
@@ -0,0 +1,26 @@
1
+ from osn_selenium.exceptions.base import OSNSeleniumError
2
+
3
+ __all__ = ["ExperimentalFeatureError", "NotImplementedExperimentalFeatureError"]
4
+
5
+ class ExperimentalFeatureError(OSNSeleniumError):
6
+ """
7
+ Base exception for experimental feature errors.
8
+ """
9
+
10
+ pass
11
+
12
+
13
+ class NotImplementedExperimentalFeatureError(ExperimentalFeatureError):
14
+ """
15
+ Raised when an experimental feature is not yet implemented.
16
+ """
17
+
18
+ def __init__(self, name: str):
19
+ """
20
+ Initializes the error with the name of the missing feature.
21
+
22
+ Args:
23
+ name (str): The name of the feature.
24
+ """
25
+
26
+ super().__init__(f"{name} is not implemented in current version.")
@@ -1,9 +1,7 @@
1
1
  from osn_selenium.exceptions.base import OSNSeleniumError
2
2
 
3
-
4
3
  __all__ = ["FlagError", "FlagNotDefinedError", "FlagTypeNotDefinedError"]
5
4
 
6
-
7
5
  class FlagError(OSNSeleniumError):
8
6
  """
9
7
  Base class for errors related to management flags.
@@ -10,15 +10,7 @@ from osn_selenium._typehints import (
10
10
  TYPES_FOR_FLATTENING_TYPEHINT
11
11
  )
12
12
 
13
-
14
- __all__ = [
15
- "CannotConvertTypeError",
16
- "ElementInteractionError",
17
- "ElementNotVisibleError",
18
- "InstanceError",
19
- "NotExpectedTypeError"
20
- ]
21
-
13
+ __all__ = ["CannotConvertTypeError", "ElementInteractionError", "ElementNotVisibleError", "InstanceError", "NotExpectedTypeError"]
22
14
 
23
15
  class InstanceError(OSNSeleniumError):
24
16
  """
@@ -1,10 +1,8 @@
1
1
  from typing import Iterable, Union
2
2
  from osn_selenium.exceptions.base import OSNSeleniumError
3
3
 
4
-
5
4
  __all__ = ["JavaScriptError", "JavaScriptResourceError"]
6
5
 
7
-
8
6
  class JavaScriptError(OSNSeleniumError):
9
7
  """
10
8
  Base class for JavaScript-related errors.
@@ -1,9 +1,7 @@
1
1
  from osn_selenium.exceptions.base import OSNSeleniumError
2
2
 
3
-
4
3
  __all__ = ["AbstractImplementationError", "LogicError"]
5
4
 
6
-
7
5
  class LogicError(OSNSeleniumError):
8
6
  """
9
7
  Base class for internal logic and implementation errors.
@@ -2,15 +2,7 @@ from typing import Any
2
2
  from osn_selenium._typehints import PATH_TYPEHINT
3
3
  from osn_selenium.exceptions.base import OSNSeleniumError
4
4
 
5
-
6
- __all__ = [
7
- "BrowserExecutableNotFoundError",
8
- "ExecutableError",
9
- "PathError",
10
- "PathValidationError",
11
- "WebDriverExecutableNotFoundError"
12
- ]
13
-
5
+ __all__ = ["BrowserExecutableNotFoundError", "ExecutableError", "PathError", "PathValidationError", "WebDriverExecutableNotFoundError"]
14
6
 
15
7
  class PathError(OSNSeleniumError):
16
8
  """
@@ -1,9 +1,7 @@
1
1
  from osn_selenium.exceptions.base import OSNSeleniumError
2
2
 
3
-
4
3
  __all__ = ["PlatformError", "PlatformNotSupportedError"]
5
4
 
6
-
7
5
  class PlatformError(OSNSeleniumError):
8
6
  """
9
7
  Base class for environment and platform-specific errors.
@@ -2,16 +2,13 @@ from osn_selenium.exceptions.base import OSNSeleniumError
2
2
  from typing import (
3
3
  Any,
4
4
  Iterable,
5
- Protocol,
6
5
  Type,
7
6
  Union,
8
7
  get_origin
9
8
  )
10
9
 
11
-
12
10
  __all__ = ["ProtocolComplianceError", "ProtocolError"]
13
11
 
14
-
15
12
  class ProtocolError(OSNSeleniumError):
16
13
  """
17
14
  Base class for errors related to Protocol contract violations.
@@ -1,12 +1,6 @@
1
1
  from osn_selenium.exceptions.base import OSNSeleniumError
2
2
 
3
-
4
- __all__ = [
5
- "WebDriverAlreadyRunningError",
6
- "WebDriverError",
7
- "WebDriverNotStartedError"
8
- ]
9
-
3
+ __all__ = ["WebDriverAlreadyRunningError", "WebDriverError", "WebDriverNotStartedError"]
10
4
 
11
5
  class WebDriverError(OSNSeleniumError):
12
6
  """
@@ -1,13 +1,6 @@
1
1
  from osn_selenium.exceptions.base import OSNSeleniumError
2
2
 
3
-
4
- __all__ = [
5
- "InvalidWindowHandleError",
6
- "InvalidWindowIndexError",
7
- "NoWindowHandlesFoundError",
8
- "WindowManagementError"
9
- ]
10
-
3
+ __all__ = ["InvalidWindowHandleError", "InvalidWindowIndexError", "NoWindowHandlesFoundError", "WindowManagementError"]
11
4
 
12
5
  class WindowManagementError(OSNSeleniumError):
13
6
  """
@@ -23,11 +23,6 @@ class CDPExecutor(AbstractCDPExecutor):
23
23
 
24
24
  def __init__(self, execute_function: Callable[[str, Dict[str, Any]], Any]):
25
25
  self._execute_function = execute_function
26
- self._v140 = None
27
- self._v141 = None
28
- self._v142 = None
29
- self._v143 = None
30
- self._v144 = None
31
26
 
32
27
  def get(self, version: int) -> Any:
33
28
  """
@@ -0,0 +1,101 @@
1
+ import importlib
2
+ from typing import TYPE_CHECKING, Any, Dict, Callable, Union
3
+
4
+ import trio
5
+
6
+ from osn_selenium.abstract.executors.cdp import AbstractCDPExecutor
7
+ from osn_selenium.exceptions.dependencies import CDPPackageError
8
+
9
+
10
+ __all__ = ["CDPExecutor"]
11
+
12
+ if TYPE_CHECKING:
13
+ from osn_selenium_cdp_v140.executors.trio_bidi import CDP140Executor
14
+ from osn_selenium_cdp_v141.executors.trio_bidi import CDP141Executor
15
+ from osn_selenium_cdp_v142.executors.trio_bidi import CDP142Executor
16
+ from osn_selenium_cdp_v143.executors.trio_bidi import CDP143Executor
17
+ from osn_selenium_cdp_v144.executors.trio_bidi import CDP144Executor
18
+
19
+
20
+ class CDPExecutor(AbstractCDPExecutor):
21
+ """
22
+ Global CDP executor router.
23
+ Handles lazy loading and version-specific package validation.
24
+ """
25
+
26
+ def __init__(self, execute_function: Callable[[str, Dict[str, Any]], Any], lock: trio.Lock, limiter: trio.CapacityLimiter, token: trio.lowlevel.TrioToken, buffer_size: Union[int, float]):
27
+ self._execute_function = execute_function
28
+ self._lock = lock
29
+ self._limiter = limiter
30
+ self._trio_token = token
31
+ self._bidi_buffer_size = buffer_size
32
+
33
+ def get(self, version: int) -> Any:
34
+ """
35
+ Dynamically loads and returns the CDP executor for a specific version.
36
+
37
+ Args:
38
+ version (int): The CDP version number.
39
+
40
+ Returns:
41
+ Any: The version-specific executor instance.
42
+
43
+ Raises:
44
+ CDPPackageError: If the version-specific package is not installed.
45
+ """
46
+
47
+ try:
48
+ if getattr(self, f"_v{version}", None) is None:
49
+ module = importlib.import_module(f"osn_selenium_cdp_v{version}.executors.trio_bidi")
50
+ executor_type = getattr(module, f"CDP{version}Executor")
51
+
52
+ setattr(self, f"_v{version}", executor_type(execute_function=self._execute_function, lock=self._lock, limiter=self._limiter, token=self._trio_token, buffer_size=self._bidi_buffer_size))
53
+
54
+ return getattr(self, f"_v{version}", None)
55
+ except ImportError:
56
+ raise CDPPackageError(version=version)
57
+
58
+ @property
59
+ def v140(self) -> "CDP140Executor":
60
+ """
61
+ Get or initialize the executor for CDP version 140.
62
+ Raises CDPPackageError if the version-specific package is not installed.
63
+ """
64
+
65
+ return self.get(version=140)
66
+
67
+ @property
68
+ def v141(self) -> "CDP141Executor":
69
+ """
70
+ Get or initialize the executor for CDP version 141.
71
+ Raises CDPPackageError if the version-specific package is not installed.
72
+ """
73
+
74
+ return self.get(version=141)
75
+
76
+ @property
77
+ def v142(self) -> "CDP142Executor":
78
+ """
79
+ Get or initialize the executor for CDP version 142.
80
+ Raises CDPPackageError if the version-specific package is not installed.
81
+ """
82
+
83
+ return self.get(version=142)
84
+
85
+ @property
86
+ def v143(self) -> "CDP143Executor":
87
+ """
88
+ Get or initialize the executor for CDP version 143.
89
+ Raises CDPPackageError if the version-specific package is not installed.
90
+ """
91
+
92
+ return self.get(version=143)
93
+
94
+ @property
95
+ def v144(self) -> "CDP144Executor":
96
+ """
97
+ Get or initialize the executor for CDP version 144.
98
+ Raises CDPPackageError if the version-specific package is not installed.
99
+ """
100
+
101
+ return self.get(version=144)