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
@@ -0,0 +1,101 @@
1
+ import trio
2
+ from osn_selenium.javascript.models import JS_Scripts
3
+ from osn_selenium.trio_bidi.mixin import TrioBiDiMixin
4
+ from typing import (
5
+ Any,
6
+ Callable,
7
+ Dict,
8
+ Optional,
9
+ Union
10
+ )
11
+ from osn_selenium.javascript.fingerprint import FingerprintSettings
12
+ from osn_selenium.instances.trio_threads.web_element import WebElement
13
+ from osn_selenium.executors.unified.javascript import UnifiedJSExecutor
14
+ from osn_selenium.models import (
15
+ Point,
16
+ Position,
17
+ Rectangle,
18
+ Size
19
+ )
20
+ from osn_selenium.abstract.executors.javascript import AbstractJSExecutor
21
+
22
+
23
+ __all__ = ["JSExecutor"]
24
+
25
+
26
+ class JSExecutor(UnifiedJSExecutor, TrioBiDiMixin, AbstractJSExecutor):
27
+ """
28
+ An asynchronous JavaScript executor that integrates Trio's BiDi mixin.
29
+ """
30
+
31
+ def __init__(
32
+ self,
33
+ execute_function: Callable[[str, Any], Any],
34
+ lock: trio.Lock,
35
+ limiter: trio.CapacityLimiter,
36
+ trio_token: Optional[trio.lowlevel.TrioToken],
37
+ bidi_buffer_size: Union[int, float],
38
+ ):
39
+ """
40
+ Initialize the JSExecutor with Trio synchronization primitives and execution logic.
41
+
42
+ Args:
43
+ execute_function (Callable[[str, Any], Any]): The function used to run JavaScript code.
44
+ lock (trio.Lock): Trio lock for synchronizing access.
45
+ limiter (trio.CapacityLimiter): Trio limiter for controlling concurrency.
46
+ trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
47
+ bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
48
+ """
49
+
50
+ UnifiedJSExecutor.__init__(self, execute_function=execute_function)
51
+
52
+ TrioBiDiMixin.__init__(
53
+ self,
54
+ lock=lock,
55
+ limiter=limiter,
56
+ token=trio_token,
57
+ buffer_size=bidi_buffer_size
58
+ )
59
+
60
+ async def check_element_in_viewport(self, element: WebElement) -> bool:
61
+ return await self.sync_to_trio(sync_function=self._check_element_in_viewport_impl)(element=element)
62
+
63
+ async def execute(self, script: str, *args: Any) -> Any:
64
+ return await self.sync_to_trio(sync_function=self._execute_impl)(script, *args)
65
+
66
+ async def get_document_scroll_size(self) -> Size:
67
+ return await self.sync_to_trio(sync_function=self._get_document_scroll_size_impl)()
68
+
69
+ async def get_element_css_style(self, element: WebElement) -> Dict[str, str]:
70
+ return await self.sync_to_trio(sync_function=self._get_element_css_style_impl)(element=element)
71
+
72
+ async def get_element_rect_in_viewport(self, element: WebElement) -> Optional[Rectangle]:
73
+ return await self.sync_to_trio(sync_function=self._get_element_rect_in_viewport_impl)(element=element)
74
+
75
+ async def get_random_element_point(self, element: WebElement) -> Optional[Point]:
76
+ return await self.sync_to_trio(sync_function=self._get_random_element_point_impl)(element=element)
77
+
78
+ async def get_random_element_point_in_viewport(self, element: WebElement, step: int = 1) -> Optional[Position]:
79
+ return await self.sync_to_trio(sync_function=self._get_random_element_point_in_viewport_impl)(element=element, step=step)
80
+
81
+ async def get_viewport_position(self) -> Position:
82
+ return await self.sync_to_trio(sync_function=self._get_viewport_position_impl)()
83
+
84
+ async def get_viewport_rect(self) -> Rectangle:
85
+ return await self.sync_to_trio(sync_function=self._get_viewport_rect_impl)()
86
+
87
+ async def get_viewport_size(self) -> Size:
88
+ return await self.sync_to_trio(sync_function=self._get_viewport_size_impl)()
89
+
90
+ async def open_new_tab(self, link: str = "") -> None:
91
+ await self.sync_to_trio(sync_function=self._open_new_tab_impl)(link=link)
92
+
93
+ @property
94
+ def scripts(self) -> JS_Scripts:
95
+ return self._scripts_impl
96
+
97
+ async def start_fingerprint_detection(self, fingerprint_settings: FingerprintSettings) -> None:
98
+ await self.sync_to_trio(sync_function=self._start_fingerprint_detection_impl)(fingerprint_settings=fingerprint_settings)
99
+
100
+ async def stop_window_loading(self) -> None:
101
+ await self.sync_to_trio(sync_function=self._stop_window_loading_impl)()
@@ -27,11 +27,6 @@ class CDPExecutor(AbstractCDPExecutor):
27
27
  self._execute_function = execute_function
