osn-selenium 1.0.0__py3-none-any.whl → 1.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (475) hide show
  1. osn_selenium/_base_models.py +41 -0
  2. osn_selenium/_cdp_import.py +253 -0
  3. osn_selenium/_decorators.py +57 -0
  4. osn_selenium/_trio_threads_helpers.py +157 -0
  5. osn_selenium/_typehints.py +1 -1
  6. osn_selenium/abstract/executors/cdp.py +63 -0
  7. osn_selenium/abstract/webdriver/blink/base.py +14 -0
  8. osn_selenium/abstract/webdriver/blink/lifecycle.py +8 -8
  9. osn_selenium/abstract/webdriver/core/base.py +0 -14
  10. osn_selenium/abstract/webdriver/core/capture.py +4 -3
  11. osn_selenium/abstract/webdriver/core/lifecycle.py +8 -8
  12. osn_selenium/abstract/webdriver/core/script.py +5 -4
  13. osn_selenium/abstract/webdriver/core/window.py +11 -11
  14. osn_selenium/browsers_handler/models.py +1 -1
  15. osn_selenium/dev_tools/_decorators.py +19 -51
  16. osn_selenium/dev_tools/_functions.py +2 -4
  17. osn_selenium/dev_tools/_typehints.py +5 -2
  18. osn_selenium/dev_tools/_wrappers.py +0 -3
  19. osn_selenium/dev_tools/domains/__init__.py +2 -2
  20. osn_selenium/dev_tools/domains/abstract.py +1 -1
  21. osn_selenium/dev_tools/domains/fetch.py +6 -8
  22. osn_selenium/dev_tools/domains_default/fetch.py +2 -2
  23. osn_selenium/dev_tools/filters.py +1 -1
  24. osn_selenium/dev_tools/logger/main.py +9 -21
  25. osn_selenium/dev_tools/logger/models.py +1 -1
  26. osn_selenium/dev_tools/logger/target.py +49 -29
  27. osn_selenium/dev_tools/manager/base.py +10 -42
  28. osn_selenium/dev_tools/manager/lifecycle.py +84 -75
  29. osn_selenium/dev_tools/manager/logging.py +1 -1
  30. osn_selenium/dev_tools/manager/targets.py +13 -5
  31. osn_selenium/dev_tools/models.py +1 -1
  32. osn_selenium/dev_tools/settings.py +9 -5
  33. osn_selenium/dev_tools/target/base.py +30 -34
  34. osn_selenium/dev_tools/target/discovery.py +1 -1
  35. osn_selenium/dev_tools/target/events.py +2 -2
  36. osn_selenium/dev_tools/target/fingerprint.py +1 -1
  37. osn_selenium/dev_tools/target/lifecycle.py +103 -38
  38. osn_selenium/dev_tools/target/logging.py +11 -3
  39. osn_selenium/exceptions/__init__.py +0 -1
  40. osn_selenium/exceptions/base.py +28 -1
  41. osn_selenium/exceptions/bidi_bridge.py +59 -0
  42. osn_selenium/exceptions/configuration.py +1 -8
  43. osn_selenium/exceptions/dependencies.py +60 -0
  44. osn_selenium/exceptions/devtools.py +9 -39
  45. osn_selenium/exceptions/experimental.py +26 -0
  46. osn_selenium/exceptions/flags.py +0 -2
  47. osn_selenium/exceptions/instance.py +1 -9
  48. osn_selenium/exceptions/javascript.py +0 -2
  49. osn_selenium/exceptions/logic.py +0 -2
  50. osn_selenium/exceptions/path.py +1 -9
  51. osn_selenium/exceptions/platform.py +0 -2
  52. osn_selenium/exceptions/protocol.py +0 -3
  53. osn_selenium/exceptions/webdriver.py +1 -7
  54. osn_selenium/exceptions/window.py +1 -8
  55. osn_selenium/executors/sync/cdp.py +95 -0
  56. osn_selenium/executors/trio_bidi/cdp.py +101 -0
  57. osn_selenium/executors/trio_bidi/javascript.py +101 -0
  58. osn_selenium/executors/trio_threads/cdp.py +99 -0
  59. osn_selenium/executors/trio_threads/javascript.py +1 -1
  60. osn_selenium/executors/unified/javascript.py +0 -4
  61. osn_selenium/flags/base.py +7 -13
  62. osn_selenium/flags/blink.py +2 -8
  63. osn_selenium/flags/chrome.py +6 -6
  64. osn_selenium/flags/edge.py +6 -6
  65. osn_selenium/flags/models/base.py +4 -4
  66. osn_selenium/flags/models/blink.py +1 -1
  67. osn_selenium/flags/models/values.py +1 -1
  68. osn_selenium/instances/convert.py +44 -3
  69. osn_selenium/instances/protocols.py +47 -1
  70. osn_selenium/instances/sync/action_chains/__init__.py +6 -0
  71. osn_selenium/instances/sync/browsing_context.py +2 -2
  72. osn_selenium/instances/sync/script.py +7 -2
  73. osn_selenium/instances/sync/shadow_root.py +30 -8
  74. osn_selenium/instances/sync/web_element.py +1 -1
  75. osn_selenium/instances/trio_bidi/__init__.py +1 -0
  76. osn_selenium/instances/trio_bidi/shadow_root.py +180 -0
  77. osn_selenium/instances/trio_bidi/switch_to.py +143 -0
  78. osn_selenium/instances/trio_bidi/web_driver_wait.py +124 -0
  79. osn_selenium/instances/trio_bidi/web_element.py +239 -0
  80. osn_selenium/instances/trio_threads/action_chains/__init__.py +6 -0
  81. osn_selenium/instances/trio_threads/action_chains/base.py +1 -1
  82. osn_selenium/instances/trio_threads/alert.py +1 -1
  83. osn_selenium/instances/trio_threads/browser.py +1 -1
  84. osn_selenium/instances/trio_threads/browsing_context.py +3 -3
  85. osn_selenium/instances/trio_threads/dialog.py +1 -1
  86. osn_selenium/instances/trio_threads/fedcm.py +1 -1
  87. osn_selenium/instances/trio_threads/mobile.py +1 -1
  88. osn_selenium/instances/trio_threads/network.py +1 -1
  89. osn_selenium/instances/trio_threads/permissions.py +1 -1
  90. osn_selenium/instances/trio_threads/script.py +8 -3
  91. osn_selenium/instances/trio_threads/shadow_root.py +46 -15
  92. osn_selenium/instances/trio_threads/storage.py +1 -1
  93. osn_selenium/instances/trio_threads/switch_to.py +1 -1
  94. osn_selenium/instances/trio_threads/web_driver_wait.py +1 -1
  95. osn_selenium/instances/trio_threads/web_element.py +1 -1
  96. osn_selenium/instances/trio_threads/web_extension.py +1 -1
  97. osn_selenium/instances/unified/browsing_context.py +2 -2
  98. osn_selenium/instances/unified/script.py +2 -2
  99. osn_selenium/instances/unified/web_element.py +3 -5
  100. osn_selenium/javascript/fingerprint/__init__.py +3 -2
  101. osn_selenium/javascript/fingerprint/registry/models.py +1 -1
  102. osn_selenium/javascript/fingerprint/spoof/core_rules.py +1 -1
  103. osn_selenium/javascript/fingerprint/spoof/noise.py +1 -1
  104. osn_selenium/javascript/models.py +1 -1
  105. osn_selenium/models.py +2 -47
  106. osn_selenium/trio_bidi/__init__.py +1 -0
  107. osn_selenium/trio_bidi/_context_vars.py +12 -0
  108. osn_selenium/trio_bidi/_error_mappings.py +123 -0
  109. osn_selenium/trio_bidi/_error_redirects.py +194 -0
  110. osn_selenium/trio_bidi/_file_functions.py +28 -0
  111. osn_selenium/trio_bidi/_internal_mappings.py +10 -0
  112. osn_selenium/trio_bidi/_models.py +199 -0
  113. osn_selenium/trio_bidi/_typehints.py +20 -0
  114. osn_selenium/trio_bidi/connection_pool.py +587 -0
  115. osn_selenium/trio_bidi/mapping/__init__.py +1 -0
  116. osn_selenium/trio_bidi/mapping/_constants.py +14 -0
  117. osn_selenium/trio_bidi/mapping/_js_snippets.py +285 -0
  118. osn_selenium/trio_bidi/mapping/_utils.py +4 -0
  119. osn_selenium/trio_bidi/mapping/request_functions/__init__.py +87 -0
  120. osn_selenium/trio_bidi/mapping/request_functions/_alert.py +102 -0
  121. osn_selenium/trio_bidi/mapping/request_functions/_args_helpers.py +225 -0
  122. osn_selenium/trio_bidi/mapping/request_functions/_capture.py +71 -0
  123. osn_selenium/trio_bidi/mapping/request_functions/_cdp.py +40 -0
  124. osn_selenium/trio_bidi/mapping/request_functions/_element.py +55 -0
  125. osn_selenium/trio_bidi/mapping/request_functions/_file.py +32 -0
  126. osn_selenium/trio_bidi/mapping/request_functions/_navigation.py +147 -0
  127. osn_selenium/trio_bidi/mapping/request_functions/_script.py +85 -0
  128. osn_selenium/trio_bidi/mapping/request_functions/_shadow_root.py +65 -0
  129. osn_selenium/trio_bidi/mapping/request_functions/_switch_to.py +59 -0
  130. osn_selenium/trio_bidi/mapping/request_functions/_web_element.py +448 -0
  131. osn_selenium/trio_bidi/mapping/request_functions/_window.py +125 -0
  132. osn_selenium/trio_bidi/mapping/response_functions/__init__.py +86 -0
  133. osn_selenium/trio_bidi/mapping/response_functions/_alert.py +81 -0
  134. osn_selenium/trio_bidi/mapping/response_functions/_args_helpers.py +183 -0
  135. osn_selenium/trio_bidi/mapping/response_functions/_args_validators.py +153 -0
  136. osn_selenium/trio_bidi/mapping/response_functions/_capture.py +71 -0
  137. osn_selenium/trio_bidi/mapping/response_functions/_cdp.py +26 -0
  138. osn_selenium/trio_bidi/mapping/response_functions/_element.py +58 -0
  139. osn_selenium/trio_bidi/mapping/response_functions/_file.py +30 -0
  140. osn_selenium/trio_bidi/mapping/response_functions/_navigation.py +120 -0
  141. osn_selenium/trio_bidi/mapping/response_functions/_script.py +57 -0
  142. osn_selenium/trio_bidi/mapping/response_functions/_shadow_root.py +58 -0
  143. osn_selenium/trio_bidi/mapping/response_functions/_switch_to.py +57 -0
  144. osn_selenium/trio_bidi/mapping/response_functions/_web_element.py +368 -0
  145. osn_selenium/trio_bidi/mapping/response_functions/_window.py +119 -0
  146. osn_selenium/trio_bidi/mixin.py +186 -0
  147. osn_selenium/trio_bidi/remote_connection.py +164 -0
  148. osn_selenium/{base_mixin.py → trio_threads_mixin.py} +31 -40
  149. osn_selenium/webdrivers/_args_helpers.py +120 -7
  150. osn_selenium/webdrivers/_bridges.py +2 -2
  151. osn_selenium/webdrivers/_executable_tables/models.py +1 -1
  152. osn_selenium/webdrivers/_typehints.py +9 -3
  153. osn_selenium/webdrivers/protocols.py +81 -1
  154. osn_selenium/webdrivers/sync/blink/__init__.py +11 -1
  155. osn_selenium/webdrivers/sync/blink/base.py +23 -1
  156. osn_selenium/webdrivers/sync/blink/lifecycle.py +26 -8
  157. osn_selenium/webdrivers/sync/chrome/__init__.py +36 -1
  158. osn_selenium/webdrivers/sync/chrome/base.py +13 -1
  159. osn_selenium/webdrivers/sync/chrome/lifecycle.py +23 -5
  160. osn_selenium/webdrivers/sync/chrome/settings.py +6 -1
  161. osn_selenium/webdrivers/sync/core/__init__.py +10 -1
  162. osn_selenium/webdrivers/sync/core/base.py +18 -18
  163. osn_selenium/webdrivers/sync/core/capture.py +3 -2
  164. osn_selenium/webdrivers/sync/core/file.py +3 -2
  165. osn_selenium/webdrivers/sync/core/lifecycle.py +44 -10
  166. osn_selenium/webdrivers/sync/core/script.py +3 -2
  167. osn_selenium/webdrivers/sync/core/window.py +3 -3
  168. osn_selenium/webdrivers/sync/edge/__init__.py +36 -1
  169. osn_selenium/webdrivers/sync/edge/base.py +13 -1
  170. osn_selenium/webdrivers/sync/edge/lifecycle.py +23 -5
  171. osn_selenium/webdrivers/sync/edge/settings.py +6 -1
  172. osn_selenium/webdrivers/sync/yandex/__init__.py +36 -1
  173. osn_selenium/webdrivers/sync/yandex/base.py +13 -1
  174. osn_selenium/webdrivers/sync/yandex/lifecycle.py +23 -5
  175. osn_selenium/webdrivers/sync/yandex/settings.py +6 -1
  176. osn_selenium/webdrivers/trio_bidi/__init__.py +1 -0
  177. osn_selenium/webdrivers/trio_bidi/blink/__init__.py +132 -0
  178. osn_selenium/webdrivers/trio_bidi/blink/base.py +167 -0
  179. osn_selenium/webdrivers/trio_bidi/blink/lifecycle.py +89 -0
  180. osn_selenium/webdrivers/trio_bidi/blink/settings.py +63 -0
  181. osn_selenium/webdrivers/trio_bidi/chrome/__init__.py +114 -0
  182. osn_selenium/webdrivers/trio_bidi/chrome/base.py +127 -0
  183. osn_selenium/webdrivers/trio_bidi/chrome/lifecycle.py +85 -0
  184. osn_selenium/webdrivers/trio_bidi/chrome/settings.py +63 -0
  185. osn_selenium/webdrivers/trio_bidi/core/__init__.py +95 -0
  186. osn_selenium/webdrivers/trio_bidi/core/actions.py +70 -0
  187. osn_selenium/webdrivers/trio_bidi/core/base.py +200 -0
  188. osn_selenium/webdrivers/trio_bidi/core/capture.py +39 -0
  189. osn_selenium/webdrivers/trio_bidi/core/devtools.py +49 -0
  190. osn_selenium/webdrivers/trio_bidi/core/element.py +64 -0
  191. osn_selenium/webdrivers/trio_bidi/core/lifecycle.py +135 -0
  192. osn_selenium/webdrivers/trio_bidi/core/navigation.py +37 -0
  193. osn_selenium/webdrivers/trio_bidi/core/script.py +56 -0
  194. osn_selenium/webdrivers/trio_bidi/core/settings.py +36 -0
  195. osn_selenium/webdrivers/trio_bidi/core/window.py +134 -0
  196. osn_selenium/webdrivers/trio_bidi/edge/__init__.py +114 -0
  197. osn_selenium/webdrivers/trio_bidi/edge/base.py +123 -0
  198. osn_selenium/webdrivers/trio_bidi/edge/lifecycle.py +85 -0
  199. osn_selenium/webdrivers/trio_bidi/edge/settings.py +63 -0
  200. osn_selenium/webdrivers/trio_bidi/yandex/__init__.py +114 -0
  201. osn_selenium/webdrivers/trio_bidi/yandex/base.py +120 -0
  202. osn_selenium/webdrivers/trio_bidi/yandex/lifecycle.py +85 -0
  203. osn_selenium/webdrivers/trio_bidi/yandex/settings.py +63 -0
  204. osn_selenium/webdrivers/trio_threads/blink/__init__.py +18 -2
  205. osn_selenium/webdrivers/trio_threads/blink/base.py +25 -1
  206. osn_selenium/webdrivers/trio_threads/blink/casting.py +1 -1
  207. osn_selenium/webdrivers/trio_threads/blink/features.py +1 -1
  208. osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +26 -8
  209. osn_selenium/webdrivers/trio_threads/blink/logging.py +1 -1
  210. osn_selenium/webdrivers/trio_threads/blink/network.py +1 -1
  211. osn_selenium/webdrivers/trio_threads/chrome/__init__.py +34 -1
  212. osn_selenium/webdrivers/trio_threads/chrome/base.py +14 -2
  213. osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +23 -5
  214. osn_selenium/webdrivers/trio_threads/chrome/settings.py +1 -1
  215. osn_selenium/webdrivers/trio_threads/core/__init__.py +10 -14
  216. osn_selenium/webdrivers/trio_threads/core/actions.py +1 -1
  217. osn_selenium/webdrivers/trio_threads/core/auth.py +1 -1
  218. osn_selenium/webdrivers/trio_threads/core/base.py +18 -22
  219. osn_selenium/webdrivers/trio_threads/core/capture.py +4 -3
  220. osn_selenium/webdrivers/trio_threads/core/comonents.py +1 -1
  221. osn_selenium/webdrivers/trio_threads/core/devtools.py +1 -1
  222. osn_selenium/webdrivers/trio_threads/core/element.py +1 -1
  223. osn_selenium/webdrivers/trio_threads/core/file.py +5 -4
  224. osn_selenium/webdrivers/trio_threads/core/lifecycle.py +45 -11
  225. osn_selenium/webdrivers/trio_threads/core/navigation.py +1 -1
  226. osn_selenium/webdrivers/trio_threads/core/script.py +4 -3
  227. osn_selenium/webdrivers/trio_threads/core/settings.py +1 -1
  228. osn_selenium/webdrivers/trio_threads/core/storage.py +1 -1
  229. osn_selenium/webdrivers/trio_threads/core/timeouts.py +1 -1
  230. osn_selenium/webdrivers/trio_threads/core/window.py +6 -6
  231. osn_selenium/webdrivers/trio_threads/edge/__init__.py +34 -1
  232. osn_selenium/webdrivers/trio_threads/edge/base.py +14 -2
  233. osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +23 -5
  234. osn_selenium/webdrivers/trio_threads/edge/settings.py +1 -1
  235. osn_selenium/webdrivers/trio_threads/yandex/__init__.py +34 -1
  236. osn_selenium/webdrivers/trio_threads/yandex/base.py +14 -2
  237. osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +23 -5
  238. osn_selenium/webdrivers/trio_threads/yandex/settings.py +1 -1
  239. osn_selenium/webdrivers/unified/blink/base.py +9 -1
  240. osn_selenium/webdrivers/unified/blink/lifecycle.py +4 -2
  241. osn_selenium/webdrivers/unified/chrome/base.py +9 -1
  242. osn_selenium/webdrivers/unified/core/auth.py +4 -2
  243. osn_selenium/webdrivers/unified/core/base.py +19 -6
  244. osn_selenium/webdrivers/unified/core/capture.py +3 -2
  245. osn_selenium/webdrivers/unified/core/components.py +12 -7
  246. osn_selenium/webdrivers/unified/core/devtools.py +2 -1
  247. osn_selenium/webdrivers/unified/core/file.py +3 -2
  248. osn_selenium/webdrivers/unified/core/lifecycle.py +5 -3
  249. osn_selenium/webdrivers/unified/core/script.py +5 -3
  250. osn_selenium/webdrivers/unified/core/storage.py +2 -1
  251. osn_selenium/webdrivers/unified/core/window.py +9 -8
  252. osn_selenium/webdrivers/unified/edge/base.py +9 -1
  253. osn_selenium/webdrivers/unified/yandex/base.py +9 -1
  254. {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/METADATA +24 -10
  255. osn_selenium-1.2.0.dist-info/RECORD +480 -0
  256. {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/WHEEL +1 -1
  257. osn_selenium/abstract/executors/cdp/__init__.py +0 -435
  258. osn_selenium/abstract/executors/cdp/accessibility.py +0 -62
  259. osn_selenium/abstract/executors/cdp/animation.py +0 -47
  260. osn_selenium/abstract/executors/cdp/audits.py +0 -39
  261. osn_selenium/abstract/executors/cdp/autofill.py +0 -34
  262. osn_selenium/abstract/executors/cdp/background_service.py +0 -22
  263. osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +0 -95
  264. osn_selenium/abstract/executors/cdp/browser.py +0 -122
  265. osn_selenium/abstract/executors/cdp/cache_storage.py +0 -49
  266. osn_selenium/abstract/executors/cdp/cast.py +0 -31
  267. osn_selenium/abstract/executors/cdp/console.py +0 -18
  268. osn_selenium/abstract/executors/cdp/css.py +0 -197
  269. osn_selenium/abstract/executors/cdp/debugger.py +0 -198
  270. osn_selenium/abstract/executors/cdp/device_access.py +0 -22
  271. osn_selenium/abstract/executors/cdp/device_orientation.py +0 -14
  272. osn_selenium/abstract/executors/cdp/dom.py +0 -305
  273. osn_selenium/abstract/executors/cdp/dom_debugger.py +0 -57
  274. osn_selenium/abstract/executors/cdp/dom_snapshot.py +0 -42
  275. osn_selenium/abstract/executors/cdp/dom_storage.py +0 -31
  276. osn_selenium/abstract/executors/cdp/emulation.py +0 -259
  277. osn_selenium/abstract/executors/cdp/event_breakpoints.py +0 -18
  278. osn_selenium/abstract/executors/cdp/extensions.py +0 -31
  279. osn_selenium/abstract/executors/cdp/fed_cm.py +0 -35
  280. osn_selenium/abstract/executors/cdp/fetch.py +0 -76
  281. osn_selenium/abstract/executors/cdp/file_system.py +0 -11
  282. osn_selenium/abstract/executors/cdp/headless_experimental.py +0 -30
  283. osn_selenium/abstract/executors/cdp/heap_profiler.py +0 -73
  284. osn_selenium/abstract/executors/cdp/indexed_db.py +0 -99
  285. osn_selenium/abstract/executors/cdp/input.py +0 -158
  286. osn_selenium/abstract/executors/cdp/inspector.py +0 -14
  287. osn_selenium/abstract/executors/cdp/io.py +0 -24
  288. osn_selenium/abstract/executors/cdp/layer_tree.py +0 -61
  289. osn_selenium/abstract/executors/cdp/log.py +0 -27
  290. osn_selenium/abstract/executors/cdp/media.py +0 -14
  291. osn_selenium/abstract/executors/cdp/memory.py +0 -61
  292. osn_selenium/abstract/executors/cdp/network.py +0 -252
  293. osn_selenium/abstract/executors/cdp/overlay.py +0 -166
  294. osn_selenium/abstract/executors/cdp/page.py +0 -347
  295. osn_selenium/abstract/executors/cdp/performance.py +0 -28
  296. osn_selenium/abstract/executors/cdp/performance_timeline.py +0 -11
  297. osn_selenium/abstract/executors/cdp/preload.py +0 -14
  298. osn_selenium/abstract/executors/cdp/profiler.py +0 -54
  299. osn_selenium/abstract/executors/cdp/pwa.py +0 -46
  300. osn_selenium/abstract/executors/cdp/runtime.py +0 -176
  301. osn_selenium/abstract/executors/cdp/schema.py +0 -11
  302. osn_selenium/abstract/executors/cdp/security.py +0 -26
  303. osn_selenium/abstract/executors/cdp/service_worker.py +0 -54
  304. osn_selenium/abstract/executors/cdp/storage.py +0 -175
  305. osn_selenium/abstract/executors/cdp/system_info.py +0 -24
  306. osn_selenium/abstract/executors/cdp/target.py +0 -125
  307. osn_selenium/abstract/executors/cdp/tethering.py +0 -14
  308. osn_selenium/abstract/executors/cdp/tracing.py +0 -48
  309. osn_selenium/abstract/executors/cdp/web_audio.py +0 -19
  310. osn_selenium/abstract/executors/cdp/web_authn.py +0 -76
  311. osn_selenium/executors/sync/cdp/__init__.py +0 -550
  312. osn_selenium/executors/sync/cdp/accessibility.py +0 -74
  313. osn_selenium/executors/sync/cdp/animation.py +0 -50
  314. osn_selenium/executors/sync/cdp/audits.py +0 -48
  315. osn_selenium/executors/sync/cdp/autofill.py +0 -39
  316. osn_selenium/executors/sync/cdp/background_service.py +0 -30
  317. osn_selenium/executors/sync/cdp/bluetooth_emulation.py +0 -101
  318. osn_selenium/executors/sync/cdp/browser.py +0 -131
  319. osn_selenium/executors/sync/cdp/cache_storage.py +0 -66
  320. osn_selenium/executors/sync/cdp/cast.py +0 -38
  321. osn_selenium/executors/sync/cdp/console.py +0 -24
  322. osn_selenium/executors/sync/cdp/css.py +0 -187
  323. osn_selenium/executors/sync/cdp/debugger.py +0 -206
  324. osn_selenium/executors/sync/cdp/device_access.py +0 -27
  325. osn_selenium/executors/sync/cdp/device_orientation.py +0 -24
  326. osn_selenium/executors/sync/cdp/dom.py +0 -310
  327. osn_selenium/executors/sync/cdp/dom_debugger.py +0 -56
  328. osn_selenium/executors/sync/cdp/dom_snapshot.py +0 -58
  329. osn_selenium/executors/sync/cdp/dom_storage.py +0 -38
  330. osn_selenium/executors/sync/cdp/emulation.py +0 -270
  331. osn_selenium/executors/sync/cdp/event_breakpoints.py +0 -27
  332. osn_selenium/executors/sync/cdp/extensions.py +0 -39
  333. osn_selenium/executors/sync/cdp/fed_cm.py +0 -45
  334. osn_selenium/executors/sync/cdp/fetch.py +0 -96
  335. osn_selenium/executors/sync/cdp/file_system.py +0 -18
  336. osn_selenium/executors/sync/cdp/headless_experimental.py +0 -44
  337. osn_selenium/executors/sync/cdp/heap_profiler.py +0 -89
  338. osn_selenium/executors/sync/cdp/indexed_db.py +0 -142
  339. osn_selenium/executors/sync/cdp/input.py +0 -233
  340. osn_selenium/executors/sync/cdp/inspector.py +0 -21
  341. osn_selenium/executors/sync/cdp/io.py +0 -33
  342. osn_selenium/executors/sync/cdp/layer_tree.py +0 -71
  343. osn_selenium/executors/sync/cdp/log.py +0 -35
  344. osn_selenium/executors/sync/cdp/media.py +0 -21
  345. osn_selenium/executors/sync/cdp/memory.py +0 -62
  346. osn_selenium/executors/sync/cdp/network.py +0 -287
  347. osn_selenium/executors/sync/cdp/overlay.py +0 -174
  348. osn_selenium/executors/sync/cdp/page.py +0 -365
  349. osn_selenium/executors/sync/cdp/performance.py +0 -33
  350. osn_selenium/executors/sync/cdp/performance_timeline.py +0 -26
  351. osn_selenium/executors/sync/cdp/preload.py +0 -21
  352. osn_selenium/executors/sync/cdp/profiler.py +0 -58
  353. osn_selenium/executors/sync/cdp/pwa.py +0 -55
  354. osn_selenium/executors/sync/cdp/runtime.py +0 -221
  355. osn_selenium/executors/sync/cdp/schema.py +0 -23
  356. osn_selenium/executors/sync/cdp/security.py +0 -30
  357. osn_selenium/executors/sync/cdp/service_worker.py +0 -56
  358. osn_selenium/executors/sync/cdp/storage.py +0 -151
  359. osn_selenium/executors/sync/cdp/system_info.py +0 -30
  360. osn_selenium/executors/sync/cdp/target.py +0 -147
  361. osn_selenium/executors/sync/cdp/tethering.py +0 -21
  362. osn_selenium/executors/sync/cdp/tracing.py +0 -62
  363. osn_selenium/executors/sync/cdp/web_audio.py +0 -24
  364. osn_selenium/executors/sync/cdp/web_authn.py +0 -82
  365. osn_selenium/executors/trio_threads/cdp/__init__.py +0 -771
  366. osn_selenium/executors/trio_threads/cdp/accessibility.py +0 -87
  367. osn_selenium/executors/trio_threads/cdp/animation.py +0 -63
  368. osn_selenium/executors/trio_threads/cdp/audits.py +0 -57
  369. osn_selenium/executors/trio_threads/cdp/autofill.py +0 -52
  370. osn_selenium/executors/trio_threads/cdp/background_service.py +0 -40
  371. osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +0 -111
  372. osn_selenium/executors/trio_threads/cdp/browser.py +0 -140
  373. osn_selenium/executors/trio_threads/cdp/cache_storage.py +0 -79
  374. osn_selenium/executors/trio_threads/cdp/cast.py +0 -47
  375. osn_selenium/executors/trio_threads/cdp/console.py +0 -33
  376. osn_selenium/executors/trio_threads/cdp/css.py +0 -196
  377. osn_selenium/executors/trio_threads/cdp/debugger.py +0 -219
  378. osn_selenium/executors/trio_threads/cdp/device_access.py +0 -40
  379. osn_selenium/executors/trio_threads/cdp/device_orientation.py +0 -34
  380. osn_selenium/executors/trio_threads/cdp/dom.py +0 -319
  381. osn_selenium/executors/trio_threads/cdp/dom_debugger.py +0 -69
  382. osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +0 -71
  383. osn_selenium/executors/trio_threads/cdp/dom_storage.py +0 -51
  384. osn_selenium/executors/trio_threads/cdp/emulation.py +0 -283
  385. osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +0 -37
  386. osn_selenium/executors/trio_threads/cdp/extensions.py +0 -52
  387. osn_selenium/executors/trio_threads/cdp/fed_cm.py +0 -54
  388. osn_selenium/executors/trio_threads/cdp/fetch.py +0 -105
  389. osn_selenium/executors/trio_threads/cdp/file_system.py +0 -31
  390. osn_selenium/executors/trio_threads/cdp/headless_experimental.py +0 -54
  391. osn_selenium/executors/trio_threads/cdp/heap_profiler.py +0 -102
  392. osn_selenium/executors/trio_threads/cdp/indexed_db.py +0 -155
  393. osn_selenium/executors/trio_threads/cdp/input.py +0 -242
  394. osn_selenium/executors/trio_threads/cdp/inspector.py +0 -34
  395. osn_selenium/executors/trio_threads/cdp/io.py +0 -42
  396. osn_selenium/executors/trio_threads/cdp/layer_tree.py +0 -84
  397. osn_selenium/executors/trio_threads/cdp/log.py +0 -44
  398. osn_selenium/executors/trio_threads/cdp/media.py +0 -30
  399. osn_selenium/executors/trio_threads/cdp/memory.py +0 -71
  400. osn_selenium/executors/trio_threads/cdp/network.py +0 -296
  401. osn_selenium/executors/trio_threads/cdp/overlay.py +0 -183
  402. osn_selenium/executors/trio_threads/cdp/page.py +0 -374
  403. osn_selenium/executors/trio_threads/cdp/performance.py +0 -46
  404. osn_selenium/executors/trio_threads/cdp/performance_timeline.py +0 -36
  405. osn_selenium/executors/trio_threads/cdp/preload.py +0 -30
  406. osn_selenium/executors/trio_threads/cdp/profiler.py +0 -71
  407. osn_selenium/executors/trio_threads/cdp/pwa.py +0 -64
  408. osn_selenium/executors/trio_threads/cdp/runtime.py +0 -230
  409. osn_selenium/executors/trio_threads/cdp/schema.py +0 -32
  410. osn_selenium/executors/trio_threads/cdp/security.py +0 -43
  411. osn_selenium/executors/trio_threads/cdp/service_worker.py +0 -69
  412. osn_selenium/executors/trio_threads/cdp/storage.py +0 -162
  413. osn_selenium/executors/trio_threads/cdp/system_info.py +0 -43
  414. osn_selenium/executors/trio_threads/cdp/target.py +0 -156
  415. osn_selenium/executors/trio_threads/cdp/tethering.py +0 -34
  416. osn_selenium/executors/trio_threads/cdp/tracing.py +0 -71
  417. osn_selenium/executors/trio_threads/cdp/web_audio.py +0 -37
  418. osn_selenium/executors/trio_threads/cdp/web_authn.py +0 -95
  419. osn_selenium/executors/unified/cdp/accessibility.py +0 -81
  420. osn_selenium/executors/unified/cdp/animation.py +0 -50
  421. osn_selenium/executors/unified/cdp/audits.py +0 -45
  422. osn_selenium/executors/unified/cdp/autofill.py +0 -41
  423. osn_selenium/executors/unified/cdp/background_service.py +0 -24
  424. osn_selenium/executors/unified/cdp/bluetooth_emulation.py +0 -132
  425. osn_selenium/executors/unified/cdp/browser.py +0 -143
  426. osn_selenium/executors/unified/cdp/cache_storage.py +0 -69
  427. osn_selenium/executors/unified/cdp/cast.py +0 -32
  428. osn_selenium/executors/unified/cdp/console.py +0 -18
  429. osn_selenium/executors/unified/cdp/css.py +0 -237
  430. osn_selenium/executors/unified/cdp/debugger.py +0 -243
  431. osn_selenium/executors/unified/cdp/device_access.py +0 -21
  432. osn_selenium/executors/unified/cdp/device_orientation.py +0 -18
  433. osn_selenium/executors/unified/cdp/dom.py +0 -380
  434. osn_selenium/executors/unified/cdp/dom_debugger.py +0 -65
  435. osn_selenium/executors/unified/cdp/dom_snapshot.py +0 -58
  436. osn_selenium/executors/unified/cdp/dom_storage.py +0 -38
  437. osn_selenium/executors/unified/cdp/emulation.py +0 -312
  438. osn_selenium/executors/unified/cdp/event_breakpoints.py +0 -24
  439. osn_selenium/executors/unified/cdp/extensions.py +0 -45
  440. osn_selenium/executors/unified/cdp/fed_cm.py +0 -51
  441. osn_selenium/executors/unified/cdp/fetch.py +0 -111
  442. osn_selenium/executors/unified/cdp/file_system.py +0 -15
  443. osn_selenium/executors/unified/cdp/headless_experimental.py +0 -38
  444. osn_selenium/executors/unified/cdp/heap_profiler.py +0 -101
  445. osn_selenium/executors/unified/cdp/indexed_db.py +0 -157
  446. osn_selenium/executors/unified/cdp/input.py +0 -254
  447. osn_selenium/executors/unified/cdp/inspector.py +0 -15
  448. osn_selenium/executors/unified/cdp/io.py +0 -29
  449. osn_selenium/executors/unified/cdp/layer_tree.py +0 -71
  450. osn_selenium/executors/unified/cdp/log.py +0 -29
  451. osn_selenium/executors/unified/cdp/media.py +0 -15
  452. osn_selenium/executors/unified/cdp/memory.py +0 -59
  453. osn_selenium/executors/unified/cdp/network.py +0 -323
  454. osn_selenium/executors/unified/cdp/overlay.py +0 -209
  455. osn_selenium/executors/unified/cdp/page.py +0 -410
  456. osn_selenium/executors/unified/cdp/performance.py +0 -27
  457. osn_selenium/executors/unified/cdp/performance_timeline.py +0 -17
  458. osn_selenium/executors/unified/cdp/preload.py +0 -15
  459. osn_selenium/executors/unified/cdp/profiler.py +0 -55
  460. osn_selenium/executors/unified/cdp/pwa.py +0 -55
  461. osn_selenium/executors/unified/cdp/runtime.py +0 -245
  462. osn_selenium/executors/unified/cdp/schema.py +0 -17
  463. osn_selenium/executors/unified/cdp/security.py +0 -27
  464. osn_selenium/executors/unified/cdp/service_worker.py +0 -62
  465. osn_selenium/executors/unified/cdp/storage.py +0 -178
  466. osn_selenium/executors/unified/cdp/system_info.py +0 -24
  467. osn_selenium/executors/unified/cdp/target.py +0 -165
  468. osn_selenium/executors/unified/cdp/tethering.py +0 -15
  469. osn_selenium/executors/unified/cdp/tracing.py +0 -62
  470. osn_selenium/executors/unified/cdp/web_audio.py +0 -18
  471. osn_selenium/executors/unified/cdp/web_authn.py +0 -103
  472. osn_selenium-1.0.0.dist-info/RECORD +0 -608
  473. /osn_selenium/{dev_tools/_exception_helpers.py → _exception_helpers.py} +0 -0
  474. /osn_selenium/executors/{unified/cdp → trio_bidi}/__init__.py +0 -0
  475. {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/top_level.txt +0 -0
osn_selenium/models.py CHANGED
@@ -1,36 +1,8 @@
1
1
  from typing import Self
2
- from pydantic import (
3
- BaseModel,
4
- ConfigDict
5
- )
2
+ from osn_selenium._base_models import DictModel
6
3
 
7
4
 
8
- __all__ = [
9
- "DictModel",
10
- "ExtraDictModel",
11
- "Point",
12
- "Position",
13
- "Rectangle",
14
- "Size",
15
- "WindowRect"
16
- ]
17
-
18
-
19
- class DictModel(BaseModel):
20
- """
21
- Base class for Pydantic models with a predefined configuration.
22
-
23
- This configuration enforces strict validation rules such as forbidding extra
24
- fields and stripping whitespace from string inputs.
25
- """
26
-
27
- model_config = ConfigDict(
28
- populate_by_name=True,
29
- extra="forbid",
30
- use_enum_values=True,
31
- str_strip_whitespace=True,
32
- validate_assignment=True,
33
- )
5
+ __all__ = ["Point", "Position", "Rectangle", "Size", "WindowRect"]
34
6
 
35
7
 
36
8
  class WindowRect(DictModel):
@@ -120,20 +92,3 @@ class Point:
120
92
 
121
93
  def __ne__(self, other: Self) -> bool:
122
94
  return not self.__eq__(other)
123
-
124
-
125
- class ExtraDictModel(BaseModel):
126
- """
127
- Base class for Pydantic models that allows extra fields.
128
-
129
- This configuration allows the model to accept fields that are not
130
- explicitly defined in the model's schema.
131
- """
132
-
133
- model_config = ConfigDict(
134
- populate_by_name=True,
135
- extra="allow",
136
- use_enum_values=True,
137
- str_strip_whitespace=True,
138
- validate_assignment=True,
139
- )
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,12 @@
1
+ from _contextvars import ContextVar
2
+ from osn_selenium.trio_bidi._typehints import (
3
+ CURRENT_BROWSING_CONTEXT_TYPEHINT
4
+ )
5
+
6
+
7
+ __all__ = ["CURRENT_BROWSING_CONTEXT"]
8
+
9
+ CURRENT_BROWSING_CONTEXT: ContextVar[CURRENT_BROWSING_CONTEXT_TYPEHINT] = ContextVar("current_browsing_context",
10
+
11
+
12
+ default=None)
@@ -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]]