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,285 @@
1
+ __all__ = ["CAPTURE", "NAVIGATION", "WEB_ELEMENT", "WINDOW"]
2
+
3
+
4
+ class WINDOW:
5
+ """
6
+ JavaScript snippets for window-related operations.
7
+
8
+ Attributes:
9
+ SET_ORIENTATION (str): Snippet to lock screen orientation.
10
+ GET_ORIENTATION (str): Snippet to retrieve the current screen orientation type.
11
+ """
12
+
13
+ SET_ORIENTATION = "screen.orientation.lock('{orientation}')"
14
+ GET_ORIENTATION = "screen.orientation.type"
15
+
16
+
17
+ class WEB_ELEMENT:
18
+ """
19
+ JavaScript snippets for web element interactions with internal guards for W3C compatibility.
20
+
21
+ Attributes:
22
+ SEND_KEYS_TO (str): Snippet to focus and append text with input validation.
23
+ IS_SELECTED (str): Snippet to check if an element is selectable and selected.
24
+ IS_ENABLED (str): Snippet to check enablement state.
25
+ GET_TEXT (str): Snippet to retrieve inner text.
26
+ GET_TAG (str): Snippet to retrieve tag name.
27
+ GET_SHADOW_ROOT (str): Snippet to retrieve shadow root with existence check.
28
+ GET_RECT (str): Snippet to retrieve dimensions.
29
+ GET_PROPERTY (str): Snippet to retrieve element property.
30
+ GET_CSS (str): Snippet to retrieve CSS value.
31
+ GET_ATTRIBUTE (str): Snippet to retrieve attribute.
32
+ GET_ARIA_ROLE (str): Snippet to retrieve ARIA role.
33
+ GET_ARIA_LABEL (str): Snippet to retrieve accessible label.
34
+ CLICK (str): Snippet to perform click with interactability guards.
35
+ CLEAR (str): Snippet to clear value with state guards.
36
+ """
37
+
38
+ _GUARDS = """
39
+ const guards = {
40
+ stale: (el) => {
41
+ if (!el.isConnected) throw new Error('stale element reference');
42
+ },
43
+ interactable: (el) => {
44
+ const rects = el.getClientRects();
45
+ const style = window.getComputedStyle(el);
46
+
47
+ if (rects.length === 0 || style.visibility === 'hidden' || style.display === 'none') {
48
+ throw new Error('element not interactable');
49
+ }
50
+ },
51
+ state: (el) => {
52
+ if (el.disabled || el.readOnly) throw new Error('invalid element state');
53
+ },
54
+ selectable: (el) => {
55
+ const tag = el.tagName.toLowerCase();
56
+ const type = (el.getAttribute('type') || '').toLowerCase();
57
+ const canSelect = tag === 'option' || type === 'checkbox' || type === 'radio';
58
+
59
+ if (!canSelect) throw new Error('element not selectable');
60
+ },
61
+ intercepted: (el) => {
62
+ const rect = el.getBoundingClientRect();
63
+ const x = rect.left + rect.width / 2;
64
+ const y = rect.top + rect.height / 2;
65
+ const topEl = document.elementFromPoint(x, y);
66
+
67
+ if (topEl && topEl !== el && !el.contains(topEl)) {
68
+ throw new Error('element click intercepted: Element is obscured by ' + topEl.tagName);
69
+ }
70
+ }
71
+ };
72
+ """
73
+
74
+ CLICK = f"""
75
+ function(el){{
76
+ {_GUARDS}
77
+ guards.stale(el);
78
+ guards.interactable(el);
79
+ guards.state(el);
80
+ guards.intercepted(el);
81
+
82
+ el.click();
83
+ }}
84
+ """
85
+
86
+ CLEAR = f"""
87
+ function(el){{
88
+ {_GUARDS}
89
+ guards.stale(el);
90
+ guards.interactable(el);
91
+ guards.state(el);
92
+
93
+ el.value = '';
94
+
95
+ el.dispatchEvent(new InputEvent('input', {{bubbles: true}}));
96
+ el.dispatchEvent(new Event('change', {{bubbles: true}}));
97
+ }}
98
+ """
99
+
100
+ GET_ARIA_ROLE = f"""
101
+ function(el){{
102
+ {_GUARDS}
103
+ guards.stale(el);
104
+
105
+ try {{
106
+ return el.getAttribute && el.getAttribute('role');
107
+ }} catch(e) {{
108
+ return '';
109
+ }}
110
+ }}
111
+ """
112
+
113
+ GET_ARIA_LABEL = f"""
114
+ function(el){{
115
+ {_GUARDS}
116
+ guards.stale(el);
117
+
118
+ try {{
119
+ var v = null;
120
+
121
+ if (el.getAttribute) v = el.getAttribute('aria-label');
122
+ if (!v) v = el.getAttribute && el.getAttribute('alt');
123
+
124
+ if (!v) {{
125
+ var txt = (el.textContent || '').trim();
126
+ if (txt) v = txt;
127
+ }}
128
+
129
+ return v || '';
130
+ }} catch(e) {{
131
+ return '';
132
+ }}
133
+ }}
134
+ """
135
+
136
+ GET_TEXT = f"""
137
+ function(el){{
138
+ {_GUARDS}
139
+ guards.stale(el);
140
+
141
+ return el.innerText || '';
142
+ }}
143
+ """
144
+
145
+ GET_TAG = f"""
146
+ function(el){{
147
+ {_GUARDS}
148
+ guards.stale(el);
149
+
150
+ return (el.tagName || '').toLowerCase();
151
+ }}
152
+ """
153
+
154
+ GET_RECT = f"""
155
+ function(el){{
156
+ {_GUARDS}
157
+ guards.stale(el);
158
+
159
+ var r = el.getBoundingClientRect();
160
+
161
+ return {{
162
+ x: Number(r.x || r.left || 0),
163
+ y: Number(r.y || r.top || 0),
164
+ width: Number(r.width || 0),
165
+ height: Number(r.height || 0)
166
+ }};
167
+ }}
168
+ """
169
+
170
+ GET_SHADOW_ROOT = f"""
171
+ function(el){{
172
+ {_GUARDS}
173
+ guards.stale(el);
174
+
175
+ const sr = el.shadowRoot;
176
+
177
+ if (!sr) throw new Error('no such shadow root');
178
+
179
+ return sr;
180
+ }}
181
+ """
182
+
183
+ IS_SELECTED = f"""
184
+ function(el){{
185
+ {_GUARDS}
186
+ guards.stale(el);
187
+ guards.selectable(el);
188
+
189
+ return Boolean(el.selected || el.checked);
190
+ }}
191
+ """
192
+
193
+ IS_ENABLED = f"""
194
+ function(el){{
195
+ {_GUARDS}
196
+ guards.stale(el);
197
+
198
+ return !el.disabled;
199
+ }}
200
+ """
201
+
202
+ GET_PROPERTY = f"""
203
+ function(el, prop){{
204
+ {_GUARDS}
205
+ guards.stale(el);
206
+
207
+ try {{
208
+ return el[prop];
209
+ }} catch(e) {{
210
+ return null;
211
+ }}
212
+ }}
213
+ """
214
+
215
+ GET_ATTRIBUTE = f"""
216
+ function(el, attr){{
217
+ {_GUARDS}
218
+ guards.stale(el);
219
+
220
+ try {{
221
+ return el.getAttribute(attr);
222
+ }} catch(e) {{
223
+ return null;
224
+ }}
225
+ }}
226
+ """
227
+
228
+ GET_CSS = f"""
229
+ function(el, prop){{
230
+ {_GUARDS}
231
+ guards.stale(el);
232
+
233
+ try {{
234
+ return window.getComputedStyle(el).getPropertyValue(prop);
235
+ }} catch(e) {{
236
+ return null;
237
+ }}
238
+ }}
239
+ """
240
+
241
+ SEND_KEYS_TO = f"""
242
+ function(el, text){{
243
+ {_GUARDS}
244
+ guards.stale(el);
245
+ guards.interactable(el);
246
+ guards.state(el);
247
+
248
+ try {{
249
+ el.focus();
250
+ el.value = (el.value || '') + String(text || '');
251
+
252
+ try {{
253
+ el.dispatchEvent(new InputEvent('input', {{bubbles: true}}));
254
+ }} catch(e) {{
255
+ el.dispatchEvent(new Event('input', {{bubbles: true}}));
256
+ }}
257
+
258
+ try {{
259
+ el.dispatchEvent(new Event('change', {{bubbles: true}}));
260
+ }} catch(e) {{ }}
261
+ }} catch (e) {{ }}
262
+ }}
263
+ """
264
+
265
+
266
+ class NAVIGATION:
267
+ """
268
+ JavaScript snippets for navigation and page information.
269
+
270
+ Attributes:
271
+ GET_TITLE (str): Snippet to retrieve the document title.
272
+ """
273
+
274
+ GET_TITLE = "document.title"
275
+
276
+
277
+ class CAPTURE:
278
+ """
279
+ JavaScript snippets for capturing page state.
280
+
281
+ Attributes:
282
+ GET_PAGE_SOURCE (str): Snippet to retrieve the full outer HTML of the document.
283
+ """
284
+
285
+ GET_PAGE_SOURCE = "document.documentElement.outerHTML"
@@ -0,0 +1,4 @@
1
+ __all__ = ["ELEMENT_KEY", "SHADOW_ROOT_KEY"]
2
+
3
+ ELEMENT_KEY = "element-6066-11e4-a52e-4f735466cecf"
4
+ SHADOW_ROOT_KEY = "shadow-6066-11e4-a52e-4f735466cecf"
@@ -0,0 +1,87 @@
1
+ from typing import Any, Dict
2
+ from osn_selenium.exceptions.bidi_bridge import (
3
+ CommandNotMappedToBiDiError
4
+ )
5
+ from osn_selenium.trio_bidi.mapping.request_functions._cdp import (
6
+ MAPPED_REQUEST_CDP_COMMANDS
7
+ )
8
+ from osn_selenium.trio_bidi.mapping.request_functions._file import (
9
+ MAPPED_REQUEST_FILE_COMMANDS
10
+ )
11
+ from osn_selenium.trio_bidi.mapping.request_functions._alert import (
12
+ MAPPED_REQUEST_ALERT_COMMANDS
13
+ )
14
+ from osn_selenium.trio_bidi.mapping.request_functions._script import (
15
+ MAPPED_REQUEST_SCRIPT_COMMANDS
16
+ )
17
+ from osn_selenium.trio_bidi.mapping.request_functions._window import (
18
+ MAPPED_REQUEST_WINDOW_COMMANDS
19
+ )
20
+ from osn_selenium.trio_bidi.mapping.request_functions._capture import (
21
+ MAPPED_REQUEST_CAPTURE_COMMANDS
22
+ )
23
+ from osn_selenium.trio_bidi.mapping.request_functions._element import (
24
+ MAPPED_REQUEST_ELEMENT_COMMANDS
25
+ )
26
+ from osn_selenium.trio_bidi.mapping.request_functions._switch_to import (
27
+ MAPPED_REQUEST_SWITCH_TO_COMMANDS
28
+ )
29
+ from osn_selenium.trio_bidi.mapping.request_functions._navigation import (
30
+ MAPPED_REQUEST_NAVIGATION_COMMANDS
31
+ )
32
+ from osn_selenium.trio_bidi.mapping.request_functions._web_element import (
33
+ MAPPED_REQUEST_WEB_ELEMENT_COMMANDS
34
+ )
35
+ from osn_selenium.trio_bidi.mapping.request_functions._shadow_root import (
36
+ MAPPED_REQUEST_SHADOW_ROOT_COMMANDS
37
+ )
38
+ from osn_selenium.trio_bidi._typehints import (
39
+ CURRENT_BROWSING_CONTEXT_TYPEHINT,
40
+ MAP_REQUEST_FUNCTION_TYPEHINT,
41
+ REQUEST_PARAMS_TYPEHINT
42
+ )
43
+
44
+
45
+ __all__ = ["map_request"]
46
+
47
+ _MAPPED_REQUEST_COMMANDS: Dict[str, MAP_REQUEST_FUNCTION_TYPEHINT] = {
48
+ **MAPPED_REQUEST_ALERT_COMMANDS,
49
+ **MAPPED_REQUEST_CAPTURE_COMMANDS,
50
+ **MAPPED_REQUEST_CDP_COMMANDS,
51
+ **MAPPED_REQUEST_ELEMENT_COMMANDS,
52
+ **MAPPED_REQUEST_FILE_COMMANDS,
53
+ **MAPPED_REQUEST_NAVIGATION_COMMANDS,
54
+ **MAPPED_REQUEST_SCRIPT_COMMANDS,
55
+ **MAPPED_REQUEST_SHADOW_ROOT_COMMANDS,
56
+ **MAPPED_REQUEST_SWITCH_TO_COMMANDS,
57
+ **MAPPED_REQUEST_WEB_ELEMENT_COMMANDS,
58
+ **MAPPED_REQUEST_WINDOW_COMMANDS,
59
+ }
60
+
61
+
62
+ def map_request(
63
+ command: str,
64
+ params: REQUEST_PARAMS_TYPEHINT,
65
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT
66
+ ) -> Dict[str, Any]:
67
+ """
68
+ Maps a W3C WebDriver command to its corresponding BiDi protocol request.
69
+
70
+ Args:
71
+ command (str): The W3C command name.
72
+ params (REQUEST_PARAMS_TYPEHINT): The parameters associated with the command.
73
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID for the command.
74
+
75
+ Returns:
76
+ Dict[str, Any]: The mapped BiDi request dictionary.
77
+
78
+ Raises:
79
+ CommandNotMappedToBiDiError: If the command does not have a defined mapping.
80
+ """
81
+
82
+ function = _MAPPED_REQUEST_COMMANDS.get(command, None)
83
+
84
+ if function is not None:
85
+ return function(params, context_id)
86
+
87
+ raise CommandNotMappedToBiDiError(command=command)
@@ -0,0 +1,102 @@
1
+ from typing import Any, Dict
2
+ from selenium.webdriver.remote.command import Command
3
+ from osn_selenium.trio_bidi._internal_mappings import (
4
+ GET_INTERNAL_ALERT_TEXT
5
+ )
6
+ from osn_selenium.trio_bidi._typehints import (
7
+ CURRENT_BROWSING_CONTEXT_TYPEHINT,
8
+ MAP_REQUEST_FUNCTION_TYPEHINT,
9
+ REQUEST_PARAMS_TYPEHINT
10
+ )
11
+
12
+
13
+ __all__ = ["MAPPED_REQUEST_ALERT_COMMANDS"]
14
+
15
+
16
+ def _map_set_alert_value_request(
17
+ params: REQUEST_PARAMS_TYPEHINT,
18
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT
19
+ ) -> Dict[str, Any]:
20
+ """
21
+ Maps the 'set alert value' command to BiDi 'handleUserPrompt'.
22
+
23
+ Args:
24
+ params (REQUEST_PARAMS_TYPEHINT): Request parameters containing 'text'.
25
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
26
+
27
+ Returns:
28
+ Dict[str, Any]: The BiDi request.
29
+ """
30
+
31
+ return {
32
+ "method": "browsingContext.handleUserPrompt",
33
+ "params": {"context": context_id, "accept": True, "userText": params.get("text")}
34
+ }
35
+
36
+
37
+ def _map_get_alert_text_request(
38
+ params: REQUEST_PARAMS_TYPEHINT,
39
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT
40
+ ) -> Dict[str, Any]:
41
+ """
42
+ Maps the 'get alert text' command to an internal bridge command.
43
+
44
+ Args:
45
+ params (REQUEST_PARAMS_TYPEHINT): Request parameters.
46
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
47
+
48
+ Returns:
49
+ Dict[str, Any]: The internal BiDi request.
50
+ """
51
+
52
+ return {"method": GET_INTERNAL_ALERT_TEXT, "params": {}}
53
+
54
+
55
+ def _map_dismiss_alert_request(
56
+ params: REQUEST_PARAMS_TYPEHINT,
57
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT
58
+ ) -> Dict[str, Any]:
59
+ """
60
+ Maps the 'dismiss alert' command to BiDi 'handleUserPrompt' with accept=False.
61
+
62
+ Args:
63
+ params (REQUEST_PARAMS_TYPEHINT): Request parameters.
64
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
65
+
66
+ Returns:
67
+ Dict[str, Any]: The BiDi request.
68
+ """
69
+
70
+ return {
71
+ "method": "browsingContext.handleUserPrompt",
72
+ "params": {"context": context_id, "accept": False}
73
+ }
74
+
75
+
76
+ def _map_accept_alert_request(
77
+ params: REQUEST_PARAMS_TYPEHINT,
78
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT
79
+ ) -> Dict[str, Any]:
80
+ """
81
+ Maps the 'accept alert' command to BiDi 'handleUserPrompt' with accept=True.
82
+
83
+ Args:
84
+ params (REQUEST_PARAMS_TYPEHINT): Request parameters.
85
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
86
+
87
+ Returns:
88
+ Dict[str, Any]: The BiDi request.
89
+ """
90
+
91
+ return {
92
+ "method": "browsingContext.handleUserPrompt",
93
+ "params": {"context": context_id, "accept": True}
94
+ }
95
+
96
+
97
+ MAPPED_REQUEST_ALERT_COMMANDS: Dict[str, MAP_REQUEST_FUNCTION_TYPEHINT] = {
98
+ Command.W3C_GET_ALERT_TEXT: _map_get_alert_text_request,
99
+ Command.W3C_ACCEPT_ALERT: _map_accept_alert_request,
100
+ Command.W3C_DISMISS_ALERT: _map_dismiss_alert_request,
101
+ Command.W3C_SET_ALERT_VALUE: _map_set_alert_value_request,
102
+ }
@@ -0,0 +1,225 @@
1
+ from typing import (
2
+ Any,
3
+ Dict,
4
+ List,
5
+ Optional
6
+ )
7
+ from osn_selenium.instances.protocols import AnyInstanceWrapper
8
+ from osn_selenium.trio_bidi.mapping._constants import BY_MAPPING_DICT
9
+ from osn_selenium.trio_bidi.mapping._utils import (
10
+ ELEMENT_KEY,
11
+ SHADOW_ROOT_KEY
12
+ )
13
+ from selenium.webdriver.remote.webelement import (
14
+ WebElement as SeleniumWebElement
15
+ )
16
+ from osn_selenium.trio_bidi._typehints import (
17
+ CURRENT_BROWSING_CONTEXT_TYPEHINT,
18
+ REQUEST_PARAMS_TYPEHINT
19
+ )
20
+
21
+
22
+ __all__ = [
23
+ "build_bidi_element",
24
+ "build_locate_nodes_request",
25
+ "build_script_call_request",
26
+ "build_script_evaluate_request",
27
+ "convert_w3c_to_bidi_js",
28
+ "get_shadow_root_argument",
29
+ "get_web_element_argument"
30
+ ]
31
+
32
+
33
+ def build_bidi_element(id_: str) -> Dict[str, Any]:
34
+ """
35
+ Creates a BiDi element reference.
36
+
37
+ Args:
38
+ id_ (str): The shared ID of the element.
39
+
40
+ Returns:
41
+ Dict[str, Any]: The BiDi sharedId reference.
42
+ """
43
+
44
+ return {"sharedId": id_}
45
+
46
+
47
+ def get_web_element_argument(params: REQUEST_PARAMS_TYPEHINT) -> Dict[str, Any]:
48
+ """
49
+ Extracts the element ID from W3C parameters and creates a BiDi reference.
50
+
51
+ Args:
52
+ params (REQUEST_PARAMS_TYPEHINT): W3C parameters containing 'id'.
53
+
54
+ Returns:
55
+ Dict[str, Any]: The BiDi element reference.
56
+ """
57
+
58
+ return build_bidi_element(id_=params["id"])
59
+
60
+
61
+ def get_shadow_root_argument(params: REQUEST_PARAMS_TYPEHINT) -> Dict[str, Any]:
62
+ """
63
+ Extracts the shadow ID from W3C parameters and creates a BiDi reference.
64
+
65
+ Args:
66
+ params (REQUEST_PARAMS_TYPEHINT): W3C parameters containing 'shadowId'.
67
+
68
+ Returns:
69
+ Dict[str, Any]: The BiDi element reference.
70
+ """
71
+
72
+ return build_bidi_element(id_=params["shadowId"])
73
+
74
+
75
+ def convert_w3c_to_bidi_js(w3c_value: Any) -> Dict[str, Any]:
76
+ """
77
+ Converts a W3C-style JavaScript argument into a BiDi LocalValue.
78
+
79
+ Args:
80
+ w3c_value (Any): The value to convert.
81
+
82
+ Returns:
83
+ Dict[str, Any]: The BiDi LocalValue representation.
84
+
85
+ EXAMPLES
86
+ ________
87
+ >>> convert_w3c_to_bidi_js("hello")
88
+ ... {'type': 'string', 'value': 'hello'}
89
+ >>> convert_w3c_to_bidi_js(True)
90
+ ... {'type': 'boolean', 'value': True}
91
+ """
92
+
93
+ if isinstance(w3c_value, AnyInstanceWrapper):
94
+ w3c_value = w3c_value.legacy
95
+
96
+ if isinstance(w3c_value, SeleniumWebElement):
97
+ return {"sharedId": w3c_value.id}
98
+
99
+ if isinstance(w3c_value, dict):
100
+ if ELEMENT_KEY in w3c_value:
101
+ return {"sharedId": w3c_value[ELEMENT_KEY]}
102
+
103
+ if SHADOW_ROOT_KEY in w3c_value:
104
+ return {"sharedId": w3c_value[SHADOW_ROOT_KEY]}
105
+
106
+ if w3c_value is None:
107
+ return {"type": "null"}
108
+
109
+ if isinstance(w3c_value, bool):
110
+ return {"type": "boolean", "value": w3c_value}
111
+
112
+ if isinstance(w3c_value, (int, float)):
113
+ return {"type": "number", "value": w3c_value}
114
+
115
+ if isinstance(w3c_value, str):
116
+ return {"type": "string", "value": w3c_value}
117
+
118
+ if isinstance(w3c_value, (list, tuple, set)):
119
+ return {
120
+ "type": "array",
121
+ "value": [convert_w3c_to_bidi_js(w3c_value=item) for item in w3c_value]
122
+ }
123
+
124
+ if isinstance(w3c_value, dict):
125
+ return {
126
+ "type": "object",
127
+ "value": [
128
+ [
129
+ convert_w3c_to_bidi_js(w3c_value=key),
130
+ convert_w3c_to_bidi_js(w3c_value=value)
131
+ ]
132
+ for key, value in w3c_value.items()
133
+ ]
134
+ }
135
+
136
+ return {"type": "undefined"}
137
+
138
+
139
+ def build_script_evaluate_request(context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT, expression: str) -> Dict[str, Any]:
140
+ """
141
+ Builds a BiDi 'script.evaluate' request.
142
+
143
+ Args:
144
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
145
+ expression (str): The JS expression to evaluate.
146
+
147
+ Returns:
148
+ Dict[str, Any]: The BiDi request.
149
+ """
150
+
151
+ return {
152
+ "method": "script.evaluate",
153
+ "params": {
154
+ "expression": expression,
155
+ "target": {"context": context_id},
156
+ "awaitPromise": True,
157
+ "resultOwnership": "none",
158
+ }
159
+ }
160
+
161
+
162
+ def build_script_call_request(
163
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT,
164
+ function: str,
165
+ args: Optional[List[Any]],
166
+ ownership: str
167
+ ) -> Dict[str, Any]:
168
+ """
169
+ Builds a BiDi 'script.callFunction' request.
170
+
171
+ Args:
172
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
173
+ function (str): The function declaration.
174
+ args (Optional[List[Any]]): List of BiDi LocalValue arguments.
175
+ ownership (str): Result ownership type ('none', 'root').
176
+
177
+ Returns:
178
+ Dict[str, Any]: The BiDi request.
179
+ """
180
+
181
+ return {
182
+ "method": "script.callFunction",
183
+ "params": {
184
+ "functionDeclaration": function,
185
+ "arguments": args or [],
186
+ "target": {"context": context_id},
187
+ "awaitPromise": True,
188
+ "resultOwnership": ownership,
189
+ }
190
+ }
191
+
192
+
193
+ def build_locate_nodes_request(
194
+ context_id: CURRENT_BROWSING_CONTEXT_TYPEHINT,
195
+ params: REQUEST_PARAMS_TYPEHINT,
196
+ max_nodes: Optional[int] = None,
197
+ start_nodes: Optional[List[Dict[str, Any]]] = None,
198
+ ) -> Dict[str, Any]:
199
+ """
200
+ Builds a BiDi 'browsingContext.locateNodes' request.
201
+
202
+ Args:
203
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
204
+ params (REQUEST_PARAMS_TYPEHINT): W3C search parameters ('using', 'value').
205
+ max_nodes (Optional[int]): Maximum number of nodes to return.
206
+ start_nodes (Optional[List[Dict[str, Any]]]): BiDi element references to start search from.
207
+
208
+ Returns:
209
+ Dict[str, Any]: The BiDi request.
210
+ """
211
+
212
+ strategy = BY_MAPPING_DICT.get(params["using"], params["using"])
213
+
214
+ bidi_params: Dict[str, Any] = {
215
+ "context": context_id,
216
+ "locator": {"type": strategy, "value": params["value"]}
217
+ }
218
+
219
+ if max_nodes:
220
+ bidi_params["maxNodeCount"] = max_nodes
221
+
222
+ if start_nodes:
223
+ bidi_params["startNodes"] = start_nodes
224
+
225
+ return {"method": "browsingContext.locateNodes", "params": bidi_params}