28
28
  self._lock = lock
29
29
  self._limiter = limiter
30
- self._v140 = None
31
- self._v141 = None
32
- self._v142 = None
33
- self._v143 = None
34
- self._v144 = None
35
30
 
36
31
  def get(self, version: int) -> Any:
37
32
  """
@@ -151,7 +151,7 @@ class BrowserFlagsManager:
151
151
  def clear_attributes(self):
152
152
  """Clears all configured browser attributes."""
153
153
 
154
- self._attributes = {}
154
+ self._attributes.clear()
155
155
 
156
156
  def remove_attribute(self, attribute_name: str):
157
157
  """
@@ -236,7 +236,7 @@ class BrowserFlagsManager:
236
236
  def clear_experimental_options(self):
237
237
  """Clears all configured experimental options."""
238
238
 
239
- self._experimental_options = {}
239
+ self._experimental_options.clear()
240
240
 
241
241
  def remove_experimental_option(self, experimental_option_name: str):
242
242
  """
@@ -338,7 +338,7 @@ class BrowserFlagsManager:
338
338
  def clear_arguments(self):
339
339
  """Clears all configured browser arguments."""
340
340
 
341
- self._arguments = {}
341
+ self._arguments.clear()
342
342
 
343
343
  def remove_argument(self, argument_name: str):
344
344
  """
@@ -463,7 +463,9 @@ class BrowserFlagsManager:
463
463
 
464
464
  for type_name, type_functions in self._flags_types.items():
465
465
  options = type_functions.build_options_function(options)
466
-
466
+
467
+ options.set_capability("webSocketUrl", True)
468
+
467
469
  return options
468
470
 
469
471
  def remove_option(self, option: FlagDefinition):
@@ -770,8 +770,8 @@ class BlinkFlagsManager(BrowserFlagsManager):
770
770
  def clear_blink_features(self):
771
771
  """Clears all configured Blink features."""
772
772
 
773
- self._enable_blink_features = {}
774
- self._disable_blink_features = {}
773
+ self._enable_blink_features.clear()
774
+ self._disable_blink_features.clear()
775
775
 
776
776
  def remove_blink_feature(self, blink_feature_name: str):
777
777
  """
@@ -42,21 +42,21 @@ class ChromeFlagsManager(BlinkFlagsManager):
42
42
  debugging port, user agent, proxy, and BiDi protocol.
43
43
  """
44
44
 
45
- yandex_flags_types = {}
45
+ chrome_flags_types = {}
46
46
 
47
47
  if flags_types is not None:
48
- yandex_flags_types.update(flags_types)
48
+ chrome_flags_types.update(flags_types)
49
49
 
50
- yandex_flags_definitions = {}
50
+ chrome_flags_definitions = {}
51
51
 
52
52
  if flags_definitions is not None:
53
- yandex_flags_definitions.update(flags_definitions)
53
+ chrome_flags_definitions.update(flags_definitions)
54
54
 
55
55
  super().__init__(
56
56
  browser_exe=browser_exe,
57
57
  start_page_url=start_page_url,
58
- flags_types=yandex_flags_types,
59
- flags_definitions=yandex_flags_definitions,
58
+ flags_types=chrome_flags_types,
59
+ flags_definitions=chrome_flags_definitions,
60
60
  )
61
61
 
62
62
  def _build_options_arguments(self, options: Options) -> Options:
@@ -42,21 +42,21 @@ class EdgeFlagsManager(BlinkFlagsManager):
42
42
  debugging port, user agent, proxy, and BiDi protocol.
