osn-selenium 0.0.0__py3-none-any.whl → 1.0.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/_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/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 +140 -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 +32 -0
- osn_selenium/dev_tools/_validators.py +227 -0
- osn_selenium/dev_tools/_wrappers.py +95 -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 +226 -0
- osn_selenium/dev_tools/logger/models.py +232 -0
- osn_selenium/dev_tools/logger/target.py +258 -0
- osn_selenium/dev_tools/manager/__init__.py +16 -0
- osn_selenium/dev_tools/manager/base.py +147 -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 +135 -0
- osn_selenium/dev_tools/target/__init__.py +16 -0
- osn_selenium/dev_tools/target/base.py +438 -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 +179 -0
- osn_selenium/dev_tools/target/logging.py +155 -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/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/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/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 +108 -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} +165 -243
- osn_selenium/{webdrivers/Blink/flags.py → flags/blink.py} +133 -371
- 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 +26 -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 +91 -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 +26 -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 +123 -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 +139 -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 +114 -0
- osn_selenium/webdrivers/sync/blink/base.py +128 -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 +67 -0
- osn_selenium/webdrivers/sync/chrome/base.py +106 -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 +91 -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 +167 -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 +67 -0
- osn_selenium/webdrivers/sync/edge/base.py +102 -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 +67 -0
- osn_selenium/webdrivers/sync/yandex/base.py +99 -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 +124 -0
- osn_selenium/webdrivers/trio_threads/blink/base.py +133 -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 +81 -0
- osn_selenium/webdrivers/trio_threads/chrome/base.py +107 -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 +109 -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 +191 -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 +81 -0
- osn_selenium/webdrivers/trio_threads/edge/base.py +103 -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 +81 -0
- osn_selenium/webdrivers/trio_threads/yandex/base.py +100 -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 +131 -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 +54 -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 +132 -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 +52 -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 +54 -0
- osn_selenium/webdrivers/unified/yandex/lifecycle.py +58 -0
- osn_selenium/webdrivers/unified/yandex/settings.py +48 -0
- osn_selenium-1.0.0.dist-info/METADATA +239 -0
- osn_selenium-1.0.0.dist-info/RECORD +608 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.0.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.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from typing import List, TYPE_CHECKING
|
|
3
|
+
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
4
|
+
from osn_selenium.dev_tools.target.logging import LoggingMixin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
__all__ = ["EventHandlersMixin"]
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from osn_selenium.dev_tools.domains.abstract import (AbstractDomainSettings, AbstractEventSettings)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class EventHandlersMixin(LoggingMixin):
|
|
14
|
+
"""
|
|
15
|
+
Mixin for handling generic DevTools domain events.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
async def _run_event_handler(
|
|
19
|
+
self,
|
|
20
|
+
domain_handler_ready_event: trio.Event,
|
|
21
|
+
event_config: "AbstractEventSettings"
|
|
22
|
+
):
|
|
23
|
+
"""
|
|
24
|
+
Runs a specific event handler listener loop.
|
|
25
|
+
|
|
26
|
+
Listens for events of the type specified in `event_config` and invokes the configured `handle_function`.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
domain_handler_ready_event (trio.Event): Event to signal that this specific handler is ready.
|
|
30
|
+
event_config (AbstractEventSettings): Configuration for the specific event.
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
CDPEndExceptions: If connection issues occur.
|
|
34
|
+
BaseException: If initialization fails.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
await self.log_cdp_step(message=f"Event handler '{event_config.class_to_use_path}' starting.")
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
receiver_channel: trio.MemoryReceiveChannel = self.cdp_session.listen(
|
|
41
|
+
self.devtools_package.get(event_config.class_to_use_path),
|
|
42
|
+
buffer_size=event_config.listen_buffer_size
|
|
43
|
+
)
|
|
44
|
+
channel_stopped_event = trio.Event()
|
|
45
|
+
|
|
46
|
+
self._events_receive_channels[event_config.class_to_use_path] = (receiver_channel, channel_stopped_event)
|
|
47
|
+
|
|
48
|
+
domain_handler_ready_event.set()
|
|
49
|
+
handler = event_config.handle_function
|
|
50
|
+
except CDPEndExceptions as error:
|
|
51
|
+
raise error
|
|
52
|
+
except BaseException as error:
|
|
53
|
+
await self.log_cdp_error(error=error)
|
|
54
|
+
raise error
|
|
55
|
+
|
|
56
|
+
await self.log_cdp_step(message=f"Event handler '{event_config.class_to_use_path}' started.")
|
|
57
|
+
|
|
58
|
+
keep_alive = True
|
|
59
|
+
while keep_alive:
|
|
60
|
+
try:
|
|
61
|
+
event = await receiver_channel.receive()
|
|
62
|
+
self._nursery_object.start_soon(handler, self, event_config, event)
|
|
63
|
+
except* CDPEndExceptions:
|
|
64
|
+
keep_alive = False
|
|
65
|
+
except* BaseException as error:
|
|
66
|
+
await self.log_cdp_error(error=error)
|
|
67
|
+
keep_alive = False
|
|
68
|
+
|
|
69
|
+
channel_stopped_event.set()
|
|
70
|
+
|
|
71
|
+
async def _run_events_handlers(
|
|
72
|
+
self,
|
|
73
|
+
events_ready_event: trio.Event,
|
|
74
|
+
domain_config: "AbstractDomainSettings"
|
|
75
|
+
):
|
|
76
|
+
"""
|
|
77
|
+
Sets up and runs event handlers for a specific domain.
|
|
78
|
+
|
|
79
|
+
Iterates through the domain configuration and starts a separate task for each configured event handler.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
events_ready_event (trio.Event): Event to signal when all handlers for the domain are ready.
|
|
83
|
+
domain_config (AbstractDomainSettings): Configuration for the domain events.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
CDPEndExceptions: If connection issues occur.
|
|
87
|
+
BaseException: If other errors occur during setup.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
await self.log_cdp_step(
|
|
91
|
+
message=f"Domain '{domain_config.name}' events handlers setup started."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
events_handlers_ready_events: List[trio.Event] = []
|
|
96
|
+
|
|
97
|
+
for event_name, event_config in domain_config.handlers.model_dump(exclude_none=True).items():
|
|
98
|
+
if event_config is not None:
|
|
99
|
+
event_handler_ready_event = trio.Event()
|
|
100
|
+
events_handlers_ready_events.append(event_handler_ready_event)
|
|
101
|
+
|
|
102
|
+
self._nursery_object.start_soon(
|
|
103
|
+
self._run_event_handler,
|
|
104
|
+
event_handler_ready_event,
|
|
105
|
+
getattr(domain_config.handlers, event_name)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
for event_handler_ready_event in events_handlers_ready_events:
|
|
109
|
+
await event_handler_ready_event.wait()
|
|
110
|
+
|
|
111
|
+
events_ready_event.set()
|
|
112
|
+
|
|
113
|
+
await self.log_cdp_step(
|
|
114
|
+
message=f"Domain '{domain_config.name}' events handlers setup complete."
|
|
115
|
+
)
|
|
116
|
+
except* CDPEndExceptions as error:
|
|
117
|
+
raise error
|
|
118
|
+
except* BaseException as error:
|
|
119
|
+
await self.log_cdp_error(error=error)
|
|
120
|
+
raise error
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from osn_selenium.dev_tools.models import FingerprintData
|
|
3
|
+
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
4
|
+
from osn_selenium.dev_tools.target.logging import LoggingMixin
|
|
5
|
+
from osn_selenium.dev_tools._functions import execute_cdp_command
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
__all__ = ["FingerprintMixin"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FingerprintMixin(LoggingMixin):
|
|
12
|
+
"""
|
|
13
|
+
Mixin for detecting and logging fingerprinting attempts in the browser.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
async def _run_fingerprint_detect_listener(self, ready_event: trio.Event):
|
|
17
|
+
"""
|
|
18
|
+
Runs the listener for fingerprint detection events from the browser.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
ready_event (trio.Event): Event to signal when the listener is set up and ready.
|
|
22
|
+
|
|
23
|
+
Raises:
|
|
24
|
+
CDPEndExceptions: If a CDP connection error occurs.
|
|
25
|
+
BaseException: If any other error occurs.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
await self.log_cdp_step(message="Fingerprint detection listener starting.")
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
BindingCalled = self.devtools_package.get("runtime.BindingCalled")
|
|
32
|
+
|
|
33
|
+
self._fingerprint_receive_channel = self.cdp_session.listen(BindingCalled, buffer_size=100)
|
|
34
|
+
|
|
35
|
+
ready_event.set()
|
|
36
|
+
except CDPEndExceptions as error:
|
|
37
|
+
raise error
|
|
38
|
+
except BaseException as error:
|
|
39
|
+
await self.log_cdp_error(error=error)
|
|
40
|
+
raise error
|
|
41
|
+
|
|
42
|
+
await self.log_cdp_step(message="Fingerprint detection listener started.")
|
|
43
|
+
|
|
44
|
+
keep_alive = True
|
|
45
|
+
while keep_alive:
|
|
46
|
+
try:
|
|
47
|
+
event = await self._fingerprint_receive_channel.receive()
|
|
48
|
+
|
|
49
|
+
if event.name == "__osn_fingerprint_report__":
|
|
50
|
+
fingerprint_data = FingerprintData.model_validate_json(event.payload)
|
|
51
|
+
|
|
52
|
+
await self.log_fingerprint(level="Detect", data=fingerprint_data)
|
|
53
|
+
except* CDPEndExceptions:
|
|
54
|
+
keep_alive = False
|
|
55
|
+
except* BaseException as error:
|
|
56
|
+
await self.log_cdp_error(error=error)
|
|
57
|
+
|
|
58
|
+
async def _setup_fingerprint_injection(self, ready_event: trio.Event):
|
|
59
|
+
"""
|
|
60
|
+
Injects the fingerprint detection scripts into the browser page.
|
|
61
|
+
|
|
62
|
+
Enables necessary domains (Page, Runtime), adds the reporting binding,
|
|
63
|
+
and evaluates the fingerprint injection script on new document creation.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
ready_event (trio.Event): Event to signal when injection setup is complete.
|
|
67
|
+
|
|
68
|
+
Raises:
|
|
69
|
+
CDPEndExceptions: If a CDP connection error occurs.
|
|
70
|
+
BaseException: If any other error occurs.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
if self._fingerprint_injection_script:
|
|
74
|
+
try:
|
|
75
|
+
await execute_cdp_command(
|
|
76
|
+
self=self,
|
|
77
|
+
cdp_error_mode="pass"
|
|
78
|
+
if not self._is_main_target
|
|
79
|
+
else "log",
|
|
80
|
+
error_mode="pass"
|
|
81
|
+
if not self._is_main_target
|
|
82
|
+
else "log",
|
|
83
|
+
function=self.devtools_package.get("page.enable"),
|
|
84
|
+
)
|
|
85
|
+
await execute_cdp_command(
|
|
86
|
+
self=self,
|
|
87
|
+
cdp_error_mode="pass"
|
|
88
|
+
if not self._is_main_target
|
|
89
|
+
else "log",
|
|
90
|
+
error_mode="pass"
|
|
91
|
+
if not self._is_main_target
|
|
92
|
+
else "log",
|
|
93
|
+
function=self.devtools_package.get("runtime.enable"),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
await execute_cdp_command(
|
|
97
|
+
self=self,
|
|
98
|
+
cdp_error_mode="pass"
|
|
99
|
+
if not self._is_main_target
|
|
100
|
+
else "log",
|
|
101
|
+
error_mode="pass"
|
|
102
|
+
if not self._is_main_target
|
|
103
|
+
else "log",
|
|
104
|
+
function=self.devtools_package.get("runtime.add_binding"),
|
|
105
|
+
name="__osn_fingerprint_report__",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
await execute_cdp_command(
|
|
109
|
+
self=self,
|
|
110
|
+
cdp_error_mode="pass"
|
|
111
|
+
if not self._is_main_target
|
|
112
|
+
else "log_without_args",
|
|
113
|
+
error_mode="pass"
|
|
114
|
+
if not self._is_main_target
|
|
115
|
+
else "log_without_args",
|
|
116
|
+
function=self.devtools_package.get("page.add_script_to_evaluate_on_new_document"),
|
|
117
|
+
source=self._fingerprint_injection_script,
|
|
118
|
+
run_immediately=True,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
self._nursery_object.start_soon(self._run_fingerprint_detect_listener, ready_event)
|
|
122
|
+
except* CDPEndExceptions as error:
|
|
123
|
+
raise error
|
|
124
|
+
except* BaseException as error:
|
|
125
|
+
await self.log_cdp_error(error=error)
|
|
126
|
+
raise error
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from typing import List
|
|
3
|
+
from osn_selenium.dev_tools.target.detach import DetachMixin
|
|
4
|
+
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
5
|
+
from osn_selenium.dev_tools.target.discovery import DiscoveryMixin
|
|
6
|
+
from osn_selenium.dev_tools.target.events import EventHandlersMixin
|
|
7
|
+
from osn_selenium.dev_tools.logger.target import build_target_logger
|
|
8
|
+
from osn_selenium.dev_tools.target.fingerprint import FingerprintMixin
|
|
9
|
+
from selenium.webdriver.common.bidi.cdp import (
|
|
10
|
+
BrowserError,
|
|
11
|
+
open_cdp
|
|
12
|
+
)
|
|
13
|
+
from osn_selenium.dev_tools._decorators import (
|
|
14
|
+
background_task_decorator
|
|
15
|
+
)
|
|
16
|
+
from osn_selenium.dev_tools._functions import (
|
|
17
|
+
execute_cdp_command,
|
|
18
|
+
wait_one
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
__all__ = ["LifecycleMixin"]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class LifecycleMixin(DiscoveryMixin, EventHandlersMixin, DetachMixin, FingerprintMixin):
|
|
26
|
+
"""
|
|
27
|
+
Mixin managing the main lifecycle of the DevTools target (setup, run, close).
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
async def _close_instances(self):
|
|
31
|
+
"""
|
|
32
|
+
Closes all active resources, channels, and loggers associated with the target.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
if self._new_target_receive_channel is not None:
|
|
36
|
+
await self._new_target_receive_channel[0].aclose()
|
|
37
|
+
await self._new_target_receive_channel[1].wait()
|
|
38
|
+
self._new_target_receive_channel = None
|
|
39
|
+
|
|
40
|
+
if self._detached_receive_channel is not None:
|
|
41
|
+
await self._detached_receive_channel.aclose()
|
|
42
|
+
self._detached_receive_channel = None
|
|
43
|
+
|
|
44
|
+
if self._logger_cdp_send_channel is not None:
|
|
45
|
+
await self._logger_cdp_send_channel.aclose()
|
|
46
|
+
self._logger_cdp_send_channel = None
|
|
47
|
+
|
|
48
|
+
if self._logger_fingerprint_send_channel is not None:
|
|
49
|
+
await self._logger_fingerprint_send_channel.aclose()
|
|
50
|
+
self._logger_fingerprint_send_channel = None
|
|
51
|
+
|
|
52
|
+
if self._logger is not None:
|
|
53
|
+
await self._logger.close()
|
|
54
|
+
self._logger = None
|
|
55
|
+
|
|
56
|
+
for channel in self._events_receive_channels.values():
|
|
57
|
+
await channel[0].aclose()
|
|
58
|
+
await channel[1].wait()
|
|
59
|
+
|
|
60
|
+
self._events_receive_channels = {}
|
|
61
|
+
|
|
62
|
+
if self.background_task_ended is not None:
|
|
63
|
+
await self.background_task_ended.wait()
|
|
64
|
+
self.background_task_ended = None
|
|
65
|
+
|
|
66
|
+
async def _setup_target(self):
|
|
67
|
+
"""
|
|
68
|
+
Configures the target session by enabling domains and starting listeners.
|
|
69
|
+
|
|
70
|
+
Enables configured CDP domains, starts event listeners for them,
|
|
71
|
+
and initializes target discovery and detach monitoring.
|
|
72
|
+
|
|
73
|
+
Raises:
|
|
74
|
+
CDPEndExceptions: If connection issues occur.
|
|
75
|
+
BaseException: If setup fails.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
await self.log_cdp_step(message="Target setup started.")
|
|
80
|
+
|
|
81
|
+
await self._setup_new_targets_attaching()
|
|
82
|
+
|
|
83
|
+
target_ready_events: List[trio.Event] = []
|
|
84
|
+
|
|
85
|
+
new_targets_listener_ready_event = trio.Event()
|
|
86
|
+
target_ready_events.append(new_targets_listener_ready_event)
|
|
87
|
+
|
|
88
|
+
fingerprint_detecting_ready_event = trio.Event()
|
|
89
|
+
target_ready_events.append(fingerprint_detecting_ready_event)
|
|
90
|
+
|
|
91
|
+
self._nursery_object.start_soon(self._run_new_targets_listener, new_targets_listener_ready_event)
|
|
92
|
+
self._nursery_object.start_soon(self._setup_fingerprint_injection, fingerprint_detecting_ready_event)
|
|
93
|
+
self._nursery_object.start_soon(self._run_detach_checking)
|
|
94
|
+
|
|
95
|
+
if self._domains_settings:
|
|
96
|
+
for domain_name, domain_config in self._domains_settings.model_dump(exclude_none=True).items():
|
|
97
|
+
if domain_config.get("enable_func_path", None) is not None:
|
|
98
|
+
enable_func_kwargs = domain_config.get("enable_func_kwargs", {})
|
|
99
|
+
|
|
100
|
+
if (
|
|
101
|
+
domain_config["include_target_types"]
|
|
102
|
+
and self.type_ in domain_config["include_target_types"]
|
|
103
|
+
or domain_config["exclude_target_types"]
|
|
104
|
+
and self.type_ not in domain_config["exclude_target_types"]
|
|
105
|
+
):
|
|
106
|
+
await execute_cdp_command(
|
|
107
|
+
self=self,
|
|
108
|
+
error_mode="log",
|
|
109
|
+
function=self.devtools_package.get(domain_config["enable_func_path"]),
|
|
110
|
+
**enable_func_kwargs
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
domain_handlers_ready_event = trio.Event()
|
|
114
|
+
target_ready_events.append(domain_handlers_ready_event)
|
|
115
|
+
self._nursery_object.start_soon(
|
|
116
|
+
self._run_events_handlers,
|
|
117
|
+
domain_handlers_ready_event,
|
|
118
|
+
getattr(self._domains_settings, domain_name)
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
for domain_handlers_ready_event in target_ready_events:
|
|
122
|
+
await domain_handlers_ready_event.wait()
|
|
123
|
+
|
|
124
|
+
await execute_cdp_command(
|
|
125
|
+
self=self,
|
|
126
|
+
error_mode="log",
|
|
127
|
+
function=self.devtools_package.get("runtime.run_if_waiting_for_debugger"),
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
await self.log_cdp_step(message="Target setup complete.")
|
|
131
|
+
except* CDPEndExceptions as error:
|
|
132
|
+
raise error
|
|
133
|
+
except* BaseException as error:
|
|
134
|
+
await self.log_cdp_error(error=error)
|
|
135
|
+
raise error
|
|
136
|
+
|
|
137
|
+
async def run(self):
|
|
138
|
+
"""
|
|
139
|
+
Starts the main lifecycle loop of the target.
|
|
140
|
+
|
|
141
|
+
Initializes logging, establishes the CDP session, sets up event handling,
|
|
142
|
+
runs background tasks, and waits for exit signals.
|
|
143
|
+
|
|
144
|
+
Raises:
|
|
145
|
+
BaseException: Handles and logs various exceptions during the lifecycle.
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
self._logger_cdp_send_channel, self._logger_fingerprint_send_channel, self._logger = build_target_logger(self.target_data, self._nursery_object, self._logger_settings)
|
|
150
|
+
|
|
151
|
+
if self._cdp_target_type_log_accepted:
|
|
152
|
+
await self._logger.run()
|
|
153
|
+
|
|
154
|
+
await self.log_cdp_step(message=f"Target '{self.target_id}' added.")
|
|
155
|
+
|
|
156
|
+
async with open_cdp(self.websocket_url) as new_connection:
|
|
157
|
+
target_id_instance = self.devtools_package.get("target.TargetID").from_json(self.target_id)
|
|
158
|
+
|
|
159
|
+
async with new_connection.open_session(target_id_instance) as new_session:
|
|
160
|
+
self._cdp_session = new_session
|
|
161
|
+
|
|
162
|
+
await self._setup_target()
|
|
163
|
+
|
|
164
|
+
if self._target_background_task is not None:
|
|
165
|
+
self._nursery_object.start_soon(background_task_decorator(self._target_background_task), self)
|
|
166
|
+
|
|
167
|
+
await wait_one(self.exit_event, self.about_to_stop_event)
|
|
168
|
+
except* (BrowserError, RuntimeError):
|
|
169
|
+
self.about_to_stop_event.set()
|
|
170
|
+
except* CDPEndExceptions:
|
|
171
|
+
self.about_to_stop_event.set()
|
|
172
|
+
except* BaseException as error:
|
|
173
|
+
self.about_to_stop_event.set()
|
|
174
|
+
await self.log_cdp_error(error=error)
|
|
175
|
+
finally:
|
|
176
|
+
await self._close_instances()
|
|
177
|
+
await self._remove_target_func(self)
|
|
178
|
+
|
|
179
|
+
self.stopped_event.set()
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
import inspect
|
|
3
|
+
import warnings
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from osn_selenium.dev_tools.target.base import BaseMixin
|
|
6
|
+
from osn_selenium.dev_tools.models import FingerprintData
|
|
7
|
+
from typing import (
|
|
8
|
+
Any,
|
|
9
|
+
Dict,
|
|
10
|
+
Optional,
|
|
11
|
+
TYPE_CHECKING
|
|
12
|
+
)
|
|
13
|
+
from osn_selenium.dev_tools._exception_helpers import (
|
|
14
|
+
extract_exception_trace,
|
|
15
|
+
log_exception
|
|
16
|
+
)
|
|
17
|
+
from osn_selenium.dev_tools.logger.models import (
|
|
18
|
+
CDPTargetLogEntry,
|
|
19
|
+
FingerprintTargetLogEntry
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
__all__ = ["LoggingMixin"]
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from osn_selenium.dev_tools._typehints import CDP_LOG_LEVELS_TYPEHINT, FINGERPRINT_LOG_LEVELS_TYPEHINT
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class LoggingMixin(BaseMixin):
|
|
30
|
+
"""
|
|
31
|
+
Mixin for handling logging operations within a DevTools target.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
async def log_cdp(
|
|
35
|
+
self,
|
|
36
|
+
level: "CDP_LOG_LEVELS_TYPEHINT",
|
|
37
|
+
message: str,
|
|
38
|
+
extra_data: Optional[Dict[str, Any]] = None
|
|
39
|
+
):
|
|
40
|
+
"""
|
|
41
|
+
Records a CDP log entry.
|
|
42
|
+
|
|
43
|
+
If logging is accepted for this target type, the entry is sent to the target-specific
|
|
44
|
+
logger channel.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
level (CDPLogLevelsType): The severity level (e.g., 'INFO', 'ERROR').
|
|
48
|
+
message (str): The log message.
|
|
49
|
+
extra_data (Optional[Dict[str, Any]]): Additional data to log.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
log_entry = CDPTargetLogEntry(
|
|
53
|
+
target_data=self.target_data,
|
|
54
|
+
message=message,
|
|
55
|
+
level=level,
|
|
56
|
+
datetime=datetime.now(),
|
|
57
|
+
extra_data=extra_data
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
await self._add_cdp_log_func(log_entry)
|
|
61
|
+
|
|
62
|
+
if self.target_type_log_accepted and self._logger is not None and self._logger_cdp_send_channel is not None:
|
|
63
|
+
await self._cdp_log_stats.add_log(log_entry)
|
|
64
|
+
await self._logger.run()
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
self._logger_cdp_send_channel.send_nowait(log_entry)
|
|
68
|
+
except trio.WouldBlock:
|
|
69
|
+
warnings.warn(
|
|
70
|
+
f"WARNING: Log channel for session {self.target_id} is full. Log dropped:\n{log_entry.model_dump_json(indent=4)}"
|
|
71
|
+
)
|
|
72
|
+
except trio.BrokenResourceError:
|
|
73
|
+
warnings.warn(
|
|
74
|
+
f"WARNING: Log channel for session {self.target_id} is broken. Log dropped:\n{log_entry.model_dump_json(indent=4)}"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
async def log_cdp_error(self, error: BaseException, extra_data: Optional[Dict[str, Any]] = None):
|
|
78
|
+
"""
|
|
79
|
+
Logs an error with exception traceback and context.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
error (BaseException): The exception to log.
|
|
83
|
+
extra_data (Optional[Dict[str, Any]]): Additional context data.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
stack = inspect.stack()
|
|
87
|
+
extra_data_ = {
|
|
88
|
+
"frame": str(stack[1].frame),
|
|
89
|
+
"source_function": " <- ".join(stack_.function for stack_ in stack[1:]),
|
|
90
|
+
"target_data": self.target_data.model_dump(),
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if extra_data is not None:
|
|
94
|
+
extra_data_.update(extra_data)
|
|
95
|
+
|
|
96
|
+
await self.log_cdp(
|
|
97
|
+
level="ERROR",
|
|
98
|
+
message=extract_exception_trace(error),
|
|
99
|
+
extra_data=extra_data_
|
|
100
|
+
)
|
|
101
|
+
log_exception(exception=error, extra_data=extra_data_)
|
|
102
|
+
|
|
103
|
+
async def log_cdp_step(self, message: str, extra_data: Optional[Dict[str, Any]] = None):
|
|
104
|
+
"""
|
|
105
|
+
Logs a 'step' or informational message at INFO level.
|
|
106
|
+
|
|
107
|
+
Automatically includes the source function in the extra data.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
message (str): The log message.
|
|
111
|
+
extra_data (Optional[Dict[str, Any]]): Additional context data.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
stack = inspect.stack()
|
|
115
|
+
extra_data_ = {"source_function": " <- ".join(stack_.function for stack_ in stack[1:])}
|
|
116
|
+
|
|
117
|
+
if extra_data is not None:
|
|
118
|
+
extra_data_.update(extra_data)
|
|
119
|
+
|
|
120
|
+
await self.log_cdp(level="INFO", message=message, extra_data=extra_data_)
|
|
121
|
+
|
|
122
|
+
async def log_fingerprint(self, level: "FINGERPRINT_LOG_LEVELS_TYPEHINT", data: FingerprintData):
|
|
123
|
+
"""
|
|
124
|
+
Records a fingerprint detection log entry.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
level ("FingerprintLogLevelsType"): The log level (e.g., "Detect").
|
|
128
|
+
data (FingerprintData): The detected fingerprint data.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
log_entry = FingerprintTargetLogEntry(
|
|
132
|
+
target_data=self.target_data,
|
|
133
|
+
level=level,
|
|
134
|
+
api=data.api,
|
|
135
|
+
used_method=data.used_method,
|
|
136
|
+
datetime=datetime.now(),
|
|
137
|
+
stacktrace=data.stacktrace,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
await self._add_fingerprint_log_func(log_entry)
|
|
141
|
+
|
|
142
|
+
if self.target_type_log_accepted and self._logger is not None and self._logger_fingerprint_send_channel is not None:
|
|
143
|
+
await self._fingerprint_log_stats.add_log(log_entry)
|
|
144
|
+
await self._logger.run()
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
self._logger_fingerprint_send_channel.send_nowait(log_entry)
|
|
148
|
+
except trio.WouldBlock:
|
|
149
|
+
warnings.warn(
|
|
150
|
+
f"WARNING: Log channel for session {self.target_id} is full. Log dropped:\n{log_entry.model_dump_json(indent=4)}"
|
|
151
|
+
)
|
|
152
|
+
except trio.BrokenResourceError:
|
|
153
|
+
warnings.warn(
|
|
154
|
+
f"WARNING: Log channel for session {self.target_id} is broken. Log dropped:\n{log_entry.model_dump_json(indent=4)}"
|
|
155
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from typing import Any, Iterable, Union
|
|
2
|
+
from osn_selenium._functions import flatten_types
|
|
3
|
+
from osn_selenium.exceptions.base import OSNSeleniumError
|
|
4
|
+
from osn_selenium._typehints import (
|
|
5
|
+
TYPES_FOR_FLATTENING_TYPEHINT
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"ConfigurationError",
|
|
11
|
+
"DuplicationError",
|
|
12
|
+
"NotExpectedTypeError",
|
|
13
|
+
"NotExpectedValueError"
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ConfigurationError(OSNSeleniumError):
|
|
18
|
+
"""
|
|
19
|
+
Base class for configuration-related errors.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class NotExpectedValueError(ConfigurationError):
|
|
26
|
+
"""
|
|
27
|
+
Error raised when a configuration value is not among the expected valid values.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, value_name: str, value: Any, valid_values: Iterable[Any]) -> None:
|
|
31
|
+
"""
|
|
32
|
+
Initializes NotExpectedValueError.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
value_name (str): The name of the configuration parameter.
|
|
36
|
+
value (Any): The invalid value provided.
|
|
37
|
+
valid_values (Iterable[Any]): A collection of acceptable values.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
super().__init__(
|
|
41
|
+
f"Invalid '{value_name}' value ({str(value)}. Valid values: {', '.join(str(valid_value) for valid_value in valid_values)}."
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class NotExpectedTypeError(ConfigurationError):
|
|
46
|
+
"""
|
|
47
|
+
Error raised when a configuration value has an invalid type.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
value_name: str,
|
|
53
|
+
value: Any,
|
|
54
|
+
valid_types: Union[TYPES_FOR_FLATTENING_TYPEHINT, Iterable[TYPES_FOR_FLATTENING_TYPEHINT]]
|
|
55
|
+
) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Initializes NotExpectedTypeError.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
value_name (str): The name of the configuration parameter.
|
|
61
|
+
value (Any): The value with the incorrect type.
|
|
62
|
+
valid_types (Union[TYPE_FOR_FLATTENING, Iterable[TYPE_FOR_FLATTENING]]): The expected type or types.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
super().__init__(
|
|
66
|
+
f"Invalid '{value_name}' type ({str(value)}. Valid types: {', '.join(flatten_types(valid_types))}."
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class DuplicationError(ConfigurationError):
|
|
71
|
+
"""
|
|
72
|
+
Error raised when a configuration parameter contains duplicated values.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def __init__(self, value_name: str, duplicated_values: Union[str, Iterable[str]]) -> None:
|
|
76
|
+
"""
|
|
77
|
+
Initializes DuplicationError.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
value_name (str): The name of the parameter.
|
|
81
|
+
duplicated_values (Union[str, Iterable[str]]): The value or values that were duplicated.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
super().__init__(f"'{value_name}' has been duplicated: {', '.join(duplicated_values)}.")
|