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
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
import trio
|
|
2
|
-
from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
)
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from osn_selenium._base_models import DictModel
|
|
4
|
+
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
6
5
|
from typing import (
|
|
7
6
|
Any,
|
|
7
|
+
Dict,
|
|
8
|
+
List,
|
|
8
9
|
Literal,
|
|
9
|
-
Sequence,
|
|
10
10
|
TYPE_CHECKING,
|
|
11
|
-
TypedDict,
|
|
12
11
|
Union
|
|
13
12
|
)
|
|
14
13
|
|
|
15
14
|
|
|
15
|
+
__all__ = [
|
|
16
|
+
"HeaderInstance",
|
|
17
|
+
"auth_required_choose_func",
|
|
18
|
+
"headers_handler",
|
|
19
|
+
"on_error_func",
|
|
20
|
+
"request_paused_choose_func"
|
|
21
|
+
]
|
|
22
|
+
|
|
16
23
|
if TYPE_CHECKING:
|
|
17
|
-
from osn_selenium.dev_tools.
|
|
24
|
+
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
18
25
|
from osn_selenium.dev_tools.domains.fetch import request_paused_actions_literal, auth_required_actions_literal
|
|
19
26
|
|
|
20
27
|
|
|
21
|
-
def request_paused_choose_func(self: "DevToolsTarget", event: Any) ->
|
|
28
|
+
def request_paused_choose_func(self: "DevToolsTarget", event: Any) -> List["request_paused_actions_literal"]:
|
|
22
29
|
"""
|
|
23
30
|
Default function to choose actions for a 'fetch.RequestPaused' event.
|
|
24
31
|
|
|
@@ -27,11 +34,11 @@ def request_paused_choose_func(self: "DevToolsTarget", event: Any) -> Sequence["
|
|
|
27
34
|
deciding which actions to take based on the event details.
|
|
28
35
|
|
|
29
36
|
Args:
|
|
30
|
-
self (DevToolsTarget): The DevToolsTarget instance.
|
|
37
|
+
self ("DevToolsTarget"): The DevToolsTarget instance.
|
|
31
38
|
event (Any): The 'RequestPaused' event object.
|
|
32
39
|
|
|
33
40
|
Returns:
|
|
34
|
-
|
|
41
|
+
List[request_paused_actions_literal]: A list of action names to be executed.
|
|
35
42
|
"""
|
|
36
43
|
|
|
37
44
|
return ["continue_request"]
|
|
@@ -45,15 +52,22 @@ def on_error_func(self: "DevToolsTarget", event: Any, error: BaseException):
|
|
|
45
52
|
Users can provide their own function to implement custom error handling logic.
|
|
46
53
|
|
|
47
54
|
Args:
|
|
48
|
-
self (DevToolsTarget): The DevToolsTarget instance.
|
|
55
|
+
self ("DevToolsTarget"): The DevToolsTarget instance.
|
|
49
56
|
event (Any): The event object that was being processed when the error occurred.
|
|
50
57
|
error (BaseException): The exception that was raised.
|
|
51
58
|
"""
|
|
52
59
|
|
|
53
|
-
log_exception(
|
|
60
|
+
log_exception(
|
|
61
|
+
exception=error,
|
|
62
|
+
extra_data={
|
|
63
|
+
"datetime": datetime.now(),
|
|
64
|
+
"target object data": self.target_data.model_dump(),
|
|
65
|
+
"event": event
|
|
66
|
+
}
|
|
67
|
+
)
|
|
54
68
|
|
|
55
69
|
|
|
56
|
-
class HeaderInstance(
|
|
70
|
+
class HeaderInstance(DictModel):
|
|
57
71
|
"""
|
|
58
72
|
Type definition for header modification instructions used by the `headers_handler`.
|
|
59
73
|
|
|
@@ -76,9 +90,9 @@ class HeaderInstance(TypedDict):
|
|
|
76
90
|
async def headers_handler(
|
|
77
91
|
self: "DevToolsTarget",
|
|
78
92
|
ready_event: trio.Event,
|
|
79
|
-
headers_instances:
|
|
93
|
+
headers_instances: Dict[str, HeaderInstance],
|
|
80
94
|
event: Any,
|
|
81
|
-
kwargs:
|
|
95
|
+
kwargs: Dict[str, Any]
|
|
82
96
|
):
|
|
83
97
|
"""
|
|
84
98
|
A parameter handler function to modify request headers.
|
|
@@ -89,24 +103,24 @@ async def headers_handler(
|
|
|
89
103
|
like `fetch.continueRequest`.
|
|
90
104
|
|
|
91
105
|
Args:
|
|
92
|
-
self (DevToolsTarget): The DevToolsTarget instance.
|
|
106
|
+
self ("DevToolsTarget"): The DevToolsTarget instance.
|
|
93
107
|
ready_event (trio.Event): A Trio event to signal when the handler has completed its work.
|
|
94
|
-
headers_instances (
|
|
108
|
+
headers_instances (Dict[str, HeaderInstance]): A dictionary where keys are header names
|
|
95
109
|
and values are `HeaderInstance` objects defining the modification.
|
|
96
110
|
event (Any): The CDP event object (e.g., `RequestPaused`) containing the original request headers.
|
|
97
|
-
kwargs (
|
|
111
|
+
kwargs (Dict[str, Any]): The dictionary of keyword arguments to which the modified headers will be added.
|
|
98
112
|
|
|
99
113
|
Raises:
|
|
100
114
|
Exception: If an error occurs during header modification.
|
|
101
115
|
"""
|
|
102
116
|
|
|
103
117
|
try:
|
|
104
|
-
header_entry_class =
|
|
118
|
+
header_entry_class = self.devtools_package.get("fetch.HeaderEntry")
|
|
105
119
|
headers = {name: value for name, value in event.request.headers.items()}
|
|
106
120
|
|
|
107
121
|
for name, instance in headers_instances.items():
|
|
108
|
-
value = instance
|
|
109
|
-
instruction = instance
|
|
122
|
+
value = instance.value
|
|
123
|
+
instruction = instance.instruction
|
|
110
124
|
|
|
111
125
|
if instruction == "set":
|
|
112
126
|
headers[name] = value
|
|
@@ -119,8 +133,7 @@ async def headers_handler(
|
|
|
119
133
|
continue
|
|
120
134
|
|
|
121
135
|
if instruction == "remove":
|
|
122
|
-
|
|
123
|
-
headers.pop(name)
|
|
136
|
+
headers.pop(name, None)
|
|
124
137
|
|
|
125
138
|
continue
|
|
126
139
|
|
|
@@ -131,11 +144,11 @@ async def headers_handler(
|
|
|
131
144
|
|
|
132
145
|
ready_event.set()
|
|
133
146
|
except BaseException as error:
|
|
134
|
-
await self.
|
|
147
|
+
await self.log_cdp_error(error=error)
|
|
135
148
|
raise error
|
|
136
149
|
|
|
137
150
|
|
|
138
|
-
def auth_required_choose_func(self: "DevToolsTarget",
|
|
151
|
+
def auth_required_choose_func(self: "DevToolsTarget", event: Any) -> List["auth_required_actions_literal"]:
|
|
139
152
|
"""
|
|
140
153
|
Default function to choose actions for a 'fetch.AuthRequired' event.
|
|
141
154
|
|
|
@@ -144,12 +157,11 @@ def auth_required_choose_func(self: "DevToolsTarget", target_data: TargetData, e
|
|
|
144
157
|
deciding which actions to take based on the event details.
|
|
145
158
|
|
|
146
159
|
Args:
|
|
147
|
-
self (DevToolsTarget): The DevToolsTarget instance.
|
|
148
|
-
target_data (TargetData): Data about the current browser target.
|
|
160
|
+
self ("DevToolsTarget"): The DevToolsTarget instance.
|
|
149
161
|
event (Any): The 'AuthRequired' event object.
|
|
150
162
|
|
|
151
163
|
Returns:
|
|
152
|
-
|
|
164
|
+
List[auth_required_actions_literal]: A list of action names to be executed.
|
|
153
165
|
"""
|
|
154
166
|
|
|
155
167
|
return ["continue_with_auth"]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from pydantic import Field
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
from osn_selenium._base_models import DictModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
__all__ = ["TargetFilter", "TargetsFilters"]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TargetsFilters(DictModel):
|
|
10
|
+
"""
|
|
11
|
+
Configuration model for filtering target types (inclusion/exclusion).
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
excluded (List[str]): List of target types to exclude.
|
|
15
|
+
included (List[str]): List of target types to include.
|
|
16
|
+
entire (bool): Default behavior if a type is not explicitly listed.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
excluded: List[str] = Field(default_factory=list)
|
|
20
|
+
included: List[str] = Field(default_factory=list)
|
|
21
|
+
|
|
22
|
+
entire: bool = False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class TargetFilter(DictModel):
|
|
26
|
+
"""
|
|
27
|
+
Dataclass to define a filter for discovering new browser targets.
|
|
28
|
+
|
|
29
|
+
Used in `DevToolsSettings` to specify which types of targets (e.g., "page", "iframe")
|
|
30
|
+
should be automatically attached to or excluded.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
type_ (Optional[str]): The type of target to filter by (e.g., "page", "iframe").
|
|
34
|
+
If None, this filter applies regardless of type. Aliased as 'type'.
|
|
35
|
+
exclude (Optional[bool]): If True, targets matching `type_` will be excluded.
|
|
36
|
+
If False or None, targets matching `type_` will be included.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
type_: Optional[str] = Field(default=None, alias="type")
|
|
40
|
+
exclude: Optional[bool] = None
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from typing import (
|
|
3
|
+
Optional,
|
|
4
|
+
TYPE_CHECKING,
|
|
5
|
+
Tuple
|
|
6
|
+
)
|
|
7
|
+
from osn_selenium.exceptions.devtools import TrioEndExceptions
|
|
8
|
+
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
9
|
+
from osn_selenium.exceptions.configuration import ConfigurationError
|
|
10
|
+
from osn_selenium.dev_tools.logger.models import (
|
|
11
|
+
CDPMainLogEntry,
|
|
12
|
+
FingerprintMainLogEntry
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = ["MainLogger", "build_main_logger"]
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from osn_selenium.dev_tools.settings import LoggerSettings
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MainLogger:
|
|
23
|
+
"""
|
|
24
|
+
Manages the main log file, summarizing overall logging activity.
|
|
25
|
+
|
|
26
|
+
This logger is responsible for writing aggregated statistics about all active
|
|
27
|
+
logging channels and target types to a designated file.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
logger_settings: "LoggerSettings",
|
|
33
|
+
nursery_object: trio.Nursery,
|
|
34
|
+
cdp_receive_channel: Optional[trio.MemoryReceiveChannel[CDPMainLogEntry]],
|
|
35
|
+
fingerprint_receive_channel: Optional[trio.MemoryReceiveChannel[FingerprintMainLogEntry]]
|
|
36
|
+
):
|
|
37
|
+
"""
|
|
38
|
+
Initializes the MainLogger.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
logger_settings ("LoggerSettings"): The settings for logging, including log directory.
|
|
42
|
+
nursery_object (trio.Nursery): The Trio nursery to spawn background tasks.
|
|
43
|
+
cdp_receive_channel (Optional[trio.MemoryReceiveChannel[CDPMainLogEntry]]):
|
|
44
|
+
The channel from which CDP main log entries are received.
|
|
45
|
+
fingerprint_receive_channel (Optional[trio.MemoryReceiveChannel[FingerprintMainLogEntry]]):
|
|
46
|
+
The channel from which fingerprint main log entries are received.
|
|
47
|
+
|
|
48
|
+
Raises:
|
|
49
|
+
ValueError: If settings require logging but `dir_path` is not set.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
self._nursery_object = nursery_object
|
|
53
|
+
self._cdp_receive_channel = cdp_receive_channel
|
|
54
|
+
self._fingerprint_receive_channel = fingerprint_receive_channel
|
|
55
|
+
self._cdp_file_path = None
|
|
56
|
+
self._cdp_log_level_filter = None
|
|
57
|
+
self._cdp_target_type_filter = None
|
|
58
|
+
self._fingerprint_file_path = None
|
|
59
|
+
self._fingerprint_log_level_filter = None
|
|
60
|
+
self._fingerprint_target_type_filter = None
|
|
61
|
+
|
|
62
|
+
if logger_settings.dir_path is None:
|
|
63
|
+
if logger_settings.cdp_settings:
|
|
64
|
+
raise ConfigurationError("Can't log CDP without LoggerSettings.dir_path!")
|
|
65
|
+
|
|
66
|
+
if logger_settings.fingerprint_settings:
|
|
67
|
+
raise ConfigurationError("Can't log Fingerprint without LoggerSettings.dir_path!")
|
|
68
|
+
else:
|
|
69
|
+
logdir_path = logger_settings.dir_path.joinpath("__MAIN__")
|
|
70
|
+
logdir_path.mkdir(exist_ok=True)
|
|
71
|
+
|
|
72
|
+
if logger_settings.cdp_settings:
|
|
73
|
+
self._cdp_file_path = logdir_path.joinpath(f"cdp_log.txt")
|
|
74
|
+
|
|
75
|
+
if logger_settings.fingerprint_settings:
|
|
76
|
+
self._fingerprint_file_path = logdir_path.joinpath(f"fingerprint_log.txt")
|
|
77
|
+
|
|
78
|
+
self._cdp_file_writing_stopped: Optional[trio.Event] = None
|
|
79
|
+
self._fingerprint_file_writing_stopped: Optional[trio.Event] = None
|
|
80
|
+
self._is_active = False
|
|
81
|
+
|
|
82
|
+
async def close(self):
|
|
83
|
+
"""
|
|
84
|
+
Closes the main logger, including its receive channels and stops writing tasks.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
if self._cdp_receive_channel is not None:
|
|
88
|
+
await self._cdp_receive_channel.aclose()
|
|
89
|
+
self._cdp_receive_channel = None
|
|
90
|
+
|
|
91
|
+
if self._cdp_file_writing_stopped is not None:
|
|
92
|
+
await self._cdp_file_writing_stopped.wait()
|
|
93
|
+
self._cdp_file_writing_stopped = None
|
|
94
|
+
|
|
95
|
+
if self._fingerprint_receive_channel is not None:
|
|
96
|
+
await self._fingerprint_receive_channel.aclose()
|
|
97
|
+
self._fingerprint_receive_channel = None
|
|
98
|
+
|
|
99
|
+
if self._fingerprint_file_writing_stopped is not None:
|
|
100
|
+
await self._fingerprint_file_writing_stopped.wait()
|
|
101
|
+
self._fingerprint_file_writing_stopped = None
|
|
102
|
+
|
|
103
|
+
self._is_active = False
|
|
104
|
+
|
|
105
|
+
async def _write_fingerprint_file(self):
|
|
106
|
+
"""
|
|
107
|
+
Asynchronously writes fingerprint main log entries to the file.
|
|
108
|
+
|
|
109
|
+
This method continuously receives `FingerprintMainLogEntry` objects and
|
|
110
|
+
updates the log file.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
async with await trio.open_file(self._fingerprint_file_path, "w+", encoding="utf-8") as file:
|
|
115
|
+
async for log_entry in self._fingerprint_receive_channel:
|
|
116
|
+
await file.seek(0)
|
|
117
|
+
await file.write(log_entry.model_dump_json(indent=4))
|
|
118
|
+
await file.truncate()
|
|
119
|
+
await file.flush()
|
|
120
|
+
except* TrioEndExceptions:
|
|
121
|
+
pass
|
|
122
|
+
except* BaseException as error:
|
|
123
|
+
log_exception(error)
|
|
124
|
+
finally:
|
|
125
|
+
if self._fingerprint_file_writing_stopped is not None:
|
|
126
|
+
self._fingerprint_file_writing_stopped.set()
|
|
127
|
+
|
|
128
|
+
async def _write_cdp_file(self):
|
|
129
|
+
"""
|
|
130
|
+
Asynchronously writes CDP main log entries to the file.
|
|
131
|
+
|
|
132
|
+
This method continuously receives `CDPMainLogEntry` objects from its channel
|
|
133
|
+
and overwrites the configured file with their string representation.
|
|
134
|
+
It runs as a background task.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
try:
|
|
138
|
+
async with await trio.open_file(self._cdp_file_path, "w+", encoding="utf-8") as file:
|
|
139
|
+
async for log_entry in self._cdp_receive_channel:
|
|
140
|
+
await file.seek(0)
|
|
141
|
+
await file.write(log_entry.model_dump_json(indent=4))
|
|
142
|
+
await file.truncate()
|
|
143
|
+
await file.flush()
|
|
144
|
+
except* TrioEndExceptions:
|
|
145
|
+
pass
|
|
146
|
+
except* BaseException as error:
|
|
147
|
+
log_exception(error)
|
|
148
|
+
finally:
|
|
149
|
+
if self._cdp_file_writing_stopped is not None:
|
|
150
|
+
self._cdp_file_writing_stopped.set()
|
|
151
|
+
|
|
152
|
+
async def run(self):
|
|
153
|
+
"""
|
|
154
|
+
Starts the main logger, setting up its receive channel and file writing task.
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
BaseException: If an error occurs during setup or if the logger fails to activate.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
try:
|
|
161
|
+
if not self._is_active:
|
|
162
|
+
self._cdp_file_writing_stopped = trio.Event()
|
|
163
|
+
|
|
164
|
+
if self._cdp_file_path is not None:
|
|
165
|
+
self._nursery_object.start_soon(self._write_cdp_file)
|
|
166
|
+
|
|
167
|
+
self._fingerprint_file_writing_stopped = trio.Event()
|
|
168
|
+
|
|
169
|
+
if self._fingerprint_file_path is not None:
|
|
170
|
+
self._nursery_object.start_soon(self._write_fingerprint_file)
|
|
171
|
+
|
|
172
|
+
self._is_active = True
|
|
173
|
+
except* TrioEndExceptions:
|
|
174
|
+
await self.close()
|
|
175
|
+
except* BaseException as error:
|
|
176
|
+
log_exception(error)
|
|
177
|
+
await self.close()
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def build_main_logger(nursery_object: trio.Nursery, logger_settings: "LoggerSettings") -> Tuple[
|
|
181
|
+
Optional[trio.MemorySendChannel[CDPMainLogEntry]],
|
|
182
|
+
Optional[trio.MemorySendChannel[FingerprintMainLogEntry]],
|
|
183
|
+
MainLogger
|
|
184
|
+
]:
|
|
185
|
+
"""
|
|
186
|
+
Builds and initializes a `MainLogger` instance along with its send channels.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
nursery_object (trio.Nursery): The Trio nursery to associate with the logger for background tasks.
|
|
190
|
+
logger_settings ("LoggerSettings"): The logger configuration settings.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Tuple[Optional[trio.MemorySendChannel[CDPMainLogEntry]], Optional[trio.MemorySendChannel[FingerprintMainLogEntry]], MainLogger]:
|
|
194
|
+
A tuple containing the send channels for logs and the initialized `MainLogger` instance.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
if logger_settings.cdp_settings is not None:
|
|
198
|
+
cdp_send, cdp_recv = trio.open_memory_channel(logger_settings.cdp_settings.buffer_size)
|
|
199
|
+
else:
|
|
200
|
+
cdp_send, cdp_recv = None, None
|
|
201
|
+
|
|
202
|
+
if logger_settings.fingerprint_settings is not None:
|
|
203
|
+
fp_send, fp_recv = trio.open_memory_channel(logger_settings.fingerprint_settings.buffer_size)
|
|
204
|
+
else:
|
|
205
|
+
fp_send, fp_recv = None, None
|
|
206
|
+
|
|
207
|
+
target_logger = MainLogger(
|
|
208
|
+
logger_settings=logger_settings,
|
|
209
|
+
nursery_object=nursery_object,
|
|
210
|
+
cdp_receive_channel=cdp_recv,
|
|
211
|
+
fingerprint_receive_channel=fp_recv,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
return cdp_send, fp_send, target_logger
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
from pydantic import Field
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from osn_selenium._base_models import DictModel
|
|
4
|
+
from osn_selenium.dev_tools.models import TargetData
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
Dict,
|
|
8
|
+
Optional,
|
|
9
|
+
Sequence
|
|
10
|
+
)
|
|
11
|
+
from osn_selenium.dev_tools._typehints import (
|
|
12
|
+
CDP_LOG_LEVELS_TYPEHINT,
|
|
13
|
+
FINGERPRINT_LOG_LEVELS_TYPEHINT
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"CDPLogLevelStats",
|
|
19
|
+
"CDPLoggerChannelStats",
|
|
20
|
+
"CDPMainLogEntry",
|
|
21
|
+
"CDPTargetLogEntry",
|
|
22
|
+
"CDPTargetTypeStats",
|
|
23
|
+
"FingerprintAPIStats",
|
|
24
|
+
"FingerprintLogLevelStats",
|
|
25
|
+
"FingerprintLoggerChannelStats",
|
|
26
|
+
"FingerprintMainLogEntry",
|
|
27
|
+
"FingerprintTargetLogEntry"
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class FingerprintLogLevelStats(DictModel):
|
|
32
|
+
"""
|
|
33
|
+
Statistics for a specific fingerprint log level.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
num_logs (int): Number of logs recorded.
|
|
37
|
+
last_log_time (datetime): Timestamp of the last log.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
num_logs: int
|
|
41
|
+
last_log_time: datetime
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class FingerprintTargetLogEntry(DictModel):
|
|
45
|
+
"""
|
|
46
|
+
A single log entry for fingerprint detection events.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
target_data (TargetData): Information about the target.
|
|
50
|
+
level (FingerprintLogLevelsType): The log level (e.g., "Detect").
|
|
51
|
+
api (str): The API involved in the fingerprinting.
|
|
52
|
+
used_method (str): The method called.
|
|
53
|
+
datetime (datetime): When the event occurred.
|
|
54
|
+
stacktrace (Optional[str]): Stack trace of the event.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
target_data: TargetData
|
|
58
|
+
level: FINGERPRINT_LOG_LEVELS_TYPEHINT
|
|
59
|
+
api: str
|
|
60
|
+
used_method: str
|
|
61
|
+
datetime: datetime
|
|
62
|
+
stacktrace: Optional[str]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class FingerprintLoggerChannelStats(DictModel):
|
|
66
|
+
"""
|
|
67
|
+
Statistics for a fingerprint logging channel.
|
|
68
|
+
|
|
69
|
+
Attributes:
|
|
70
|
+
target_id (str): ID of the target.
|
|
71
|
+
title (str): Title of the target.
|
|
72
|
+
url (str): URL of the target.
|
|
73
|
+
num_logs (int): Total logs for this channel.
|
|
74
|
+
last_log_time (datetime): Time of the last log.
|
|
75
|
+
log_level_stats (Dict[str, FingerprintLogLevelStats]): Stats per log level.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
target_id: str
|
|
79
|
+
title: str
|
|
80
|
+
url: str
|
|
81
|
+
num_logs: int = 0
|
|
82
|
+
last_log_time: datetime = Field(default_factory=datetime.now)
|
|
83
|
+
log_level_stats: Dict[str, FingerprintLogLevelStats] = Field(default_factory=dict)
|
|
84
|
+
|
|
85
|
+
async def add_log(self, log_entry: FingerprintTargetLogEntry):
|
|
86
|
+
"""
|
|
87
|
+
Updates the channel statistics based on a new log entry.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
log_entry (FingerprintTargetLogEntry): The new log entry to incorporate into the statistics.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
self.num_logs += 1
|
|
94
|
+
self.last_log_time = log_entry.datetime
|
|
95
|
+
|
|
96
|
+
if log_entry.level not in self.log_level_stats:
|
|
97
|
+
self.log_level_stats[log_entry.level] = FingerprintLogLevelStats(num_logs=1, last_log_time=log_entry.datetime)
|
|
98
|
+
else:
|
|
99
|
+
self.log_level_stats[log_entry.level].num_logs += 1
|
|
100
|
+
self.log_level_stats[log_entry.level].last_log_time = log_entry.datetime
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class FingerprintAPIStats(DictModel):
|
|
104
|
+
"""
|
|
105
|
+
Statistics for a specific Fingerprint API.
|
|
106
|
+
|
|
107
|
+
Attributes:
|
|
108
|
+
num_logs (int): Number of targets accessing this API.
|
|
109
|
+
methods_stats (Dict[str, int]): Count of calls per method.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
num_logs: int
|
|
113
|
+
methods_stats: Dict[str, int]
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class FingerprintMainLogEntry(DictModel):
|
|
117
|
+
"""
|
|
118
|
+
Summary log entry for all fingerprinting activity.
|
|
119
|
+
|
|
120
|
+
Attributes:
|
|
121
|
+
num_channels (int): Total active channels.
|
|
122
|
+
apis_stats (Dict[str, FingerprintAPIStats]): Stats per API.
|
|
123
|
+
num_logs (int): Total logs recorded.
|
|
124
|
+
log_level_stats (Dict[str, FingerprintLogLevelStats]): Stats per log level.
|
|
125
|
+
channels_stats (Sequence[FingerprintLoggerChannelStats]): Stats for each channel.
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
num_channels: int
|
|
129
|
+
apis_stats: Dict[str, FingerprintAPIStats]
|
|
130
|
+
num_logs: int
|
|
131
|
+
log_level_stats: Dict[str, FingerprintLogLevelStats]
|
|
132
|
+
channels_stats: Sequence[FingerprintLoggerChannelStats]
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class CDPLogLevelStats(DictModel):
|
|
136
|
+
"""
|
|
137
|
+
Dataclass to store statistics for a specific log level.
|
|
138
|
+
|
|
139
|
+
Attributes:
|
|
140
|
+
num_logs (int): The total number of logs recorded for this level.
|
|
141
|
+
last_log_time (datetime): The timestamp of the most recent log entry for this level.
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
num_logs: int
|
|
145
|
+
last_log_time: datetime
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class CDPTargetLogEntry(DictModel):
|
|
149
|
+
"""
|
|
150
|
+
Represents a single log entry with detailed information.
|
|
151
|
+
|
|
152
|
+
Attributes:
|
|
153
|
+
target_data (TargetData): Data about the target (browser tab/session) from which the log originated.
|
|
154
|
+
message (str): The main log message.
|
|
155
|
+
level (CDPLogLevelsType): The severity level of the log (e.g., "INFO", "ERROR").
|
|
156
|
+
datetime (datetime): The exact time when the log entry was created.
|
|
157
|
+
extra_data (Optional[Dict[str, Any]]): Optional additional data associated with the log.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
target_data: TargetData
|
|
161
|
+
message: str
|
|
162
|
+
level: CDP_LOG_LEVELS_TYPEHINT
|
|
163
|
+
datetime: datetime
|
|
164
|
+
extra_data: Optional[Dict[str, Any]] = None
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class CDPLoggerChannelStats(DictModel):
|
|
168
|
+
"""
|
|
169
|
+
Dataclass to store statistics for a specific logging channel (per target).
|
|
170
|
+
|
|
171
|
+
Attributes:
|
|
172
|
+
target_id (str): The unique ID of the target associated with this channel.
|
|
173
|
+
title (str): The title of the target (e.g., page title).
|
|
174
|
+
url (str): The URL of the target.
|
|
175
|
+
num_logs (int): The total number of log entries for this channel.
|
|
176
|
+
last_log_time (datetime): The timestamp of the most recent log entry for this channel.
|
|
177
|
+
log_level_stats (Dict[str, CDPLogLevelStats]): A dictionary mapping log levels to their specific statistics.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
target_id: str
|
|
181
|
+
title: str
|
|
182
|
+
url: str
|
|
183
|
+
num_logs: int = 0
|
|
184
|
+
last_log_time: datetime = Field(default_factory=datetime.now)
|
|
185
|
+
log_level_stats: Dict[str, CDPLogLevelStats] = Field(default_factory=dict)
|
|
186
|
+
|
|
187
|
+
async def add_log(self, log_entry: CDPTargetLogEntry):
|
|
188
|
+
"""
|
|
189
|
+
Updates the channel statistics based on a new log entry.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
log_entry (CDPTargetLogEntry): The new log entry to incorporate into the statistics.
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
self.num_logs += 1
|
|
196
|
+
self.last_log_time = log_entry.datetime
|
|
197
|
+
|
|
198
|
+
if log_entry.level not in self.log_level_stats:
|
|
199
|
+
self.log_level_stats[log_entry.level] = CDPLogLevelStats(num_logs=1, last_log_time=log_entry.datetime)
|
|
200
|
+
else:
|
|
201
|
+
self.log_level_stats[log_entry.level].num_logs += 1
|
|
202
|
+
self.log_level_stats[log_entry.level].last_log_time = log_entry.datetime
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class CDPTargetTypeStats(DictModel):
|
|
206
|
+
"""
|
|
207
|
+
Dataclass to store statistics for a specific target type.
|
|
208
|
+
|
|
209
|
+
Attributes:
|
|
210
|
+
num_targets (int): The count of targets of this type.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
num_targets: int
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class CDPMainLogEntry(DictModel):
|
|
217
|
+
"""
|
|
218
|
+
Represents a summary log entry for the entire logging system.
|
|
219
|
+
|
|
220
|
+
Attributes:
|
|
221
|
+
num_channels (int): The total number of active logging channels (targets).
|
|
222
|
+
targets_types_stats (Dict[str, CDPTargetTypeStats]): Statistics grouped by target type.
|
|
223
|
+
num_logs (int): The total number of log entries across all channels.
|
|
224
|
+
log_level_stats (Dict[str, CDPLogLevelStats]): Overall statistics for each log level.
|
|
225
|
+
channels_stats (Sequence[CDPLoggerChannelStats]): A List of statistics for each active logging channel.
|
|
226
|
+
"""
|
|
227
|
+
|
|
228
|
+
num_channels: int
|
|
229
|
+
targets_types_stats: Dict[str, CDPTargetTypeStats]
|
|
230
|
+
num_logs: int
|
|
231
|
+
log_level_stats: Dict[str, CDPLogLevelStats]
|
|
232
|
+
channels_stats: Sequence[CDPLoggerChannelStats]
|