43
43
  """
44
44
 
45
- yandex_flags_types = {}
45
+ edge_flags_types = {}
46
46
 
47
47
  if flags_types is not None:
48
- yandex_flags_types.update(flags_types)
48
+ edge_flags_types.update(flags_types)
49
49
 
50
- yandex_flags_definitions = {}
50
+ edge_flags_definitions = {}
51
51
 
52
52
  if flags_definitions is not None:
53
- yandex_flags_definitions.update(flags_definitions)
53
+ edge_flags_definitions.update(flags_definitions)
54
54
 
55
55
  super().__init__(
56
56
  browser_exe=browser_exe,
57
57
  start_page_url=start_page_url,
58
- flags_types=yandex_flags_types,
59
- flags_definitions=yandex_flags_definitions,
58
+ flags_types=edge_flags_types,
59
+ flags_definitions=edge_flags_definitions,
60
60
  )
61
61
 
62
62
  def _build_options_arguments(self, options: Options) -> Options:
@@ -52,13 +52,14 @@ from selenium.webdriver.common.bidi.permissions import (
52
52
  from selenium.webdriver.common.bidi.webextension import (
53
53
  WebExtension as legacyWebExtension
54
54
  )
55
+ from selenium.webdriver.common.bidi.browsing_context import (
56
+ BrowsingContext as legacyBrowsingContext
57
+ )
55
58
  from osn_selenium.instances.protocols import (
56
59
  SyncInstanceWrapper,
60
+ TrioBiDiInstanceWrapper,
57
61
  TrioThreadInstanceWrapper
58
62
  )
59
- from selenium.webdriver.common.bidi.browsing_context import (
60
- BrowsingContext as legacyBrowsingContext
61
- )
62
63
  from osn_selenium.instances._typehints import (
63
64
  ACTION_CHAINS_TYPEHINT,
64
65
  ALERT_TYPEHINT,
@@ -85,11 +86,13 @@ __all__ = [
85
86
  "get_legacy_frame_reference",
86
87
  "get_legacy_instance",
87
88
  "get_sync_instance_wrapper",
89
+ "get_trio_bidi_instance_wrapper",
88
90
  "get_trio_thread_instance_wrapper"
89
91
  ]
90
92
 
91
93
  _SYNC_WRAPPER_TYPE = TypeVar("_SYNC_WRAPPER_TYPE", bound=SyncInstanceWrapper)
92
94
  _TRIO_THREAD_WRAPPER_TYPE = TypeVar("_TRIO_THREAD_WRAPPER_TYPE", bound=TrioThreadInstanceWrapper)
95
+ _TRIO_BIDI_WRAPPER_TYPE = TypeVar("_TRIO_BIDI_WRAPPER_TYPE", bound=TrioBiDiInstanceWrapper)
93
96
 
94
97
 
95
98
  @overload
@@ -243,6 +246,44 @@ def get_trio_thread_instance_wrapper(
243
246
  return wrapper_class.from_legacy(legacy_object=legacy_object, lock=lock, limiter=limiter)
244
247
 
245
248
 
249
+ def get_trio_bidi_instance_wrapper(
250
+ wrapper_class: Type[_TRIO_BIDI_WRAPPER_TYPE],
251
+ legacy_object: Any,
252
+ lock: trio.Lock,
253
+ limiter: trio.CapacityLimiter,
254
+ trio_token: Optional[trio.lowlevel.TrioToken],
255
+ bidi_buffer_size: Union[int, float],
256
+ ) -> _TRIO_BIDI_WRAPPER_TYPE:
257
+ """
258
+ Creates a Trio-compatible BiDi instance wrapper for a legacy Selenium object.
259
+
260
+ Args:
261
+ wrapper_class (Type[_TRIO_BIDI_WRAPPER_TYPE]): The class used to wrap the legacy object.
262
+ legacy_object (Any): The legacy Selenium object to be wrapped.
263
+ lock (trio.Lock): The lock for Trio synchronization.
264
+ limiter (trio.CapacityLimiter): The capacity limiter for Trio.
265
+ trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
266
+ bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
267
+
268
+ Returns:
269
+ _TRIO_BIDI_WRAPPER_TYPE: An instance of the wrapper class.
270
+
271
+ Raises:
272
+ TypeIsNotWrapper: If the provided wrapper_class does not implement TrioBiDiInstanceWrapper.
273
+ """
274
+
275
+ if not isinstance(wrapper_class, TrioBiDiInstanceWrapper):
276
+ raise ProtocolComplianceError(instance=wrapper_class, expected_protocols=TrioBiDiInstanceWrapper)
277
+
278
+ return wrapper_class.from_legacy(
279
+ legacy_object=legacy_object,
280
+ lock=lock,
281
+ limiter=limiter,
282
+ trio_token=trio_token,
283
+ bidi_buffer_size=bidi_buffer_size
284
+ )
285
+
286
+
246
287
  def get_sync_instance_wrapper(wrapper_class: Type[_SYNC_WRAPPER_TYPE], legacy_object: Any) -> _SYNC_WRAPPER_TYPE:
247
288
  """
