osn-selenium 0.0.0__py3-none-any.whl → 1.1.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.
- osn_selenium/_base_models.py +41 -0
- osn_selenium/_cdp_import.py +253 -0
- osn_selenium/_functions.py +84 -0
- osn_selenium/_typehints.py +19 -0
- osn_selenium/abstract/executors/cdp/__init__.py +435 -0
- osn_selenium/abstract/executors/cdp/accessibility.py +62 -0
- osn_selenium/abstract/executors/cdp/animation.py +47 -0
- osn_selenium/abstract/executors/cdp/audits.py +39 -0
- osn_selenium/abstract/executors/cdp/autofill.py +34 -0
- osn_selenium/abstract/executors/cdp/background_service.py +22 -0
- osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +95 -0
- osn_selenium/abstract/executors/cdp/browser.py +122 -0
- osn_selenium/abstract/executors/cdp/cache_storage.py +49 -0
- osn_selenium/abstract/executors/cdp/cast.py +31 -0
- osn_selenium/abstract/executors/cdp/console.py +18 -0
- osn_selenium/abstract/executors/cdp/css.py +197 -0
- osn_selenium/abstract/executors/cdp/debugger.py +198 -0
- osn_selenium/abstract/executors/cdp/device_access.py +22 -0
- osn_selenium/abstract/executors/cdp/device_orientation.py +14 -0
- osn_selenium/abstract/executors/cdp/dom.py +305 -0
- osn_selenium/abstract/executors/cdp/dom_debugger.py +57 -0
- osn_selenium/abstract/executors/cdp/dom_snapshot.py +42 -0
- osn_selenium/abstract/executors/cdp/dom_storage.py +31 -0
- osn_selenium/abstract/executors/cdp/emulation.py +259 -0
- osn_selenium/abstract/executors/cdp/event_breakpoints.py +18 -0
- osn_selenium/abstract/executors/cdp/extensions.py +31 -0
- osn_selenium/abstract/executors/cdp/fed_cm.py +35 -0
- osn_selenium/abstract/executors/cdp/fetch.py +76 -0
- osn_selenium/abstract/executors/cdp/file_system.py +11 -0
- osn_selenium/abstract/executors/cdp/headless_experimental.py +30 -0
- osn_selenium/abstract/executors/cdp/heap_profiler.py +73 -0
- osn_selenium/abstract/executors/cdp/indexed_db.py +99 -0
- osn_selenium/abstract/executors/cdp/input.py +158 -0
- osn_selenium/abstract/executors/cdp/inspector.py +14 -0
- osn_selenium/abstract/executors/cdp/io.py +24 -0
- osn_selenium/abstract/executors/cdp/layer_tree.py +61 -0
- osn_selenium/abstract/executors/cdp/log.py +27 -0
- osn_selenium/abstract/executors/cdp/media.py +14 -0
- osn_selenium/abstract/executors/cdp/memory.py +61 -0
- osn_selenium/abstract/executors/cdp/network.py +252 -0
- osn_selenium/abstract/executors/cdp/overlay.py +166 -0
- osn_selenium/abstract/executors/cdp/page.py +347 -0
- osn_selenium/abstract/executors/cdp/performance.py +28 -0
- osn_selenium/abstract/executors/cdp/performance_timeline.py +11 -0
- osn_selenium/abstract/executors/cdp/preload.py +14 -0
- osn_selenium/abstract/executors/cdp/profiler.py +54 -0
- osn_selenium/abstract/executors/cdp/pwa.py +46 -0
- osn_selenium/abstract/executors/cdp/runtime.py +176 -0
- osn_selenium/abstract/executors/cdp/schema.py +11 -0
- osn_selenium/abstract/executors/cdp/security.py +26 -0
- osn_selenium/abstract/executors/cdp/service_worker.py +54 -0
- osn_selenium/abstract/executors/cdp/storage.py +175 -0
- osn_selenium/abstract/executors/cdp/system_info.py +24 -0
- osn_selenium/abstract/executors/cdp/target.py +125 -0
- osn_selenium/abstract/executors/cdp/tethering.py +14 -0
- osn_selenium/abstract/executors/cdp/tracing.py +48 -0
- osn_selenium/abstract/executors/cdp/web_audio.py +19 -0
- osn_selenium/abstract/executors/cdp/web_authn.py +76 -0
- osn_selenium/abstract/executors/cdp.py +63 -0
- osn_selenium/abstract/executors/javascript.py +203 -0
- osn_selenium/abstract/instances/action_chains/__init__.py +12 -0
- osn_selenium/abstract/instances/action_chains/base.py +25 -0
- osn_selenium/abstract/instances/action_chains/click.py +93 -0
- osn_selenium/abstract/instances/action_chains/drag_and_drop.py +46 -0
- osn_selenium/abstract/instances/action_chains/hm_keyboard.py +44 -0
- osn_selenium/abstract/instances/action_chains/hm_move.py +104 -0
- osn_selenium/abstract/instances/action_chains/hm_scroll.py +75 -0
- osn_selenium/abstract/instances/action_chains/keyboard.py +79 -0
- osn_selenium/abstract/instances/action_chains/move.py +60 -0
- osn_selenium/abstract/instances/action_chains/scroll.py +61 -0
- osn_selenium/abstract/instances/action_chains/utils.py +44 -0
- osn_selenium/abstract/instances/alert.py +67 -0
- osn_selenium/abstract/instances/browser.py +76 -0
- osn_selenium/abstract/instances/browsing_context.py +310 -0
- osn_selenium/abstract/instances/dialog.py +107 -0
- osn_selenium/abstract/instances/fedcm.py +133 -0
- osn_selenium/abstract/instances/mobile.py +79 -0
- osn_selenium/abstract/instances/network.py +100 -0
- osn_selenium/abstract/instances/permissions.py +52 -0
- osn_selenium/abstract/instances/script.py +109 -0
- osn_selenium/abstract/instances/shadow_root.py +81 -0
- osn_selenium/abstract/instances/storage.py +98 -0
- osn_selenium/abstract/instances/switch_to.py +104 -0
- osn_selenium/abstract/instances/web_driver_wait.py +57 -0
- osn_selenium/abstract/instances/web_element.py +395 -0
- osn_selenium/abstract/instances/web_extension.py +70 -0
- osn_selenium/abstract/webdriver/blink/__init__.py +18 -0
- osn_selenium/abstract/webdriver/blink/base.py +80 -0
- osn_selenium/abstract/webdriver/blink/casting.py +82 -0
- osn_selenium/abstract/webdriver/blink/features.py +51 -0
- osn_selenium/abstract/webdriver/blink/lifecycle.py +76 -0
- osn_selenium/abstract/webdriver/blink/logging.py +40 -0
- osn_selenium/abstract/webdriver/blink/network.py +45 -0
- osn_selenium/abstract/webdriver/blink/settings.py +68 -0
- osn_selenium/abstract/webdriver/chrome/__init__.py +18 -0
- osn_selenium/abstract/webdriver/chrome/base.py +36 -0
- osn_selenium/abstract/webdriver/chrome/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/chrome/settings.py +110 -0
- osn_selenium/abstract/webdriver/core/__init__.py +16 -0
- osn_selenium/abstract/webdriver/core/actions.py +58 -0
- osn_selenium/abstract/webdriver/core/auth.py +145 -0
- osn_selenium/abstract/webdriver/core/base.py +298 -0
- osn_selenium/abstract/webdriver/core/capture.py +84 -0
- osn_selenium/abstract/webdriver/core/components.py +82 -0
- osn_selenium/abstract/webdriver/core/devtools.py +69 -0
- osn_selenium/abstract/webdriver/core/element.py +55 -0
- osn_selenium/abstract/webdriver/core/file.py +82 -0
- osn_selenium/abstract/webdriver/core/lifecycle.py +103 -0
- osn_selenium/abstract/webdriver/core/navigation.py +65 -0
- osn_selenium/abstract/webdriver/core/script.py +88 -0
- osn_selenium/abstract/webdriver/core/settings.py +43 -0
- osn_selenium/abstract/webdriver/core/storage.py +81 -0
- osn_selenium/abstract/webdriver/core/timeouts.py +101 -0
- osn_selenium/abstract/webdriver/core/window.py +237 -0
- osn_selenium/abstract/webdriver/edge/__init__.py +18 -0
- osn_selenium/abstract/webdriver/edge/base.py +36 -0
- osn_selenium/abstract/webdriver/edge/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/edge/settings.py +110 -0
- osn_selenium/abstract/webdriver/yandex/__init__.py +18 -0
- osn_selenium/abstract/webdriver/yandex/base.py +18 -0
- osn_selenium/abstract/webdriver/yandex/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/yandex/settings.py +110 -0
- osn_selenium/base_mixin.py +122 -0
- osn_selenium/browsers_handler/__init__.py +47 -17
- osn_selenium/browsers_handler/_linux.py +226 -0
- osn_selenium/browsers_handler/_windows.py +21 -14
- osn_selenium/browsers_handler/{types.py → models.py} +5 -2
- osn_selenium/dev_tools/_decorators.py +149 -0
- osn_selenium/dev_tools/_exception_helpers.py +116 -0
- osn_selenium/dev_tools/_functions.py +174 -0
- osn_selenium/dev_tools/_system_utils.py +35 -0
- osn_selenium/dev_tools/_typehints.py +35 -0
- osn_selenium/dev_tools/_validators.py +227 -0
- osn_selenium/dev_tools/_wrappers.py +92 -0
- osn_selenium/dev_tools/domains/__init__.py +7 -40
- osn_selenium/dev_tools/domains/abstract.py +98 -254
- osn_selenium/dev_tools/domains/fetch.py +229 -906
- osn_selenium/dev_tools/domains_default/fetch.py +40 -28
- osn_selenium/dev_tools/filters.py +40 -0
- osn_selenium/dev_tools/logger/main.py +214 -0
- osn_selenium/dev_tools/logger/models.py +232 -0
- osn_selenium/dev_tools/logger/target.py +278 -0
- osn_selenium/dev_tools/manager/__init__.py +16 -0
- osn_selenium/dev_tools/manager/base.py +124 -0
- osn_selenium/dev_tools/manager/lifecycle.py +236 -0
- osn_selenium/dev_tools/manager/logging.py +153 -0
- osn_selenium/dev_tools/manager/settings.py +89 -0
- osn_selenium/dev_tools/manager/targets.py +175 -0
- osn_selenium/dev_tools/models.py +49 -0
- osn_selenium/dev_tools/settings.py +139 -0
- osn_selenium/dev_tools/target/__init__.py +16 -0
- osn_selenium/dev_tools/target/base.py +427 -0
- osn_selenium/dev_tools/target/detach.py +54 -0
- osn_selenium/dev_tools/target/discovery.py +112 -0
- osn_selenium/dev_tools/target/events.py +120 -0
- osn_selenium/dev_tools/target/fingerprint.py +126 -0
- osn_selenium/dev_tools/target/lifecycle.py +184 -0
- osn_selenium/dev_tools/target/logging.py +163 -0
- osn_selenium/exceptions/__init__.py +1 -0
- osn_selenium/exceptions/base.py +9 -0
- osn_selenium/exceptions/configuration.py +84 -0
- osn_selenium/exceptions/dependencies.py +60 -0
- osn_selenium/exceptions/devtools.py +114 -0
- osn_selenium/exceptions/flags.py +45 -0
- osn_selenium/exceptions/instance.py +92 -0
- osn_selenium/exceptions/javascript.py +31 -0
- osn_selenium/exceptions/logic.py +31 -0
- osn_selenium/exceptions/path.py +77 -0
- osn_selenium/exceptions/platform.py +33 -0
- osn_selenium/exceptions/protocol.py +86 -0
- osn_selenium/exceptions/webdriver.py +44 -0
- osn_selenium/exceptions/window.py +63 -0
- osn_selenium/executors/__init__.py +1 -0
- osn_selenium/executors/sync/__init__.py +1 -0
- osn_selenium/executors/sync/cdp/__init__.py +550 -0
- osn_selenium/executors/sync/cdp/accessibility.py +74 -0
- osn_selenium/executors/sync/cdp/animation.py +50 -0
- osn_selenium/executors/sync/cdp/audits.py +48 -0
- osn_selenium/executors/sync/cdp/autofill.py +39 -0
- osn_selenium/executors/sync/cdp/background_service.py +30 -0
- osn_selenium/executors/sync/cdp/bluetooth_emulation.py +101 -0
- osn_selenium/executors/sync/cdp/browser.py +131 -0
- osn_selenium/executors/sync/cdp/cache_storage.py +66 -0
- osn_selenium/executors/sync/cdp/cast.py +38 -0
- osn_selenium/executors/sync/cdp/console.py +24 -0
- osn_selenium/executors/sync/cdp/css.py +187 -0
- osn_selenium/executors/sync/cdp/debugger.py +206 -0
- osn_selenium/executors/sync/cdp/device_access.py +27 -0
- osn_selenium/executors/sync/cdp/device_orientation.py +24 -0
- osn_selenium/executors/sync/cdp/dom.py +310 -0
- osn_selenium/executors/sync/cdp/dom_debugger.py +56 -0
- osn_selenium/executors/sync/cdp/dom_snapshot.py +58 -0
- osn_selenium/executors/sync/cdp/dom_storage.py +38 -0
- osn_selenium/executors/sync/cdp/emulation.py +270 -0
- osn_selenium/executors/sync/cdp/event_breakpoints.py +27 -0
- osn_selenium/executors/sync/cdp/extensions.py +39 -0
- osn_selenium/executors/sync/cdp/fed_cm.py +45 -0
- osn_selenium/executors/sync/cdp/fetch.py +96 -0
- osn_selenium/executors/sync/cdp/file_system.py +18 -0
- osn_selenium/executors/sync/cdp/headless_experimental.py +44 -0
- osn_selenium/executors/sync/cdp/heap_profiler.py +89 -0
- osn_selenium/executors/sync/cdp/indexed_db.py +142 -0
- osn_selenium/executors/sync/cdp/input.py +233 -0
- osn_selenium/executors/sync/cdp/inspector.py +21 -0
- osn_selenium/executors/sync/cdp/io.py +33 -0
- osn_selenium/executors/sync/cdp/layer_tree.py +71 -0
- osn_selenium/executors/sync/cdp/log.py +35 -0
- osn_selenium/executors/sync/cdp/media.py +21 -0
- osn_selenium/executors/sync/cdp/memory.py +62 -0
- osn_selenium/executors/sync/cdp/network.py +287 -0
- osn_selenium/executors/sync/cdp/overlay.py +174 -0
- osn_selenium/executors/sync/cdp/page.py +365 -0
- osn_selenium/executors/sync/cdp/performance.py +33 -0
- osn_selenium/executors/sync/cdp/performance_timeline.py +26 -0
- osn_selenium/executors/sync/cdp/preload.py +21 -0
- osn_selenium/executors/sync/cdp/profiler.py +58 -0
- osn_selenium/executors/sync/cdp/pwa.py +55 -0
- osn_selenium/executors/sync/cdp/runtime.py +221 -0
- osn_selenium/executors/sync/cdp/schema.py +23 -0
- osn_selenium/executors/sync/cdp/security.py +30 -0
- osn_selenium/executors/sync/cdp/service_worker.py +56 -0
- osn_selenium/executors/sync/cdp/storage.py +151 -0
- osn_selenium/executors/sync/cdp/system_info.py +30 -0
- osn_selenium/executors/sync/cdp/target.py +147 -0
- osn_selenium/executors/sync/cdp/tethering.py +21 -0
- osn_selenium/executors/sync/cdp/tracing.py +62 -0
- osn_selenium/executors/sync/cdp/web_audio.py +24 -0
- osn_selenium/executors/sync/cdp/web_authn.py +82 -0
- osn_selenium/executors/sync/cdp.py +100 -0
- osn_selenium/executors/sync/javascript.py +79 -0
- osn_selenium/executors/trio_threads/__init__.py +1 -0
- osn_selenium/executors/trio_threads/cdp/__init__.py +771 -0
- osn_selenium/executors/trio_threads/cdp/accessibility.py +87 -0
- osn_selenium/executors/trio_threads/cdp/animation.py +63 -0
- osn_selenium/executors/trio_threads/cdp/audits.py +57 -0
- osn_selenium/executors/trio_threads/cdp/autofill.py +52 -0
- osn_selenium/executors/trio_threads/cdp/background_service.py +40 -0
- osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +111 -0
- osn_selenium/executors/trio_threads/cdp/browser.py +140 -0
- osn_selenium/executors/trio_threads/cdp/cache_storage.py +79 -0
- osn_selenium/executors/trio_threads/cdp/cast.py +47 -0
- osn_selenium/executors/trio_threads/cdp/console.py +33 -0
- osn_selenium/executors/trio_threads/cdp/css.py +196 -0
- osn_selenium/executors/trio_threads/cdp/debugger.py +219 -0
- osn_selenium/executors/trio_threads/cdp/device_access.py +40 -0
- osn_selenium/executors/trio_threads/cdp/device_orientation.py +34 -0
- osn_selenium/executors/trio_threads/cdp/dom.py +319 -0
- osn_selenium/executors/trio_threads/cdp/dom_debugger.py +69 -0
- osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +71 -0
- osn_selenium/executors/trio_threads/cdp/dom_storage.py +51 -0
- osn_selenium/executors/trio_threads/cdp/emulation.py +283 -0
- osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +37 -0
- osn_selenium/executors/trio_threads/cdp/extensions.py +52 -0
- osn_selenium/executors/trio_threads/cdp/fed_cm.py +54 -0
- osn_selenium/executors/trio_threads/cdp/fetch.py +105 -0
- osn_selenium/executors/trio_threads/cdp/file_system.py +31 -0
- osn_selenium/executors/trio_threads/cdp/headless_experimental.py +54 -0
- osn_selenium/executors/trio_threads/cdp/heap_profiler.py +102 -0
- osn_selenium/executors/trio_threads/cdp/indexed_db.py +155 -0
- osn_selenium/executors/trio_threads/cdp/input.py +242 -0
- osn_selenium/executors/trio_threads/cdp/inspector.py +34 -0
- osn_selenium/executors/trio_threads/cdp/io.py +42 -0
- osn_selenium/executors/trio_threads/cdp/layer_tree.py +84 -0
- osn_selenium/executors/trio_threads/cdp/log.py +44 -0
- osn_selenium/executors/trio_threads/cdp/media.py +30 -0
- osn_selenium/executors/trio_threads/cdp/memory.py +71 -0
- osn_selenium/executors/trio_threads/cdp/network.py +296 -0
- osn_selenium/executors/trio_threads/cdp/overlay.py +183 -0
- osn_selenium/executors/trio_threads/cdp/page.py +374 -0
- osn_selenium/executors/trio_threads/cdp/performance.py +46 -0
- osn_selenium/executors/trio_threads/cdp/performance_timeline.py +36 -0
- osn_selenium/executors/trio_threads/cdp/preload.py +30 -0
- osn_selenium/executors/trio_threads/cdp/profiler.py +71 -0
- osn_selenium/executors/trio_threads/cdp/pwa.py +64 -0
- osn_selenium/executors/trio_threads/cdp/runtime.py +230 -0
- osn_selenium/executors/trio_threads/cdp/schema.py +32 -0
- osn_selenium/executors/trio_threads/cdp/security.py +43 -0
- osn_selenium/executors/trio_threads/cdp/service_worker.py +69 -0
- osn_selenium/executors/trio_threads/cdp/storage.py +162 -0
- osn_selenium/executors/trio_threads/cdp/system_info.py +43 -0
- osn_selenium/executors/trio_threads/cdp/target.py +156 -0
- osn_selenium/executors/trio_threads/cdp/tethering.py +34 -0
- osn_selenium/executors/trio_threads/cdp/tracing.py +71 -0
- osn_selenium/executors/trio_threads/cdp/web_audio.py +37 -0
- osn_selenium/executors/trio_threads/cdp/web_authn.py +95 -0
- osn_selenium/executors/trio_threads/cdp.py +104 -0
- osn_selenium/executors/trio_threads/javascript.py +90 -0
- osn_selenium/executors/unified/__init__.py +1 -0
- osn_selenium/executors/unified/cdp/__init__.py +1 -0
- osn_selenium/executors/unified/cdp/accessibility.py +81 -0
- osn_selenium/executors/unified/cdp/animation.py +50 -0
- osn_selenium/executors/unified/cdp/audits.py +45 -0
- osn_selenium/executors/unified/cdp/autofill.py +41 -0
- osn_selenium/executors/unified/cdp/background_service.py +24 -0
- osn_selenium/executors/unified/cdp/bluetooth_emulation.py +132 -0
- osn_selenium/executors/unified/cdp/browser.py +143 -0
- osn_selenium/executors/unified/cdp/cache_storage.py +69 -0
- osn_selenium/executors/unified/cdp/cast.py +32 -0
- osn_selenium/executors/unified/cdp/console.py +18 -0
- osn_selenium/executors/unified/cdp/css.py +237 -0
- osn_selenium/executors/unified/cdp/debugger.py +243 -0
- osn_selenium/executors/unified/cdp/device_access.py +21 -0
- osn_selenium/executors/unified/cdp/device_orientation.py +18 -0
- osn_selenium/executors/unified/cdp/dom.py +380 -0
- osn_selenium/executors/unified/cdp/dom_debugger.py +65 -0
- osn_selenium/executors/unified/cdp/dom_snapshot.py +58 -0
- osn_selenium/executors/unified/cdp/dom_storage.py +38 -0
- osn_selenium/executors/unified/cdp/emulation.py +312 -0
- osn_selenium/executors/unified/cdp/event_breakpoints.py +24 -0
- osn_selenium/executors/unified/cdp/extensions.py +45 -0
- osn_selenium/executors/unified/cdp/fed_cm.py +51 -0
- osn_selenium/executors/unified/cdp/fetch.py +111 -0
- osn_selenium/executors/unified/cdp/file_system.py +15 -0
- osn_selenium/executors/unified/cdp/headless_experimental.py +38 -0
- osn_selenium/executors/unified/cdp/heap_profiler.py +101 -0
- osn_selenium/executors/unified/cdp/indexed_db.py +157 -0
- osn_selenium/executors/unified/cdp/input.py +254 -0
- osn_selenium/executors/unified/cdp/inspector.py +15 -0
- osn_selenium/executors/unified/cdp/io.py +29 -0
- osn_selenium/executors/unified/cdp/layer_tree.py +71 -0
- osn_selenium/executors/unified/cdp/log.py +29 -0
- osn_selenium/executors/unified/cdp/media.py +15 -0
- osn_selenium/executors/unified/cdp/memory.py +59 -0
- osn_selenium/executors/unified/cdp/network.py +323 -0
- osn_selenium/executors/unified/cdp/overlay.py +209 -0
- osn_selenium/executors/unified/cdp/page.py +410 -0
- osn_selenium/executors/unified/cdp/performance.py +27 -0
- osn_selenium/executors/unified/cdp/performance_timeline.py +17 -0
- osn_selenium/executors/unified/cdp/preload.py +15 -0
- osn_selenium/executors/unified/cdp/profiler.py +55 -0
- osn_selenium/executors/unified/cdp/pwa.py +55 -0
- osn_selenium/executors/unified/cdp/runtime.py +245 -0
- osn_selenium/executors/unified/cdp/schema.py +17 -0
- osn_selenium/executors/unified/cdp/security.py +27 -0
- osn_selenium/executors/unified/cdp/service_worker.py +62 -0
- osn_selenium/executors/unified/cdp/storage.py +178 -0
- osn_selenium/executors/unified/cdp/system_info.py +24 -0
- osn_selenium/executors/unified/cdp/target.py +165 -0
- osn_selenium/executors/unified/cdp/tethering.py +15 -0
- osn_selenium/executors/unified/cdp/tracing.py +62 -0
- osn_selenium/executors/unified/cdp/web_audio.py +18 -0
- osn_selenium/executors/unified/cdp/web_authn.py +103 -0
- osn_selenium/executors/unified/javascript.py +104 -0
- osn_selenium/flags/__init__.py +1 -0
- osn_selenium/flags/_functions.py +45 -0
- osn_selenium/flags/_typehints.py +34 -0
- osn_selenium/flags/_validators.py +101 -0
- osn_selenium/{webdrivers/BaseDriver/flags.py → flags/base.py} +159 -245
- osn_selenium/{webdrivers/Blink/flags.py → flags/blink.py} +130 -374
- osn_selenium/flags/chrome.py +259 -0
- osn_selenium/flags/edge.py +259 -0
- osn_selenium/flags/models/__init__.py +1 -0
- osn_selenium/flags/models/base.py +130 -0
- osn_selenium/flags/models/blink.py +263 -0
- osn_selenium/{webdrivers/Chrome/flags.py → flags/models/chrome.py} +25 -75
- osn_selenium/{webdrivers/Edge/flags.py → flags/models/edge.py} +25 -75
- osn_selenium/flags/models/values.py +44 -0
- osn_selenium/{webdrivers/Yandex/flags.py → flags/models/yandex.py} +26 -76
- osn_selenium/flags/yandex.py +259 -0
- osn_selenium/instances/__init__.py +1 -0
- osn_selenium/instances/_functions.py +242 -0
- osn_selenium/instances/_typehints.py +148 -0
- osn_selenium/instances/_utils.py +143 -0
- osn_selenium/instances/convert.py +287 -0
- osn_selenium/instances/protocols.py +105 -0
- osn_selenium/instances/sync/__init__.py +1 -0
- osn_selenium/instances/sync/action_chains/__init__.py +32 -0
- osn_selenium/instances/sync/action_chains/base.py +74 -0
- osn_selenium/instances/sync/action_chains/click.py +61 -0
- osn_selenium/instances/sync/action_chains/drag_and_drop.py +45 -0
- osn_selenium/instances/sync/action_chains/hm_keyboard.py +37 -0
- osn_selenium/instances/sync/action_chains/hm_move.py +81 -0
- osn_selenium/instances/sync/action_chains/hm_scroll.py +60 -0
- osn_selenium/instances/sync/action_chains/keyboard.py +55 -0
- osn_selenium/instances/sync/action_chains/move.py +46 -0
- osn_selenium/instances/sync/action_chains/scroll.py +43 -0
- osn_selenium/instances/sync/action_chains/utils.py +30 -0
- osn_selenium/instances/sync/alert.py +69 -0
- osn_selenium/instances/sync/browser.py +72 -0
- osn_selenium/instances/sync/browsing_context.py +193 -0
- osn_selenium/instances/sync/dialog.py +81 -0
- osn_selenium/instances/sync/fedcm.py +92 -0
- osn_selenium/instances/sync/mobile.py +75 -0
- osn_selenium/instances/sync/network.py +90 -0
- osn_selenium/instances/sync/permissions.py +80 -0
- osn_selenium/instances/sync/script.py +77 -0
- osn_selenium/instances/sync/shadow_root.py +113 -0
- osn_selenium/instances/sync/storage.py +91 -0
- osn_selenium/instances/sync/switch_to.py +92 -0
- osn_selenium/instances/sync/web_driver_wait.py +83 -0
- osn_selenium/instances/sync/web_element.py +179 -0
- osn_selenium/instances/sync/web_extension.py +77 -0
- osn_selenium/instances/trio_threads/__init__.py +1 -0
- osn_selenium/instances/trio_threads/action_chains/__init__.py +32 -0
- osn_selenium/instances/trio_threads/action_chains/base.py +88 -0
- osn_selenium/instances/trio_threads/action_chains/click.py +71 -0
- osn_selenium/instances/trio_threads/action_chains/drag_and_drop.py +49 -0
- osn_selenium/instances/trio_threads/action_chains/hm_keyboard.py +41 -0
- osn_selenium/instances/trio_threads/action_chains/hm_move.py +91 -0
- osn_selenium/instances/trio_threads/action_chains/hm_scroll.py +66 -0
- osn_selenium/instances/trio_threads/action_chains/keyboard.py +63 -0
- osn_selenium/instances/trio_threads/action_chains/move.py +52 -0
- osn_selenium/instances/trio_threads/action_chains/scroll.py +49 -0
- osn_selenium/instances/trio_threads/action_chains/utils.py +32 -0
- osn_selenium/instances/trio_threads/alert.py +87 -0
- osn_selenium/instances/trio_threads/browser.py +90 -0
- osn_selenium/instances/trio_threads/browsing_context.py +216 -0
- osn_selenium/instances/trio_threads/dialog.py +99 -0
- osn_selenium/instances/trio_threads/fedcm.py +110 -0
- osn_selenium/instances/trio_threads/mobile.py +93 -0
- osn_selenium/instances/trio_threads/network.py +108 -0
- osn_selenium/instances/trio_threads/permissions.py +102 -0
- osn_selenium/instances/trio_threads/script.py +95 -0
- osn_selenium/instances/trio_threads/shadow_root.py +154 -0
- osn_selenium/instances/trio_threads/storage.py +109 -0
- osn_selenium/instances/trio_threads/switch_to.py +124 -0
- osn_selenium/instances/trio_threads/web_driver_wait.py +101 -0
- osn_selenium/instances/trio_threads/web_element.py +217 -0
- osn_selenium/instances/trio_threads/web_extension.py +99 -0
- osn_selenium/instances/unified/__init__.py +1 -0
- osn_selenium/instances/unified/action_chains/__init__.py +22 -0
- osn_selenium/instances/unified/action_chains/base.py +31 -0
- osn_selenium/instances/unified/action_chains/click.py +27 -0
- osn_selenium/instances/unified/action_chains/drag_and_drop.py +24 -0
- osn_selenium/instances/unified/action_chains/hm_keyboard.py +30 -0
- osn_selenium/instances/unified/action_chains/hm_move.py +66 -0
- osn_selenium/instances/unified/action_chains/hm_scroll.py +79 -0
- osn_selenium/instances/unified/action_chains/keyboard.py +24 -0
- osn_selenium/instances/unified/action_chains/move.py +24 -0
- osn_selenium/instances/unified/action_chains/scroll.py +21 -0
- osn_selenium/instances/unified/action_chains/utils.py +19 -0
- osn_selenium/instances/unified/alert.py +29 -0
- osn_selenium/instances/unified/browser.py +33 -0
- osn_selenium/instances/unified/browsing_context.py +151 -0
- osn_selenium/instances/unified/dialog.py +42 -0
- osn_selenium/instances/unified/fedcm.py +48 -0
- osn_selenium/instances/unified/mobile.py +36 -0
- osn_selenium/instances/unified/network.py +50 -0
- osn_selenium/instances/unified/permissions.py +43 -0
- osn_selenium/instances/unified/script.py +38 -0
- osn_selenium/instances/unified/shadow_root.py +46 -0
- osn_selenium/instances/unified/storage.py +48 -0
- osn_selenium/instances/unified/switch_to.py +49 -0
- osn_selenium/instances/unified/web_driver_wait.py +45 -0
- osn_selenium/instances/unified/web_element.py +145 -0
- osn_selenium/instances/unified/web_extension.py +38 -0
- osn_selenium/javascript/__init__.py +1 -0
- osn_selenium/javascript/_functions.py +63 -0
- osn_selenium/javascript/fingerprint/__init__.py +120 -0
- osn_selenium/javascript/fingerprint/_decorators.py +41 -0
- osn_selenium/javascript/fingerprint/_detect/__init__.py +1 -0
- osn_selenium/javascript/fingerprint/_detect/functions.py +253 -0
- osn_selenium/javascript/fingerprint/_detect/templates.py +128 -0
- osn_selenium/javascript/fingerprint/_functions.py +35 -0
- osn_selenium/javascript/fingerprint/_typehints.py +27 -0
- osn_selenium/javascript/fingerprint/registry/__init__.py +7 -0
- osn_selenium/javascript/fingerprint/registry/_core_functions.py +236 -0
- osn_selenium/javascript/fingerprint/registry/_functions.py +923 -0
- osn_selenium/javascript/fingerprint/registry/_typehints.py +6 -0
- osn_selenium/javascript/fingerprint/registry/_utils.py +6 -0
- osn_selenium/javascript/fingerprint/registry/models.py +41 -0
- osn_selenium/javascript/fingerprint/spoof/__init__.py +1 -0
- osn_selenium/javascript/fingerprint/spoof/_functions.py +172 -0
- osn_selenium/javascript/fingerprint/spoof/_templates.py +134 -0
- osn_selenium/javascript/fingerprint/spoof/_typehints.py +22 -0
- osn_selenium/javascript/fingerprint/spoof/core_rules.py +141 -0
- osn_selenium/javascript/fingerprint/spoof/noise.py +51 -0
- osn_selenium/javascript/fingerprint/spoof/rules.py +313 -0
- osn_selenium/javascript/functions.py +44 -0
- osn_selenium/javascript/models.py +35 -0
- osn_selenium/javascript/scripts/start_fingerprint_detection.js +56 -0
- osn_selenium/models.py +94 -0
- osn_selenium/trio_threads_mixin.py +159 -0
- osn_selenium/webdrivers/_args_helpers.py +181 -0
- osn_selenium/webdrivers/_bridges.py +57 -0
- osn_selenium/webdrivers/_decorators.py +83 -0
- osn_selenium/webdrivers/_executable_tables/__init__.py +1 -0
- osn_selenium/webdrivers/_executable_tables/functions.py +113 -0
- osn_selenium/webdrivers/_executable_tables/models.py +19 -0
- osn_selenium/webdrivers/_typehints.py +10 -0
- osn_selenium/webdrivers/protocols.py +50 -0
- osn_selenium/webdrivers/sync/__init__.py +1 -0
- osn_selenium/webdrivers/sync/blink/__init__.py +124 -0
- osn_selenium/webdrivers/sync/blink/base.py +140 -0
- osn_selenium/webdrivers/sync/blink/casting.py +34 -0
- osn_selenium/webdrivers/sync/blink/features.py +28 -0
- osn_selenium/webdrivers/sync/blink/lifecycle.py +66 -0
- osn_selenium/webdrivers/sync/blink/logging.py +25 -0
- osn_selenium/webdrivers/sync/blink/network.py +28 -0
- osn_selenium/webdrivers/sync/blink/settings.py +63 -0
- osn_selenium/webdrivers/sync/chrome/__init__.py +102 -0
- osn_selenium/webdrivers/sync/chrome/base.py +118 -0
- osn_selenium/webdrivers/sync/chrome/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/chrome/settings.py +58 -0
- osn_selenium/webdrivers/sync/core/__init__.py +100 -0
- osn_selenium/webdrivers/sync/core/actions.py +59 -0
- osn_selenium/webdrivers/sync/core/auth.py +77 -0
- osn_selenium/webdrivers/sync/core/base.py +175 -0
- osn_selenium/webdrivers/sync/core/capture.py +37 -0
- osn_selenium/webdrivers/sync/core/comonents.py +57 -0
- osn_selenium/webdrivers/sync/core/devtools.py +47 -0
- osn_selenium/webdrivers/sync/core/element.py +42 -0
- osn_selenium/webdrivers/sync/core/file.py +40 -0
- osn_selenium/webdrivers/sync/core/lifecycle.py +59 -0
- osn_selenium/webdrivers/sync/core/navigation.py +36 -0
- osn_selenium/webdrivers/sync/core/script.py +53 -0
- osn_selenium/webdrivers/sync/core/settings.py +35 -0
- osn_selenium/webdrivers/sync/core/storage.py +48 -0
- osn_selenium/webdrivers/sync/core/timeouts.py +59 -0
- osn_selenium/webdrivers/sync/core/window.py +99 -0
- osn_selenium/webdrivers/sync/edge/__init__.py +102 -0
- osn_selenium/webdrivers/sync/edge/base.py +114 -0
- osn_selenium/webdrivers/sync/edge/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/edge/settings.py +58 -0
- osn_selenium/webdrivers/sync/yandex/__init__.py +102 -0
- osn_selenium/webdrivers/sync/yandex/base.py +111 -0
- osn_selenium/webdrivers/sync/yandex/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/yandex/settings.py +58 -0
- osn_selenium/webdrivers/trio_threads/__init__.py +1 -0
- osn_selenium/webdrivers/trio_threads/blink/__init__.py +134 -0
- osn_selenium/webdrivers/trio_threads/blink/base.py +143 -0
- osn_selenium/webdrivers/trio_threads/blink/casting.py +35 -0
- osn_selenium/webdrivers/trio_threads/blink/features.py +29 -0
- osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +66 -0
- osn_selenium/webdrivers/trio_threads/blink/logging.py +26 -0
- osn_selenium/webdrivers/trio_threads/blink/network.py +29 -0
- osn_selenium/webdrivers/trio_threads/blink/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/chrome/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/chrome/base.py +119 -0
- osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/chrome/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/core/__init__.py +115 -0
- osn_selenium/webdrivers/trio_threads/core/actions.py +72 -0
- osn_selenium/webdrivers/trio_threads/core/auth.py +88 -0
- osn_selenium/webdrivers/trio_threads/core/base.py +199 -0
- osn_selenium/webdrivers/trio_threads/core/capture.py +38 -0
- osn_selenium/webdrivers/trio_threads/core/comonents.py +92 -0
- osn_selenium/webdrivers/trio_threads/core/devtools.py +53 -0
- osn_selenium/webdrivers/trio_threads/core/element.py +58 -0
- osn_selenium/webdrivers/trio_threads/core/file.py +45 -0
- osn_selenium/webdrivers/trio_threads/core/lifecycle.py +60 -0
- osn_selenium/webdrivers/trio_threads/core/navigation.py +41 -0
- osn_selenium/webdrivers/trio_threads/core/script.py +59 -0
- osn_selenium/webdrivers/trio_threads/core/settings.py +36 -0
- osn_selenium/webdrivers/trio_threads/core/storage.py +54 -0
- osn_selenium/webdrivers/trio_threads/core/timeouts.py +60 -0
- osn_selenium/webdrivers/trio_threads/core/window.py +105 -0
- osn_selenium/webdrivers/trio_threads/edge/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/edge/base.py +115 -0
- osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/edge/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/yandex/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/yandex/base.py +112 -0
- osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/yandex/settings.py +63 -0
- osn_selenium/webdrivers/unified/__init__.py +1 -0
- osn_selenium/webdrivers/unified/blink/__init__.py +1 -0
- osn_selenium/webdrivers/unified/blink/base.py +135 -0
- osn_selenium/webdrivers/unified/blink/casting.py +30 -0
- osn_selenium/webdrivers/unified/blink/features.py +22 -0
- osn_selenium/webdrivers/unified/blink/lifecycle.py +114 -0
- osn_selenium/webdrivers/unified/blink/logging.py +18 -0
- osn_selenium/webdrivers/unified/blink/network.py +22 -0
- osn_selenium/webdrivers/unified/blink/settings.py +86 -0
- osn_selenium/webdrivers/unified/chrome/__init__.py +1 -0
- osn_selenium/webdrivers/unified/chrome/base.py +58 -0
- osn_selenium/webdrivers/unified/chrome/lifecycle.py +88 -0
- osn_selenium/webdrivers/unified/chrome/settings.py +48 -0
- osn_selenium/webdrivers/unified/core/__init__.py +1 -0
- osn_selenium/webdrivers/unified/core/actions.py +43 -0
- osn_selenium/webdrivers/unified/core/auth.py +70 -0
- osn_selenium/webdrivers/unified/core/base.py +139 -0
- osn_selenium/webdrivers/unified/core/capture.py +32 -0
- osn_selenium/webdrivers/unified/core/components.py +32 -0
- osn_selenium/webdrivers/unified/core/devtools.py +35 -0
- osn_selenium/webdrivers/unified/core/element.py +24 -0
- osn_selenium/webdrivers/unified/core/file.py +35 -0
- osn_selenium/webdrivers/unified/core/lifecycle.py +84 -0
- osn_selenium/webdrivers/unified/core/navigation.py +31 -0
- osn_selenium/webdrivers/unified/core/script.py +32 -0
- osn_selenium/webdrivers/unified/core/settings.py +44 -0
- osn_selenium/webdrivers/unified/core/storage.py +37 -0
- osn_selenium/webdrivers/unified/core/timeouts.py +56 -0
- osn_selenium/webdrivers/unified/core/window.py +135 -0
- osn_selenium/webdrivers/unified/edge/__init__.py +1 -0
- osn_selenium/webdrivers/unified/edge/base.py +56 -0
- osn_selenium/webdrivers/unified/edge/lifecycle.py +88 -0
- osn_selenium/webdrivers/unified/edge/settings.py +48 -0
- osn_selenium/webdrivers/unified/yandex/__init__.py +1 -0
- osn_selenium/webdrivers/unified/yandex/base.py +58 -0
- osn_selenium/webdrivers/unified/yandex/lifecycle.py +58 -0
- osn_selenium/webdrivers/unified/yandex/settings.py +48 -0
- osn_selenium-1.1.0.dist-info/METADATA +252 -0
- osn_selenium-1.1.0.dist-info/RECORD +615 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/WHEEL +1 -1
- osn_selenium/captcha_workers/__init__.py +0 -26
- osn_selenium/dev_tools/_types.py +0 -22
- osn_selenium/dev_tools/errors.py +0 -89
- osn_selenium/dev_tools/logger.py +0 -558
- osn_selenium/dev_tools/manager.py +0 -1551
- osn_selenium/dev_tools/utils.py +0 -509
- osn_selenium/errors.py +0 -16
- osn_selenium/types.py +0 -118
- osn_selenium/webdrivers/BaseDriver/_utils.py +0 -37
- osn_selenium/webdrivers/BaseDriver/protocols.py +0 -2135
- osn_selenium/webdrivers/BaseDriver/trio_wrapper.py +0 -71
- osn_selenium/webdrivers/BaseDriver/webdriver.py +0 -2626
- osn_selenium/webdrivers/Blink/protocols.py +0 -330
- osn_selenium/webdrivers/Blink/webdriver.py +0 -637
- osn_selenium/webdrivers/Chrome/protocols.py +0 -228
- osn_selenium/webdrivers/Chrome/webdriver.py +0 -394
- osn_selenium/webdrivers/Edge/protocols.py +0 -228
- osn_selenium/webdrivers/Edge/webdriver.py +0 -394
- osn_selenium/webdrivers/Yandex/protocols.py +0 -211
- osn_selenium/webdrivers/Yandex/webdriver.py +0 -350
- osn_selenium/webdrivers/_functions.py +0 -504
- osn_selenium/webdrivers/types.py +0 -390
- osn_selenium-0.0.0.dist-info/METADATA +0 -710
- osn_selenium-0.0.0.dist-info/RECORD +0 -57
- /osn_selenium/{webdrivers/BaseDriver → abstract}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Blink → abstract/executors}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Chrome → abstract/instances}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Edge → abstract/webdriver}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Yandex → dev_tools/logger}/__init__.py +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/check_element_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_document_scroll_size.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_css.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_rect_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_random_element_point_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_position.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_rect.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_size.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/open_new_tab.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/stop_window_loading.js +0 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
from pydantic import Field
|
|
2
|
+
from typing import (
|
|
3
|
+
Dict,
|
|
4
|
+
Literal,
|
|
5
|
+
Optional
|
|
6
|
+
)
|
|
7
|
+
from osn_selenium.javascript._functions import convert_to_js_value
|
|
8
|
+
from osn_selenium.javascript.fingerprint._functions import add_code_level
|
|
9
|
+
from osn_selenium.javascript.fingerprint.spoof.noise import (
|
|
10
|
+
RandomNoise,
|
|
11
|
+
StaticNoise
|
|
12
|
+
)
|
|
13
|
+
from osn_selenium.javascript.fingerprint.spoof._typehints import (
|
|
14
|
+
RANDOM_VALUE_TYPEHINT
|
|
15
|
+
)
|
|
16
|
+
from osn_selenium.javascript.fingerprint.spoof.core_rules import (
|
|
17
|
+
ArrayRule,
|
|
18
|
+
BaseRule,
|
|
19
|
+
RandomRule
|
|
20
|
+
)
|
|
21
|
+
from osn_selenium.javascript.fingerprint.spoof._functions import (
|
|
22
|
+
get_noise_js,
|
|
23
|
+
get_random_expression_js
|
|
24
|
+
)
|
|
25
|
+
from osn_selenium.javascript.fingerprint.spoof._templates import (
|
|
26
|
+
CUSTOM_RULE,
|
|
27
|
+
PERSISTED_RANDOM_ITEM_NOISE,
|
|
28
|
+
PERSISTED_RANDOM_ITEM_SET,
|
|
29
|
+
PERSISTENCE_CHECK_NOISE,
|
|
30
|
+
PERSISTENCE_CHECK_RETURN,
|
|
31
|
+
PERSISTENCE_SAVE_NOISE,
|
|
32
|
+
PERSISTENCE_SAVE_RESULT,
|
|
33
|
+
RANDOM_ITEM_NOISE,
|
|
34
|
+
RANDOM_ITEM_SET,
|
|
35
|
+
STATIC_ITEM_NOISE,
|
|
36
|
+
STATIC_ITEM_SET
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
"CustomRule",
|
|
42
|
+
"RandomArrayNoiseRule",
|
|
43
|
+
"RandomArraySetRule",
|
|
44
|
+
"RandomItemNoiseRule",
|
|
45
|
+
"RandomItemSetRule",
|
|
46
|
+
"StaticArrayNoiseRule",
|
|
47
|
+
"StaticArraySetRule",
|
|
48
|
+
"StaticItemNoiseRule",
|
|
49
|
+
"StaticItemSetRule"
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class StaticItemSetRule(BaseRule):
|
|
54
|
+
"""
|
|
55
|
+
Rule to replace a value with a static constant.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
mode: Literal["static_item_set"] = "static_item_set"
|
|
59
|
+
|
|
60
|
+
def generate_js(self, path: str) -> str:
|
|
61
|
+
"""
|
|
62
|
+
Generates JS to return a fixed value.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
path (str): The object path.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
str: The generated JS.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
return STATIC_ITEM_SET.format(result_value=convert_to_js_value(self.value))
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class StaticItemNoiseRule(BaseRule):
|
|
75
|
+
"""
|
|
76
|
+
Rule to apply static noise to a value.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
mode: Literal["static_item_noise"] = "static_item_noise"
|
|
80
|
+
value: StaticNoise
|
|
81
|
+
|
|
82
|
+
def generate_js(self, path: str) -> str:
|
|
83
|
+
"""
|
|
84
|
+
Generates JS to apply calculated static noise.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
path (str): The object path.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
str: The generated JS.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
expression = get_noise_js(
|
|
94
|
+
target="originalValue",
|
|
95
|
+
noise=str(self.value.value),
|
|
96
|
+
operation=self.value.operation,
|
|
97
|
+
round_result=self.value.round,
|
|
98
|
+
precision=self.value.precision,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
return STATIC_ITEM_NOISE.format(math_expression=expression)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class StaticArraySetRule(ArrayRule):
|
|
105
|
+
"""
|
|
106
|
+
Rule to replace elements in an array with static values.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
mode: Literal["static_array_set"] = "static_array_set"
|
|
110
|
+
|
|
111
|
+
def generate_js(self, path: str) -> str:
|
|
112
|
+
"""
|
|
113
|
+
Generates JS to loop through array and set static values.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
path (str): The object path.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
str: The generated JS.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
def get_expr(item):
|
|
123
|
+
return convert_to_js_value(item)
|
|
124
|
+
|
|
125
|
+
return self._generate_array_js(get_expr)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class StaticArrayNoiseRule(ArrayRule):
|
|
129
|
+
"""
|
|
130
|
+
Rule to apply static noise to elements in an array.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
mode: Literal["static_array_noise"] = "static_array_noise"
|
|
134
|
+
value_by_channel: Dict[int, StaticNoise] = Field(default_factory=dict)
|
|
135
|
+
|
|
136
|
+
def generate_js(self, path: str) -> str:
|
|
137
|
+
"""
|
|
138
|
+
Generates JS to loop through array and apply static noise.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
path (str): The object path.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
str: The generated JS.
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
def get_expr(item):
|
|
148
|
+
return get_noise_js(
|
|
149
|
+
target="dataArray[i]",
|
|
150
|
+
noise=str(item.value),
|
|
151
|
+
operation=item.operation,
|
|
152
|
+
round_result=item.round,
|
|
153
|
+
precision=item.precision,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
return self._generate_array_js(get_expr)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class RandomItemSetRule(RandomRule):
|
|
160
|
+
"""
|
|
161
|
+
Rule to replace a value with a randomly generated one.
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
mode: Literal["random_item_set"] = "random_item_set"
|
|
165
|
+
|
|
166
|
+
def generate_js(self, path: str) -> str:
|
|
167
|
+
"""
|
|
168
|
+
Generates JS to return a random value, optionally persisted.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
path (str): The object path.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
str: The generated JS.
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
if self.persist:
|
|
178
|
+
storage_key = f"prop_{path.replace('.', '_')}"
|
|
179
|
+
|
|
180
|
+
return PERSISTED_RANDOM_ITEM_SET.format(
|
|
181
|
+
persistence_check_code=add_code_level(code=PERSISTENCE_CHECK_RETURN.format(storage_key=storage_key), num=1),
|
|
182
|
+
calculation_expression=get_random_expression_js(self.value),
|
|
183
|
+
persistence_save_code=PERSISTENCE_SAVE_RESULT.format(storage_key=storage_key)
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
return RANDOM_ITEM_SET.format(calculation_expression=get_random_expression_js(self.value))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class RandomItemNoiseRule(RandomRule):
|
|
190
|
+
"""
|
|
191
|
+
Rule to apply random noise to a value.
|
|
192
|
+
"""
|
|
193
|
+
|
|
194
|
+
mode: Literal["random_item_noise"] = "random_item_noise"
|
|
195
|
+
|
|
196
|
+
def generate_js(self, path: str) -> str:
|
|
197
|
+
"""
|
|
198
|
+
Generates JS to apply random noise, optionally persisted.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
path (str): The object path.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
str: The generated JS.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
storage_key = f"prop_{path.replace('.', '_')}"
|
|
208
|
+
|
|
209
|
+
math_expression = get_noise_js(
|
|
210
|
+
target="originalValue",
|
|
211
|
+
noise="noiseValue",
|
|
212
|
+
operation=self.value.operation,
|
|
213
|
+
round_result=self.value.round,
|
|
214
|
+
precision=self.value.precision,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
if self.persist:
|
|
218
|
+
return PERSISTED_RANDOM_ITEM_NOISE.format(
|
|
219
|
+
persistence_check_code=add_code_level(
|
|
220
|
+
code=PERSISTENCE_CHECK_NOISE.format(storage_key=storage_key, math_expression_with_noise=math_expression),
|
|
221
|
+
num=1
|
|
222
|
+
),
|
|
223
|
+
calculation_expression=get_random_expression_js(self.value.value),
|
|
224
|
+
persistence_save_code=PERSISTENCE_SAVE_NOISE.format(storage_key=storage_key),
|
|
225
|
+
math_expression=math_expression
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
return RANDOM_ITEM_NOISE.format(
|
|
229
|
+
calculation_expression=get_random_expression_js(self.value.value),
|
|
230
|
+
math_expression=math_expression
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
class RandomArraySetRule(ArrayRule):
|
|
235
|
+
"""
|
|
236
|
+
Rule to replace elements in an array with random values.
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
mode: Literal["random_array_set"] = "random_array_set"
|
|
240
|
+
value: Optional[RANDOM_VALUE_TYPEHINT]
|
|
241
|
+
value_by_channel: Dict[int, RANDOM_VALUE_TYPEHINT] = Field(default_factory=dict)
|
|
242
|
+
|
|
243
|
+
def generate_js(self, path: str) -> str:
|
|
244
|
+
"""
|
|
245
|
+
Generates JS to loop through array and set random values.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
path (str): The object path.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
str: The generated JS.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
def get_expr(item):
|
|
255
|
+
return get_random_expression_js(item)
|
|
256
|
+
|
|
257
|
+
return self._generate_array_js(get_expr)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class RandomArrayNoiseRule(ArrayRule):
|
|
261
|
+
"""
|
|
262
|
+
Rule to apply random noise to elements in an array.
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
mode: Literal["random_array_noise"] = "random_array_noise"
|
|
266
|
+
value: Optional[RandomNoise]
|
|
267
|
+
value_by_channel: Dict[int, RandomNoise] = Field(default_factory=dict)
|
|
268
|
+
|
|
269
|
+
def generate_js(self, path: str) -> str:
|
|
270
|
+
"""
|
|
271
|
+
Generates JS to loop through array and apply random noise.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
path (str): The object path.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
str: The generated JS.
|
|
278
|
+
"""
|
|
279
|
+
|
|
280
|
+
def get_expr(item):
|
|
281
|
+
noise_expr = get_random_expression_js(item.value)
|
|
282
|
+
|
|
283
|
+
return get_noise_js(
|
|
284
|
+
target="dataArray[i]",
|
|
285
|
+
noise=noise_expr,
|
|
286
|
+
operation=item.operation,
|
|
287
|
+
round_result=item.round,
|
|
288
|
+
precision=item.precision,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
return self._generate_array_js(get_expr)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
class CustomRule(BaseRule):
|
|
295
|
+
"""
|
|
296
|
+
Rule to apply custom JavaScript code.
|
|
297
|
+
"""
|
|
298
|
+
|
|
299
|
+
mode: Literal["custom"] = "custom"
|
|
300
|
+
value: str
|
|
301
|
+
|
|
302
|
+
def generate_js(self, path: str) -> str:
|
|
303
|
+
"""
|
|
304
|
+
Generates the custom JS injection.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
path (str): The object path.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
str: The generated JS.
|
|
311
|
+
"""
|
|
312
|
+
|
|
313
|
+
return CUSTOM_RULE.format(custom_javascript_code=self.value)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import pathlib
|
|
2
|
+
from typing import Optional
|
|
3
|
+
from pydantic import ValidationError
|
|
4
|
+
from osn_selenium.javascript.models import JS_Scripts
|
|
5
|
+
from osn_selenium.exceptions.javascript import (
|
|
6
|
+
JavaScriptResourceError
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
__all__ = ["get_js_scripts"]
|
|
11
|
+
|
|
12
|
+
_CACHED_JS_SCRIPTS: Optional[JS_Scripts] = None
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_js_scripts() -> JS_Scripts:
|
|
16
|
+
"""
|
|
17
|
+
Reads JavaScript scripts from files and returns them in a JS_Scripts object.
|
|
18
|
+
|
|
19
|
+
This function locates all `.js` files within the 'scripts' directory, which is expected
|
|
20
|
+
to be located in the same parent directory as this module. It reads the content of each
|
|
21
|
+
JavaScript file using UTF-8 encoding and stores these scripts in a `JS_Scripts` model.
|
|
22
|
+
The filenames (without the `.js` extension) are used as keys.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
JS_Scripts: An object containing the content of each JavaScript file as attributes.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
global _CACHED_JS_SCRIPTS
|
|
29
|
+
|
|
30
|
+
if _CACHED_JS_SCRIPTS is None:
|
|
31
|
+
scripts = {}
|
|
32
|
+
path_to_js_scripts = pathlib.Path(__file__).parent / "scripts"
|
|
33
|
+
|
|
34
|
+
for script_file in path_to_js_scripts.iterdir():
|
|
35
|
+
scripts[script_file.stem] = script_file.read_text(encoding="utf-8")
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
_CACHED_JS_SCRIPTS = JS_Scripts.model_validate(scripts)
|
|
39
|
+
except ValidationError as exception:
|
|
40
|
+
missing_fields = [error["loc"][0] for error in exception.errors()]
|
|
41
|
+
|
|
42
|
+
raise JavaScriptResourceError(missing_script=missing_fields)
|
|
43
|
+
|
|
44
|
+
return _CACHED_JS_SCRIPTS
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from osn_selenium._base_models import DictModel
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
__all__ = ["JS_Scripts"]
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class JS_Scripts(DictModel):
|
|
8
|
+
"""
|
|
9
|
+
Represents a collection of JavaScript script snippets for use with WebDriver.
|
|
10
|
+
|
|
11
|
+
Attributes:
|
|
12
|
+
check_element_in_viewport (str): JS to check if element is in the viewport.
|
|
13
|
+
get_document_scroll_size (str): JS to get total scrollable dimensions.
|
|
14
|
+
get_element_css (str): JS to get computed CSS styles of an element.
|
|
15
|
+
get_element_rect_in_viewport (str): JS to get element bounds in viewport.
|
|
16
|
+
get_random_element_point_in_viewport (str): JS to get a random visible point in element.
|
|
17
|
+
get_viewport_position (str): JS to get scroll position of viewport.
|
|
18
|
+
get_viewport_rect (str): JS to get viewport scroll offset and dimensions.
|
|
19
|
+
get_viewport_size (str): JS to get dimensions of the viewport.
|
|
20
|
+
open_new_tab (str): JS to open a new tab.
|
|
21
|
+
start_fingerprint_detection (str): JS to initialize fingerprint detection hooks.
|
|
22
|
+
stop_window_loading (str): JS to stop the page from loading.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
check_element_in_viewport: str
|
|
26
|
+
get_document_scroll_size: str
|
|
27
|
+
get_element_css: str
|
|
28
|
+
get_element_rect_in_viewport: str
|
|
29
|
+
get_random_element_point_in_viewport: str
|
|
30
|
+
get_viewport_position: str
|
|
31
|
+
get_viewport_rect: str
|
|
32
|
+
get_viewport_size: str
|
|
33
|
+
open_new_tab: str
|
|
34
|
+
start_fingerprint_detection: str
|
|
35
|
+
stop_window_loading: str
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
function start_fingerprint_detection(settings) {
|
|
2
|
+
const CONFIG = {
|
|
3
|
+
BINDING: '__osn_fingerprint_report__',
|
|
4
|
+
SILENT_ERRORS: true,
|
|
5
|
+
EVENTS_OPTIMIZATION: settings.optimize_events
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const MODIFIERS = {};
|
|
9
|
+
__MODIFIERS_PLACEHOLDER__
|
|
10
|
+
|
|
11
|
+
const STORAGE = new Map();
|
|
12
|
+
|
|
13
|
+
const hookedRegistry = new WeakSet();
|
|
14
|
+
const sentEvents = new Set();
|
|
15
|
+
|
|
16
|
+
function guard(fn, fallback = undefined) {
|
|
17
|
+
try {
|
|
18
|
+
return fn();
|
|
19
|
+
} catch (e) {
|
|
20
|
+
if (!CONFIG.SILENT_ERRORS) console.error('FingerprintHook Error:', e);
|
|
21
|
+
return fallback;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const Reporter = {
|
|
26
|
+
send(api, target, method) {
|
|
27
|
+
guard(() => {
|
|
28
|
+
if (CONFIG.EVENTS_OPTIMIZATION) {
|
|
29
|
+
const key = `${api}:${target}:${method}`;
|
|
30
|
+
|
|
31
|
+
if (sentEvents.has(key)) return;
|
|
32
|
+
|
|
33
|
+
sentEvents.add(key);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const reportFn = window[CONFIG.BINDING];
|
|
37
|
+
|
|
38
|
+
if (typeof reportFn === 'function') {
|
|
39
|
+
const stack = (new Error()).stack;
|
|
40
|
+
|
|
41
|
+
const payload = JSON.stringify({
|
|
42
|
+
api: api,
|
|
43
|
+
used_method: `${target}.${method}`,
|
|
44
|
+
stacktrace: stack
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
reportFn(payload);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
__DETECTION_PLACEHOLDER__
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
start_fingerprint_detection(__SETTINGS__PLACEHOLDER__);
|
osn_selenium/models.py
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from typing import Self
|
|
2
|
+
from osn_selenium._base_models import DictModel
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
__all__ = ["Point", "Position", "Rectangle", "Size", "WindowRect"]
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class WindowRect(DictModel):
|
|
9
|
+
"""
|
|
10
|
+
Defines a window's geometry with default values relative to screen size.
|
|
11
|
+
|
|
12
|
+
The default values position the window in the center of the screen,
|
|
13
|
+
occupying a significant portion of it.
|
|
14
|
+
|
|
15
|
+
Attributes:
|
|
16
|
+
x (int): The x-coordinate of the window's top-left corner. Defaults to 100.
|
|
17
|
+
y (int): The y-coordinate of the window's top-left corner. Defaults to 100.
|
|
18
|
+
width (int): The width of the window. Defaults to 400.
|
|
19
|
+
height (int): The height of the window. Defaults to 400.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
x: int = 100
|
|
23
|
+
y: int = 100
|
|
24
|
+
width: int = 1024
|
|
25
|
+
height: int = 768
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Size(DictModel):
|
|
29
|
+
"""
|
|
30
|
+
Represents a 2D size.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
width (int): The width dimension.
|
|
34
|
+
height (int): The height dimension.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
width: int
|
|
38
|
+
height: int
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class Rectangle(DictModel):
|
|
42
|
+
"""
|
|
43
|
+
Defines a rectangle by its top-left corner and dimensions.
|
|
44
|
+
|
|
45
|
+
Attributes:
|
|
46
|
+
x (int): The x-coordinate of the top-left corner.
|
|
47
|
+
y (int): The y-coordinate of the top-left corner.
|
|
48
|
+
width (int): The width of the rectangle.
|
|
49
|
+
height (int): The height of the rectangle.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
x: int
|
|
53
|
+
y: int
|
|
54
|
+
width: int
|
|
55
|
+
height: int
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class Position(DictModel):
|
|
59
|
+
"""
|
|
60
|
+
Represents a 2D coordinate.
|
|
61
|
+
|
|
62
|
+
Attributes:
|
|
63
|
+
x (int): The x-coordinate.
|
|
64
|
+
y (int): The y-coordinate.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
x: int
|
|
68
|
+
y: int
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class Point:
|
|
72
|
+
"""
|
|
73
|
+
Represents a 2D point with integer coordinates (x, y).
|
|
74
|
+
|
|
75
|
+
Attributes:
|
|
76
|
+
x (int): The horizontal coordinate.
|
|
77
|
+
y (int): The vertical coordinate.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
def __init__(self, x: int, y: int):
|
|
81
|
+
self.x: int = x
|
|
82
|
+
self.y: int = y
|
|
83
|
+
|
|
84
|
+
def __repr__(self) -> str:
|
|
85
|
+
return self.__str__()
|
|
86
|
+
|
|
87
|
+
def __str__(self) -> str:
|
|
88
|
+
return f"Point(x={self.x}, y={self.y})"
|
|
89
|
+
|
|
90
|
+
def __eq__(self, other: Self) -> bool:
|
|
91
|
+
return self.x == other.x and self.y == other.y
|
|
92
|
+
|
|
93
|
+
def __ne__(self, other: Self) -> bool:
|
|
94
|
+
return not self.__eq__(other)
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import trio
|
|
3
|
+
from contextlib import asynccontextmanager
|
|
4
|
+
from typing import (
|
|
5
|
+
Any,
|
|
6
|
+
AsyncContextManager,
|
|
7
|
+
AsyncIterator,
|
|
8
|
+
Callable,
|
|
9
|
+
ContextManager,
|
|
10
|
+
Coroutine,
|
|
11
|
+
ParamSpec,
|
|
12
|
+
TypeVar
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = ["TrioThreadMixin"]
|
|
17
|
+
|
|
18
|
+
_METHOD_INPUT = ParamSpec("_METHOD_INPUT")
|
|
19
|
+
_METHOD_OUTPUT = TypeVar("_METHOD_OUTPUT")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TrioThreadMixin:
|
|
23
|
+
"""
|
|
24
|
+
Provides utilities for running synchronous functions in a Trio event loop
|
|
25
|
+
with a controlled concurrency, ensuring thread safety and resource limits.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, lock: trio.Lock, limiter: trio.CapacityLimiter) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Initializes the TrioThreadMixin with a Trio Lock and CapacityLimiter.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
lock (trio.Lock): A Trio Lock for synchronization.
|
|
34
|
+
limiter (trio.CapacityLimiter): A limiter to control thread pool concurrency.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
self._lock = lock
|
|
38
|
+
self._capacity_limiter = limiter
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def capacity_limiter(self) -> trio.CapacityLimiter:
|
|
42
|
+
"""
|
|
43
|
+
The Trio CapacityLimiter used for concurrency control.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
trio.CapacityLimiter: The limiter instance.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
return self._capacity_limiter
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def lock(self) -> trio.Lock:
|
|
53
|
+
"""
|
|
54
|
+
The Trio Lock used for synchronization.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
trio.Lock: The lock instance.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
return self._lock
|
|
61
|
+
|
|
62
|
+
def sync_to_trio(
|
|
63
|
+
self,
|
|
64
|
+
sync_function: Callable[_METHOD_INPUT, _METHOD_OUTPUT],
|
|
65
|
+
lock: bool = True,
|
|
66
|
+
) -> Callable[_METHOD_INPUT, Coroutine[Any, Any, _METHOD_OUTPUT]]:
|
|
67
|
+
"""
|
|
68
|
+
Wraps a synchronous function to run within a Trio thread pool using a lock and limiter.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
sync_function (Callable[_METHOD_INPUT, _METHOD_OUTPUT]): The synchronous function to wrap.
|
|
72
|
+
lock (bool): Whether to use the internal lock for synchronization.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Callable[_METHOD_INPUT, Coroutine[Any, Any, _METHOD_OUTPUT]]: An async wrapper for the sync function.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
async def wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
79
|
+
"""
|
|
80
|
+
Internal async wrapper for the synchronous function.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
*args (_METHOD_INPUT.args): Positional arguments for the sync function.
|
|
84
|
+
**kwargs (_METHOD_INPUT.kwargs): Keyword arguments for the sync function.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
_METHOD_OUTPUT: The result of the synchronous function execution.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
def function_with_kwargs(*args_) -> _METHOD_OUTPUT:
|
|
91
|
+
"""
|
|
92
|
+
Helper to pass keyword arguments to trio.to_thread.run_sync.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
*args_: Positional arguments passed from the outer scope.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
_METHOD_OUTPUT: Result of the original sync function.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
return sync_function(*args_, **kwargs)
|
|
102
|
+
|
|
103
|
+
if lock:
|
|
104
|
+
async with self._lock:
|
|
105
|
+
result = await trio.to_thread.run_sync(function_with_kwargs, *args, limiter=self._capacity_limiter)
|
|
106
|
+
else:
|
|
107
|
+
result = await trio.to_thread.run_sync(function_with_kwargs, *args, limiter=self._capacity_limiter)
|
|
108
|
+
|
|
109
|
+
return result
|
|
110
|
+
|
|
111
|
+
return wrapper
|
|
112
|
+
|
|
113
|
+
def sync_to_trio_context(
|
|
114
|
+
self,
|
|
115
|
+
context_manager_factory: Callable[_METHOD_INPUT, ContextManager[_METHOD_OUTPUT]],
|
|
116
|
+
lock: bool = True,
|
|
117
|
+
) -> Callable[_METHOD_INPUT, AsyncContextManager[_METHOD_OUTPUT]]:
|
|
118
|
+
"""
|
|
119
|
+
Converts a synchronous context manager factory to an asynchronous Trio-compatible context manager.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
context_manager_factory (Callable[_METHOD_INPUT, ContextManager[_METHOD_OUTPUT]]): A factory function returning a context manager.
|
|
123
|
+
lock (bool): Whether to use the internal lock for synchronization.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Callable[_METHOD_INPUT, AsyncContextManager[_METHOD_OUTPUT]]: An async function returning an async context manager.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
@asynccontextmanager
|
|
130
|
+
async def wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> AsyncIterator[_METHOD_OUTPUT]:
|
|
131
|
+
"""
|
|
132
|
+
Internal async context manager wrapper.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
*args (_METHOD_INPUT.args): Positional arguments for the factory.
|
|
136
|
+
**kwargs (_METHOD_INPUT.kwargs): Keyword arguments for the factory.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
AsyncIterator[_METHOD_OUTPUT]: An async iterator yielding the context resource.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
sync_context_manager = await self.sync_to_trio(sync_function=context_manager_factory, lock=lock)(*args, **kwargs)
|
|
143
|
+
|
|
144
|
+
enter_ = self.sync_to_trio(sync_function=sync_context_manager.__enter__, lock=lock)
|
|
145
|
+
exit_ = self.sync_to_trio(sync_function=sync_context_manager.__exit__, lock=lock)
|
|
146
|
+
|
|
147
|
+
try:
|
|
148
|
+
result = await enter_()
|
|
149
|
+
|
|
150
|
+
yield result
|
|
151
|
+
except Exception as e:
|
|
152
|
+
exc_type, exc_val, exc_tb = sys.exc_info()
|
|
153
|
+
|
|
154
|
+
if not await exit_(exc_type, exc_val, exc_tb):
|
|
155
|
+
raise e
|
|
156
|
+
else:
|
|
157
|
+
await exit_(None, None, None)
|
|
158
|
+
|
|
159
|
+
return wrapper
|