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,123 @@
1
+ from typing import Any, Dict
2
+ from selenium.webdriver.remote.errorhandler import ErrorCode
3
+ from osn_selenium.exceptions.bidi_bridge import BiDiExecutionError
4
+
5
+
6
+ __all__ = [
7
+ "BIDI_TO_W3C_ERROR_MAP",
8
+ "create_w3c_error_response",
9
+ "map_bidi_error_to_w3c"
10
+ ]
11
+
12
+ _UNMAPPABLE_ERROR = (-1, "unmappable error")
13
+
14
+ BIDI_TO_W3C_ERROR_MAP = {
15
+ "invalid argument": ErrorCode.INVALID_ARGUMENT,
16
+ "invalid selector": ErrorCode.INVALID_SELECTOR,
17
+ "invalid session id": ErrorCode.INVALID_SESSION_ID,
18
+ "move target out of bounds": ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS,
19
+ "no such alert": ErrorCode.NO_ALERT_OPEN,
20
+ "no such element": ErrorCode.NO_SUCH_ELEMENT,
21
+ "no such frame": ErrorCode.NO_SUCH_FRAME,
22
+ "no such window": ErrorCode.NO_SUCH_WINDOW,
23
+ "no such cookie": ErrorCode.NO_SUCH_COOKIE,
24
+ "stale element reference": ErrorCode.STALE_ELEMENT_REFERENCE,
25
+ "element not interactable": ErrorCode.ELEMENT_NOT_INTERACTABLE,
26
+ "element click intercepted": ErrorCode.ELEMENT_CLICK_INTERCEPTED,
27
+ "javascript error": ErrorCode.JAVASCRIPT_ERROR,
28
+ "timeout": ErrorCode.TIMEOUT,
29
+ "script timeout": ErrorCode.SCRIPT_TIMEOUT,
30
+ "session not created": ErrorCode.SESSION_NOT_CREATED,
31
+ "unable to capture screen": ErrorCode.UNABLE_TO_CAPTURE_SCREEN,
32
+ "unable to set cookie": ErrorCode.UNABLE_TO_SET_COOKIE,
33
+ "unexpected alert open": ErrorCode.UNEXPECTED_ALERT_OPEN,
34
+ "unknown command": ErrorCode.UNKNOWN_COMMAND,
35
+ "unknown error": ErrorCode.UNKNOWN_ERROR,
36
+ "unsupported operation": ErrorCode.METHOD_NOT_ALLOWED,
37
+ "detached shadow root": ErrorCode.DETACHED_SHADOW_ROOT,
38
+ "no such node": ErrorCode.NO_SUCH_ELEMENT,
39
+ "no such handle": ErrorCode.NO_SUCH_ELEMENT,
40
+ "no such client window": ErrorCode.NO_SUCH_WINDOW,
41
+ "invalid web extension": _UNMAPPABLE_ERROR,
42
+ "unable to set file input": _UNMAPPABLE_ERROR,
43
+ "no such script": _UNMAPPABLE_ERROR,
44
+ "no such history entry": _UNMAPPABLE_ERROR,
45
+ "no such network collector": _UNMAPPABLE_ERROR,
46
+ "no such intercept": _UNMAPPABLE_ERROR,
47
+ "no such network data": _UNMAPPABLE_ERROR,
48
+ "no such request": _UNMAPPABLE_ERROR,
49
+ "no such storage partition": _UNMAPPABLE_ERROR,
50
+ "no such user context": _UNMAPPABLE_ERROR,
51
+ "no such web extension": _UNMAPPABLE_ERROR,
52
+ "unable to close browser": _UNMAPPABLE_ERROR,
53
+ "underspecified storage partition": _UNMAPPABLE_ERROR,
54
+ "unavailable network data": _UNMAPPABLE_ERROR,
55
+ }
56
+
57
+
58
+ def create_w3c_error_response(
59
+ status_code: int,
60
+ error_string: str,
61
+ message: str,
62
+ stacktrace: str = ""
63
+ ) -> Dict[str, Any]:
64
+ """
65
+ Creates a standardized W3C WebDriver error response dictionary.
66
+
67
+ Args:
68
+ status_code (int): The numeric status code for the error.
69
+ error_string (str): The string identifier for the error.
70
+ message (str): The descriptive error message.
71
+ stacktrace (str): The stacktrace associated with the error.
72
+
73
+ Returns:
74
+ Dict[str, Any]: Formatted W3C error response.
75
+ """
76
+
77
+ return {
78
+ "status": status_code,
79
+ "value": {"error": error_string, "message": message, "stacktrace": stacktrace}
80
+ }
81
+
82
+
83
+ def map_bidi_error_to_w3c(bidi_error_data: Dict[str, Any]) -> Dict[str, Any]:
84
+ """
85
+ Maps a BiDi protocol error to the corresponding W3C WebDriver error response.
86
+
87
+ Args:
88
+ bidi_error_data (Dict[str, Any]): Dictionary containing error details from BiDi.
89
+
90
+ Returns:
91
+ Dict[str, Any]: Formatted W3C error response.
92
+
93
+ Raises:
94
+ BiDiExecutionError: If error data is malformed or represents an unmappable BiDi error.
95
+ """
96
+
97
+ bidi_error = bidi_error_data.get("error", "unknown error")
98
+ message = bidi_error_data.get("message", bidi_error)
99
+ stacktrace = bidi_error_data.get("stacktrace", "")
100
+
101
+ error_data = BIDI_TO_W3C_ERROR_MAP.get(bidi_error, ErrorCode.UNKNOWN_ERROR)
102
+
103
+ if len(error_data) == 2:
104
+ status_code, error_string = error_data
105
+ else:
106
+ status_code = 13
107
+ error_string = error_data[0]
108
+
109
+ try:
110
+ status_code = int(status_code)
111
+ error_string = str(error_string)
112
+ except (ValueError, TypeError):
113
+ raise BiDiExecutionError(error=bidi_error, message=f"Malformed error data: {message}")
114
+
115
+ if (status_code, error_string) == _UNMAPPABLE_ERROR:
116
+ raise BiDiExecutionError(error=error_string, message=message)
117
+
118
+ return create_w3c_error_response(
119
+ status_code=status_code,
120
+ error_string=error_string,
121
+ message=message,
122
+ stacktrace=stacktrace,
123
+ )
@@ -0,0 +1,194 @@
1
+ from typing import Any, Dict
2
+ from selenium.webdriver.remote.command import Command
3
+ from selenium.webdriver.remote.errorhandler import ErrorCode
4
+ from osn_selenium.trio_bidi._error_mappings import (
5
+ create_w3c_error_response,
6
+ map_bidi_error_to_w3c
7
+ )
8
+
9
+
10
+ __all__ = ["redirect_error_response"]
11
+
12
+
13
+ class _Redirect_:
14
+ """
15
+ Internal container for logic to redirect certain error types to others based on the command.
16
+ """
17
+
18
+ class InvalidArgument_:
19
+ """
20
+ Logic for InvalidArgument redirection.
21
+ """
22
+
23
+ to_NoAlertPresent_Commands = [
24
+ Command.W3C_GET_ALERT_TEXT,
25
+ Command.W3C_ACCEPT_ALERT,
26
+ Command.W3C_DISMISS_ALERT,
27
+ Command.W3C_SET_ALERT_VALUE
28
+ ]
29
+
30
+ @staticmethod
31
+ def to_NoAlertPresent(error_response: Dict[str, Any]) -> Dict[str, Any]:
32
+ """
33
+ Redirects INVALID_ARGUMENT to NO_ALERT_OPEN if related to alerts/prompts.
34
+
35
+ Args:
36
+ error_response (Dict[str, Any]): The initial W3C error response.
37
+
38
+ Returns:
39
+ Dict[str, Any]: The redirected error response.
40
+ """
41
+
42
+ value = error_response.get("value", {})
43
+
44
+ if value.get("error") == ErrorCode.INVALID_ARGUMENT[1]:
45
+ message = value.get("message", "").lower()
46
+
47
+ if "alert" in message or "prompt" in message or "no such alert" in message:
48
+ status_code, error_string = ErrorCode.NO_ALERT_OPEN
49
+
50
+ return create_w3c_error_response(
51
+ status_code=status_code,
52
+ error_string=error_string,
53
+ message="no such alert"
54
+ )
55
+
56
+ return error_response
57
+
58
+ class NoSuchElement_:
59
+ """
60
+ Logic for NoSuchElement redirection.
61
+ """
62
+
63
+ to_DetachedShadowRoot_Commands = [
64
+ Command.FIND_ELEMENT_FROM_SHADOW_ROOT,
65
+ Command.FIND_ELEMENTS_FROM_SHADOW_ROOT,
66
+ ]
67
+
68
+ to_StaleElementReference_Commands = [
69
+ Command.GET_ELEMENT_TAG_NAME,
70
+ Command.GET_ELEMENT_TEXT,
71
+ Command.CLICK_ELEMENT,
72
+ Command.CLEAR_ELEMENT,
73
+ Command.GET_ELEMENT_PROPERTY,
74
+ Command.GET_ELEMENT_ATTRIBUTE,
75
+ Command.IS_ELEMENT_SELECTED,
76
+ Command.IS_ELEMENT_ENABLED,
77
+ Command.SEND_KEYS_TO_ELEMENT,
78
+ Command.GET_SHADOW_ROOT,
79
+ Command.GET_ELEMENT_RECT,
80
+ Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY,
81
+ Command.GET_ELEMENT_ARIA_ROLE,
82
+ Command.GET_ELEMENT_ARIA_LABEL,
83
+ Command.ELEMENT_SCREENSHOT,
84
+ Command.FIND_CHILD_ELEMENT,
85
+ Command.FIND_CHILD_ELEMENTS,
86
+ ]
87
+
88
+ @staticmethod
89
+ def to_DetachedShadowRoot(error_response: Dict[str, Any]) -> Dict[str, Any]:
90
+ """
91
+ Redirects NO_SUCH_ELEMENT to DETACHED_SHADOW_ROOT.
92
+
93
+ Args:
94
+ error_response (Dict[str, Any]): The initial W3C error response.
95
+
96
+ Returns:
97
+ Dict[str, Any]: The redirected error response.
98
+ """
99
+
100
+ if error_response.get("status") == ErrorCode.NO_SUCH_ELEMENT[0]:
101
+ status_code, error_string = ErrorCode.DETACHED_SHADOW_ROOT
102
+ message = "detached shadow root: shadow root is no longer attached to the document"
103
+
104
+ return create_w3c_error_response(status_code=status_code, error_string=error_string, message=message)
105
+
106
+ return error_response
107
+
108
+ @staticmethod
109
+ def to_StaleElementReference(error_response: Dict[str, Any]) -> Dict[str, Any]:
110
+ """
111
+ Redirects NO_SUCH_ELEMENT to STALE_ELEMENT_REFERENCE.
112
+
113
+ Args:
114
+ error_response (Dict[str, Any]): The initial W3C error response.
115
+
116
+ Returns:
117
+ Dict[str, Any]: The redirected error response.
118
+ """
119
+
120
+ if error_response.get("status") == ErrorCode.NO_SUCH_ELEMENT[0]:
121
+ status_code, error_string = ErrorCode.STALE_ELEMENT_REFERENCE
122
+ message = "stale element reference: element is not attached to the page document"
123
+
124
+ return create_w3c_error_response(status_code=status_code, error_string=error_string, message=message)
125
+
126
+ return error_response
127
+
128
+ class NoSuchFrame_:
129
+ """
130
+ Logic for NoSuchFrame redirection.
131
+ """
132
+
133
+ to_NoSuchWindow_Commands = [
134
+ Command.SWITCH_TO_WINDOW,
135
+ Command.GET_CURRENT_URL,
136
+ Command.GET_TITLE,
137
+ Command.CLOSE,
138
+ Command.SCREENSHOT,
139
+ Command.PRINT_PAGE,
140
+ Command.GET_PAGE_SOURCE,
141
+ Command.SET_SCREEN_ORIENTATION,
142
+ Command.GET_SCREEN_ORIENTATION,
143
+ ]
144
+
145
+ @staticmethod
146
+ def to_NoSuchWindow(error_response: Dict[str, Any]):
147
+ """
148
+ Redirects NO_SUCH_FRAME to NO_SUCH_WINDOW.
149
+
150
+ Args:
151
+ error_response (Dict[str, Any]): The initial W3C error response.
152
+
153
+ Returns:
154
+ Dict[str, Any]: The redirected error response.
155
+ """
156
+
157
+ value = error_response.get("value", {})
158
+
159
+ if value.get("error") == ErrorCode.NO_SUCH_FRAME[1]:
160
+ status_code, error_string = ErrorCode.NO_SUCH_WINDOW
161
+ message = "no such window"
162
+
163
+ return create_w3c_error_response(status_code=status_code, error_string=error_string, message=message)
164
+
165
+ return error_response
166
+
167
+
168
+ def redirect_error_response(command: str, bidi_response: Dict[str, Any]) -> Dict[str, Any]:
169
+ """
170
+ Main entry point for mapping BiDi errors to W3C and applying redirection logic.
171
+
172
+ Args:
173
+ command (str): The original W3C command.
174
+ bidi_response (Dict[str, Any]): The raw error data from BiDi.
175
+
176
+ Returns:
177
+ Dict[str, Any]: The finalized W3C error response.
178
+ """
179
+
180
+ error_response = map_bidi_error_to_w3c(bidi_error_data=bidi_response)
181
+
182
+ if command in _Redirect_.NoSuchFrame_.to_NoSuchWindow_Commands:
183
+ return _Redirect_.NoSuchFrame_.to_NoSuchWindow(error_response=error_response)
184
+
185
+ if command in _Redirect_.InvalidArgument_.to_NoAlertPresent_Commands:
186
+ return _Redirect_.InvalidArgument_.to_NoAlertPresent(error_response=error_response)
187
+
188
+ if command in _Redirect_.NoSuchElement_.to_StaleElementReference_Commands:
189
+ return _Redirect_.NoSuchElement_.to_StaleElementReference(error_response=error_response)
190
+
191
+ if command in _Redirect_.NoSuchElement_.to_DetachedShadowRoot_Commands:
192
+ return _Redirect_.NoSuchElement_.to_DetachedShadowRoot(error_response=error_response)
193
+
194
+ return error_response
@@ -0,0 +1,28 @@
1
+ import os
2
+ import base64
3
+ import zipfile
4
+ import tempfile
5
+ from io import BytesIO
6
+
7
+
8
+ __all__ = ["unzip_file"]
9
+
10
+
11
+ def unzip_file(base64_zip: str) -> str:
12
+ """
13
+ Decodes a base64 encoded zip file and extracts its first content to a temporary directory.
14
+
15
+ Args:
16
+ base64_zip (str): The base64 encoded string of the zip file.
17
+
18
+ Returns:
19
+ str: The path to the extracted file.
20
+ """
21
+
22
+ zip_data = base64.b64decode(base64_zip)
23
+
24
+ with zipfile.ZipFile(BytesIO(zip_data)) as zipped_file:
25
+ temp_dir = tempfile.mkdtemp()
26
+ zipped_file.extractall(temp_dir)
27
+
28
+ return os.path.join(temp_dir, zipped_file.namelist()[0])
@@ -0,0 +1,10 @@
1
+ __all__ = [
2
+ "GET_INTERNAL_ALERT_TEXT",
3
+ "OSN_SWITCH_CONTEXT_KEY",
4
+ "UPLOAD_INTERNAL_FILE"
5
+ ]
6
+
7
+ GET_INTERNAL_ALERT_TEXT = "BRIDGE.GET_INTERNAL_ALERT_TEXT"
8
+ UPLOAD_INTERNAL_FILE = "BRIDGE.UPLOAD_INTERNAL_FILE"
9
+
10
+ OSN_SWITCH_CONTEXT_KEY = "OSN_SWITCH_CONTEXT"
@@ -0,0 +1,199 @@
1
+ import trio
2
+ import threading
3
+ from dataclasses import dataclass, field
4
+ from typing import (
5
+ Any,
6
+ Dict,
7
+ Optional,
8
+ Self
9
+ )
10
+ from osn_selenium.trio_bidi._typehints import (
11
+ REQUEST_PARAMS_TYPEHINT
12
+ )
13
+
14
+
15
+ __all__ = ["BiDiTask", "BiDiTaskContainer", "W3CTask", "W3CTaskContainer"]
16
+
17
+
18
+ @dataclass(slots=True)
19
+ class W3CTask:
20
+ """
21
+ Representation of a W3C WebDriver task.
22
+
23
+ Attributes:
24
+ command (str): The command name.
25
+ request_params (REQUEST_PARAMS_TYPEHINT): The command parameters.
26
+ context_id (CURRENT_BROWSING_CONTEXT_TYPEHINT): The browsing context ID.
27
+ """
28
+
29
+ command: str
30
+ params: REQUEST_PARAMS_TYPEHINT
31
+ context_id: Optional[str]
32
+
33
+ @classmethod
34
+ def from_dict(cls, data: Dict[str, Any]) -> Self:
35
+ """
36
+ Creates a W3CTask instance from a dictionary.
37
+
38
+ Args:
39
+ data (Dict[str, Any]): The dictionary containing task data.
40
+
41
+ Returns:
42
+ Self: A new W3CTask instance.
43
+ """
44
+
45
+ return cls(
46
+ command=data["command"],
47
+ params=data["params"],
48
+ context_id=data["context_id"],
49
+ )
50
+
51
+ def to_dict(self) -> Dict[str, Any]:
52
+ """
53
+ Converts the task to a dictionary.
54
+
55
+ Returns:
56
+ Dict[str, Any]: The task as a dictionary.
57
+ """
58
+
59
+ return {
60
+ "command": self.command,
61
+ "params": self.params,
62
+ "context_id": self.context_id,
63
+ }
64
+
65
+
66
+ @dataclass(slots=True)
67
+ class W3CTaskContainer:
68
+ """
69
+ Container for a W3C task including response and synchronization event.
70
+
71
+ Attributes:
72
+ task (W3CTask): The W3C task.
73
+ response (Dict[str, Any]): The response and error information.
74
+ pending_event (threading.Event): Event to wait for task completion.
75
+ """
76
+
77
+ task: W3CTask
78
+ response: Dict[str, Any] = field(default_factory=lambda: {"response": None, "error": None})
79
+ pending_event: threading.Event = field(default_factory=threading.Event)
80
+
81
+ @classmethod
82
+ def from_dict(cls, data: Dict[str, Any]) -> Self:
83
+ """
84
+ Creates a W3CTaskContainer instance from a dictionary.
85
+
86
+ Args:
87
+ data (Dict[str, Any]): The dictionary containing container data.
88
+
89
+ Returns:
90
+ Self: A new W3CTaskContainer instance.
91
+ """
92
+
93
+ return cls(
94
+ task=W3CTask.from_dict(data["task"]),
95
+ response=data["response"],
96
+ pending_event=data["pending_event"],
97
+ )
98
+
99
+ def to_dict(self) -> Dict[str, Any]:
100
+ """
101
+ Converts the container to a dictionary.
102
+
103
+ Returns:
104
+ Dict[str, Any]: The container as a dictionary.
105
+ """
106
+
107
+ return {
108
+ "task": self.task.to_dict(),
109
+ "response": self.response,
110
+ "pending_event": self.pending_event,
111
+ }
112
+
113
+
114
+ @dataclass(slots=True)
115
+ class BiDiTask:
116
+ """
117
+ Representation of a WebDriver BiDi task.
118
+
119
+ Attributes:
120
+ id (int): The task ID.
121
+ method (str): The BiDi method.
122
+ request_params (REQUEST_PARAMS_TYPEHINT): The BiDi parameters.
123
+ """
124
+
125
+ id: int
126
+ method: str
127
+ params: REQUEST_PARAMS_TYPEHINT
128
+
129
+ @classmethod
130
+ def from_dict(cls, data: Dict[str, Any]) -> Self:
131
+ """
132
+ Creates a BiDiTask instance from a dictionary.
133
+
134
+ Args:
135
+ data (Dict[str, Any]): The dictionary containing task data.
136
+
137
+ Returns:
138
+ Self: A new BiDiTask instance.
139
+ """
140
+
141
+ return cls(id=data["id"], method=data["method"], params=data["params"])
142
+
143
+ def to_dict(self) -> Dict[str, Any]:
144
+ """
145
+ Converts the task to a dictionary.
146
+
147
+ Returns:
148
+ Dict[str, Any]: The task as a dictionary.
149
+ """
150
+
151
+ return {"id": self.id, "method": self.method, "params": self.params}
152
+
153
+
154
+ @dataclass(slots=True)
155
+ class BiDiTaskContainer:
156
+ """
157
+ Container for a BiDi task including response and synchronization event.
158
+
159
+ Attributes:
160
+ task (BiDiTask): The BiDi task.
161
+ response (Dict[str, Any]): The response data.
162
+ pending_event (trio.Event): Trio event to wait for task completion.
163
+ """
164
+
165
+ task: BiDiTask
166
+ response: Dict[str, Any] = field(default_factory=dict)
167
+ pending_event: trio.Event = field(default_factory=trio.Event)
168
+
169
+ @classmethod
170
+ def from_dict(cls, data: Dict[str, Any]) -> Self:
171
+ """
172
+ Creates a BiDiTaskContainer instance from a dictionary.
173
+
174
+ Args:
175
+ data (Dict[str, Any]): The dictionary containing container data.
176
+
177
+ Returns:
178
+ Self: A new BiDiTaskContainer instance.
179
+ """
180
+
181
+ return cls(
182
+ task=BiDiTask.from_dict(data["task"]),
183
+ response=data["response"],
184
+ pending_event=data["pending_event"],
185
+ )
186
+
187
+ def to_dict(self) -> Dict[str, Any]:
188
+ """
189
+ Converts the container to a dictionary.
190
+
191
+ Returns:
192
+ Dict[str, Any]: The container as a dictionary.
193
+ """
194
+
195
+ return {
196
+ "task": self.task.to_dict(),
197
+ "response": self.response,
198
+ "pending_event": self.pending_event,
199
+ }
@@ -0,0 +1,20 @@
1
+ from typing import (
2
+ Any,
3
+ Callable,
4
+ Dict,
5
+ Optional
6
+ )
7
+
8
+
9
+ __all__ = [
10
+ "CURRENT_BROWSING_CONTEXT_TYPEHINT",
11
+ "MAP_REQUEST_FUNCTION_TYPEHINT",
12
+ "MAP_RESPONSE_FUNCTION_TYPEHINT",
13
+ "REQUEST_PARAMS_TYPEHINT"
14
+ ]
15
+
16
+ CURRENT_BROWSING_CONTEXT_TYPEHINT = Optional[str]
17
+ REQUEST_PARAMS_TYPEHINT = Optional[Dict[str, Any]]
18
+
19
+ MAP_REQUEST_FUNCTION_TYPEHINT = Callable[[REQUEST_PARAMS_TYPEHINT, str], Dict[str, Any]]
20
+ MAP_RESPONSE_FUNCTION_TYPEHINT = Callable[[Dict[str, Any], REQUEST_PARAMS_TYPEHINT], Dict[str, Any]]