248
289
  Creates a synchronous instance wrapper for a legacy Selenium object.
@@ -1,8 +1,10 @@
1
1
  import trio
2
2
  from typing import (
3
+ Optional,
3
4
  Protocol,
4
5
  Self,
5
6
  TypeVar,
7
+ Union,
6
8
  runtime_checkable
7
9
  )
8
10
 
@@ -10,6 +12,7 @@ from typing import (
10
12
  __all__ = [
11
13
  "AnyInstanceWrapper",
12
14
  "SyncInstanceWrapper",
15
+ "TrioBiDiInstanceWrapper",
13
16
  "TrioThreadInstanceWrapper"
14
17
  ]
15
18
 
@@ -27,7 +30,7 @@ class TrioThreadInstanceWrapper(Protocol):
27
30
  cls,
28
31
  legacy_object: _LEGACY_OBJECT,
29
32
  lock: trio.Lock,
30
- limiter: trio.CapacityLimiter
33
+ limiter: trio.CapacityLimiter,
31
34
  ) -> Self:
32
35
  """
33
36
  Creates an instance of the wrapper from a legacy object.
@@ -55,6 +58,49 @@ class TrioThreadInstanceWrapper(Protocol):
55
58
  ...
56
59
 
57
60
 
61
+ @runtime_checkable
62
+ class TrioBiDiInstanceWrapper(Protocol):
63
+ """
64
+ Protocol for instances that wrap legacy objects and operate within Trio threads.
65
+ """
66
+
67
+ @classmethod
68
+ def from_legacy(
69
+ cls,
70
+ legacy_object: _LEGACY_OBJECT,
71
+ lock: trio.Lock,
72
+ limiter: trio.CapacityLimiter,
73
+ trio_token: Optional[trio.lowlevel.TrioToken],
74
+ bidi_buffer_size: Union[int, float],
75
+ ) -> Self:
76
+ """
77
+ Creates an instance of the wrapper from a legacy object.
78
+
79
+ Args:
80
+ legacy_object (_LEGACY_OBJECT): The legacy Selenium object to wrap.
81
+ lock (trio.Lock): Trio lock for synchronization.
82
+ limiter (trio.CapacityLimiter): Trio capacity limiter.
83
+ trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
84
+ bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
85
+
86
+ Returns:
87
+ Self: An instance of the wrapper.
88
+ """
89
+
90
+ ...
91
+
92
+ @property
93
+ def legacy(self) -> _LEGACY_OBJECT:
94
+ """
95
+ Returns the underlying legacy Selenium object.
96
+
97
+ Returns:
98
+ _LEGACY_OBJECT: The legacy Selenium instance.
99
+ """
100
+
101
+ ...
102
+
103
+
58
104
  @runtime_checkable
59
105
  class SyncInstanceWrapper(Protocol):
60
106
  """
@@ -47,8 +47,8 @@ class BrowsingContext(UnifiedBrowsingContext, AbstractBrowsingContext):
47
47
 
48
48
  UnifiedBrowsingContext.__init__(self, selenium_browsing_context=selenium_browsing_context)
49
49
 
50
- def activate(self, context: str) -> Any:
51
- return self._activate_impl(context=context)
50
+ def activate(self, context: str) -> None:
51
+ self._activate_impl(context=context)
52
52
 
53
53
  def add_event_handler(
54
54
  self,
@@ -1,4 +1,9 @@
1
- from typing import Any, Callable, Self
1
+ from typing import (
2
+ Any,
3
+ Callable,
4
+ Dict,
5
+ Self
6
+ )
2
7
  from osn_selenium.instances._typehints import SCRIPT_TYPEHINT
3
8
  from osn_selenium.instances.convert import get_legacy_instance
4
9
  from osn_selenium.instances.unified.script import UnifiedScript
@@ -38,7 +43,7 @@ class Script(UnifiedScript, AbstractScript):
38
43
  def add_javascript_error_handler(self, handler: Callable[[Any], None]) -> int:
39
44
  return self._add_javascript_error_handler_impl(handler=handler)
40
45
 
41
- def execute(self, script: str, *args: Any) -> Any:
46
+ def execute(self, script: str, *args: Any) -> Dict[str, Any]:
42
47
  return self._execute_impl(script, *args)
43
48
 
44
49
  @classmethod
@@ -126,7 +126,7 @@ class WebElement(UnifiedWebElement, AbstractWebElement):
126
126
 
127
127
  return self.from_legacy(legacy_object=web_element)
128
128
 
129
- def rect(self) -> Dict:
129
+ def rect(self) -> Dict[str, int]:
130
130
  return self._rect_impl()
131
131
 
132
132
  def screenshot(self, filename: str) -> bool:
@@ -0,0 +1,180 @@
1
+ import math
2
+ import trio
3
+ from selenium.webdriver.common.by import By
4
+ from osn_selenium.trio_bidi.mixin import TrioBiDiMixin
5
+ from osn_selenium.instances._typehints import SHADOW_ROOT_TYPEHINT
6
+ from osn_selenium.exceptions.instance import (
7
+ CannotConvertTypeError
8
+ )
9
+ from osn_selenium.instances.unified.shadow_root import UnifiedShadowRoot
10
+ from osn_selenium.abstract.instances.shadow_root import AbstractShadowRoot
11
+ from typing import (
12
+ List,
13
+ Optional,
14
+ Self,
15
+ TYPE_CHECKING,
16
+ Type,
17
+ Union
18
+ )
19
+ from selenium.webdriver.remote.shadowroot import (
20
+ ShadowRoot as legacyShadowRoot
21
+ )
22
+ from selenium.webdriver.remote.webelement import (
23
+ WebElement as legacyWebElement
24
+ )
25
+ from osn_selenium.instances.convert import (
26
+ get_legacy_instance,
27
+ get_trio_bidi_instance_wrapper
28
+ )
29
+
30
+
31
+ __all__ = ["ShadowRoot"]
32
+
33
+ if TYPE_CHECKING:
34
+ from osn_selenium.instances.trio_bidi.web_element import WebElement
35
+
36
+ _WEB_ELEMENT_TYPE: Optional[Type["WebElement"]] = None
37
+
38
+
39
+ def _build_web_element(
40
+ legacy_element: legacyWebElement,
41
+ lock: trio.Lock,
42
+ limiter: trio.CapacityLimiter,
43
+ trio_token: Optional[trio.lowlevel.TrioToken] = None,
44
+ bidi_buffer_size: Union[int, float] = math.inf,
45
+ ):
46
+ """
47
+ Builds a wrapped WebElement from a legacy element.
48
+
49
+ Args:
50
+ legacy_element (legacyWebElement): The legacy Selenium WebElement instance.
51
+ lock (trio.Lock): A Trio lock for managing concurrent access.
52
+ limiter (trio.CapacityLimiter): A Trio capacity limiter for rate limiting.
53
+
54
+ Returns:
55
+ WebElement: The wrapped WebElement instance.
56
+ """
57
+
58
+ global _WEB_ELEMENT_TYPE
59
+
60
+ if _WEB_ELEMENT_TYPE is None:
61
+ from osn_selenium.instances.trio_bidi.web_element import WebElement
62
+ _WEB_ELEMENT_TYPE = WebElement
63
+
64
+ return get_trio_bidi_instance_wrapper(
65
+ wrapper_class=_WEB_ELEMENT_TYPE,
66
+ legacy_object=legacy_element,
67
+ lock=lock,
68
+ limiter=limiter,
69
+ trio_token=trio_token,
70
+ bidi_buffer_size=bidi_buffer_size,
71
+ )
72
+
73
+
74
+ class ShadowRoot(UnifiedShadowRoot, TrioBiDiMixin, AbstractShadowRoot):
75
+ """
76
+ Wrapper for the legacy Selenium ShadowRoot instance.
77
+
78
+ Represents the root of a Shadow DOM tree, allowing element search
79
+ within the encapsulated shadow scope.
80
+ """
81
+
82
+ def __init__(
83
+ self,
84
+ selenium_shadow_root: legacyShadowRoot,
85
+ lock: trio.Lock,
86
+ limiter: trio.CapacityLimiter,
87
+ trio_token: Optional[trio.lowlevel.TrioToken] = None,
88
+ bidi_buffer_size: Union[int, float] = math.inf,
89
+ ) -> None:
90
+ """
91
+ Initializes the ShadowRoot wrapper.
92
+
93
+ Args:
94
+ selenium_shadow_root (legacyShadowRoot): The legacy Selenium ShadowRoot instance to wrap.
95
+ lock (trio.Lock): A Trio lock for managing concurrent access.
96
+ limiter (trio.CapacityLimiter): A Trio capacity limiter for rate limiting.
97
+ trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
98
+ bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
99
+ """
100
+
101
+ UnifiedShadowRoot.__init__(self, selenium_shadow_root=selenium_shadow_root)
102
+
103
+ TrioBiDiMixin.__init__(
104
+ self,
105
+ lock=lock,
106
+ limiter=limiter,
107
+ token=trio_token,
108
+ buffer_size=bidi_buffer_size
109
+ )
110
+
111
+ async def find_element(self, by: str = By.ID, value: Optional[str] = None) -> "WebElement":
112
+ legacy_element = await self.sync_to_trio(sync_function=self._find_element_impl)(by=by, value=value)
113
+
114
+ return _build_web_element(
115
+ legacy_element=legacy_element,
116
+ lock=self._lock,
117
+ limiter=self._capacity_limiter,
118
+ trio_token=self._trio_token,
119
+ bidi_buffer_size=self._trio_bidi_buffer_size,
120
+ )
121
+
122
+ async def find_elements(self, by: str = By.ID, value: Optional[str] = None) -> List["WebElement"]:
123
+ legacy_elements = await self.sync_to_trio(sync_function=self._find_elements_impl)(by=by, value=value)
124
+
125
+ return [
126
+ _build_web_element(
127
+ legacy_element=legacy_element,
128
+ lock=self._lock,
129
+ limiter=self._capacity_limiter,
130
+ trio_token=self._trio_token,
131
+ bidi_buffer_size=self._trio_bidi_buffer_size,
132
+ )
133
+ for legacy_element in legacy_elements
134
+ ]
135
+
136
+ @classmethod
137
+ def from_legacy(
138
+ cls,
139
+ legacy_object: SHADOW_ROOT_TYPEHINT,
140
+ lock: trio.Lock,
141
+ limiter: trio.CapacityLimiter,
142
+ trio_token: Optional[trio.lowlevel.TrioToken] = None,
143
+ bidi_buffer_size: Union[int, float] = math.inf,
144
+ ) -> Self:
145
+ """
146
+ Creates an instance from a legacy Selenium ShadowRoot object.
147
+
148
+ This factory method is used to wrap an existing Selenium ShadowRoot
149
+ instance into the new interface.
150
+
151
+ Args:
152
+ legacy_object (SHADOW_ROOT_TYPEHINT): The legacy Selenium ShadowRoot instance or its wrapper.
153
+ lock (trio.Lock): A Trio lock for managing concurrent access.
154
+ limiter (trio.CapacityLimiter): A Trio capacity limiter for rate limiting.
155
+ trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
156
+ bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
157
+
158
+ Returns:
159
+ Self: A new instance of a class implementing ShadowRoot.
160
+ """
161
+
162
+ legacy_shadow_root_obj = get_legacy_instance(instance=legacy_object)
163
+
164
+ if not isinstance(legacy_shadow_root_obj, legacyShadowRoot):
165
+ raise CannotConvertTypeError(from_=legacyShadowRoot, to_=legacy_object)
166
+
167
+ return cls(
168
+ selenium_shadow_root=legacy_shadow_root_obj,
169
+ lock=lock,
170
+ limiter=limiter,
171
+ trio_token=trio_token,
172
+ bidi_buffer_size=bidi_buffer_size,
173
+ )
174
+
175
+ async def id(self) -> str:
176
+ return await self.sync_to_trio(sync_function=self._id_impl)()
177
+
178
+ @property
179
+ def legacy(self) -> legacyShadowRoot:
180
+ return self._legacy_impl