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,258 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from typing import Optional, Tuple
|
|
3
|
+
from osn_selenium.dev_tools.models import TargetData
|
|
4
|
+
from osn_selenium.dev_tools.settings import LoggerSettings
|
|
5
|
+
from osn_selenium.exceptions.devtools import TrioEndExceptions
|
|
6
|
+
from osn_selenium.dev_tools._validators import validate_log_filter
|
|
7
|
+
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
8
|
+
from osn_selenium.dev_tools.logger.models import (
|
|
9
|
+
CDPTargetLogEntry,
|
|
10
|
+
FingerprintTargetLogEntry
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["TargetLogger", "build_target_logger"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TargetLogger:
|
|
18
|
+
"""
|
|
19
|
+
Manages logging for a specific browser target (e.g., a tab or iframe).
|
|
20
|
+
|
|
21
|
+
Each `TargetLogger` instance is responsible for writing log entries
|
|
22
|
+
related to its associated `TargetData` to a dedicated file.
|
|
23
|
+
|
|
24
|
+
Attributes:
|
|
25
|
+
_target_data (TargetData): The data of the browser target this logger is associated with.
|
|
26
|
+
_nursery_object (trio.Nursery): The Trio nursery for managing concurrent tasks.
|
|
27
|
+
_cdp_log_level_filter (Optional[Callable[[Any], bool]]): Filter function for CDP log levels.
|
|
28
|
+
_cdp_target_type_filter (Optional[Callable[[Any], bool]]): Filter function for CDP target types.
|
|
29
|
+
_cdp_file_writing_stopped (Optional[trio.Event]): An event set when CDP file writing task stops.
|
|
30
|
+
_cdp_file_path (Optional[Path]): The path to the target-specific CDP log file.
|
|
31
|
+
_is_active (bool): Flag indicating if the target logger is active.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
logger_settings: LoggerSettings,
|
|
37
|
+
nursery_object: trio.Nursery,
|
|
38
|
+
target_data: TargetData,
|
|
39
|
+
cdp_receive_channel: Optional[trio.MemoryReceiveChannel[CDPTargetLogEntry]],
|
|
40
|
+
fingerprint_receive_channel: Optional[trio.MemoryReceiveChannel[FingerprintTargetLogEntry]],
|
|
41
|
+
):
|
|
42
|
+
"""
|
|
43
|
+
Initializes the TargetLogger.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
logger_settings (LoggerSettings): Configuration for logging.
|
|
47
|
+
nursery_object (trio.Nursery): The Trio nursery to spawn background tasks.
|
|
48
|
+
target_data (TargetData): The data of the browser target this logger will log for.
|
|
49
|
+
cdp_receive_channel (Optional[trio.MemoryReceiveChannel[CDPTargetLogEntry]]):
|
|
50
|
+
Channel to receive CDP logs.
|
|
51
|
+
fingerprint_receive_channel (Optional[trio.MemoryReceiveChannel[FingerprintTargetLogEntry]]):
|
|
52
|
+
Channel to receive fingerprint logs.
|
|
53
|
+
|
|
54
|
+
Raises:
|
|
55
|
+
ValueError: If settings require logging but `dir_path` is not set.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
self._target_data = target_data
|
|
59
|
+
self._nursery_object = nursery_object
|
|
60
|
+
self._cdp_receive_channel = cdp_receive_channel
|
|
61
|
+
self._fingerprint_receive_channel = fingerprint_receive_channel
|
|
62
|
+
self._cdp_file_path = None
|
|
63
|
+
self._cdp_log_level_filter = None
|
|
64
|
+
self._cdp_target_type_filter = None
|
|
65
|
+
self._fingerprint_file_path = None
|
|
66
|
+
self._fingerprint_log_level_filter = None
|
|
67
|
+
self._fingerprint_target_type_filter = None
|
|
68
|
+
|
|
69
|
+
if logger_settings.dir_path is None:
|
|
70
|
+
if logger_settings.cdp_settings:
|
|
71
|
+
raise ValueError("Can't log CDP without LoggerSettings.dir_path!")
|
|
72
|
+
|
|
73
|
+
if logger_settings.fingerprint_settings:
|
|
74
|
+
raise ValueError("Can't log Fingerprint without LoggerSettings.log_dir_path!")
|
|
75
|
+
else:
|
|
76
|
+
logdir_path = logger_settings.dir_path.joinpath(target_data.target_id)
|
|
77
|
+
logdir_path.mkdir(exist_ok=True)
|
|
78
|
+
|
|
79
|
+
if logger_settings.cdp_settings:
|
|
80
|
+
self._cdp_file_path = logdir_path.joinpath(f"cdp_log.txt")
|
|
81
|
+
|
|
82
|
+
self._cdp_log_level_filter = validate_log_filter(
|
|
83
|
+
logger_settings.cdp_settings.log_level_filter_mode,
|
|
84
|
+
logger_settings.cdp_settings.log_level_filter
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
self._cdp_target_type_filter = validate_log_filter(
|
|
88
|
+
logger_settings.cdp_settings.target_type_filter_mode,
|
|
89
|
+
logger_settings.cdp_settings.target_type_filter
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
if logger_settings.fingerprint_settings:
|
|
93
|
+
self._fingerprint_file_path = logdir_path.joinpath(f"fingerprint_log.txt")
|
|
94
|
+
|
|
95
|
+
self._fingerprint_log_level_filter = validate_log_filter(
|
|
96
|
+
logger_settings.fingerprint_settings.log_level_filter_mode,
|
|
97
|
+
logger_settings.fingerprint_settings.log_level_filter
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
self._fingerprint_category_filter = validate_log_filter(
|
|
101
|
+
logger_settings.fingerprint_settings.category_filter_mode,
|
|
102
|
+
logger_settings.fingerprint_settings.category_filter
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
self._cdp_file_writing_stopped: Optional[trio.Event] = None
|
|
106
|
+
self._fingerprint_file_writing_stopped: Optional[trio.Event] = None
|
|
107
|
+
self._is_active = False
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def is_active(self) -> bool:
|
|
111
|
+
"""
|
|
112
|
+
Checks if the target logger is currently active.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
bool: True if the logger is active and running, False otherwise.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
return self._is_active
|
|
119
|
+
|
|
120
|
+
async def close(self):
|
|
121
|
+
"""
|
|
122
|
+
Closes the target logger, including its receive channels and stops writing tasks.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
if self._cdp_receive_channel is not None:
|
|
126
|
+
await self._cdp_receive_channel.aclose()
|
|
127
|
+
self._cdp_receive_channel = None
|
|
128
|
+
|
|
129
|
+
if self._cdp_file_writing_stopped is not None:
|
|
130
|
+
await self._cdp_file_writing_stopped.wait()
|
|
131
|
+
self._cdp_file_writing_stopped = None
|
|
132
|
+
|
|
133
|
+
if self._fingerprint_receive_channel is not None:
|
|
134
|
+
await self._fingerprint_receive_channel.aclose()
|
|
135
|
+
self._fingerprint_receive_channel = None
|
|
136
|
+
|
|
137
|
+
if self._fingerprint_file_writing_stopped is not None:
|
|
138
|
+
await self._fingerprint_file_writing_stopped.wait()
|
|
139
|
+
self._fingerprint_file_writing_stopped = None
|
|
140
|
+
|
|
141
|
+
self._is_active = False
|
|
142
|
+
|
|
143
|
+
async def _write_fingerprint_file(self):
|
|
144
|
+
"""
|
|
145
|
+
Asynchronously writes fingerprint log entries to the target-specific file.
|
|
146
|
+
|
|
147
|
+
This method continuously receives `FingerprintTargetLogEntry` objects,
|
|
148
|
+
filters them, and appends them to the log file.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
end_of_entry = "\n\n" + "=" * 100 + "\n\n"
|
|
153
|
+
|
|
154
|
+
async with await trio.open_file(self._fingerprint_file_path, "a+", encoding="utf-8") as file:
|
|
155
|
+
async for log_entry in self._fingerprint_receive_channel:
|
|
156
|
+
if self._fingerprint_log_level_filter(log_entry.level) and self._fingerprint_category_filter(log_entry.api):
|
|
157
|
+
await file.write(log_entry.model_dump_json(indent=4) + end_of_entry)
|
|
158
|
+
await file.flush()
|
|
159
|
+
except* TrioEndExceptions:
|
|
160
|
+
pass
|
|
161
|
+
except* BaseException as error:
|
|
162
|
+
log_exception(error)
|
|
163
|
+
finally:
|
|
164
|
+
if self._fingerprint_file_writing_stopped is not None:
|
|
165
|
+
self._fingerprint_file_writing_stopped.set()
|
|
166
|
+
|
|
167
|
+
async def _write_cdp_file(self):
|
|
168
|
+
"""
|
|
169
|
+
Asynchronously writes CDP log entries to the target-specific file.
|
|
170
|
+
|
|
171
|
+
This method continuously receives `CDPTargetLogEntry` objects from its channel
|
|
172
|
+
and appends their string representation to the configured file,
|
|
173
|
+
applying log level and target type filters.
|
|
174
|
+
It runs as a background task.
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
try:
|
|
178
|
+
end_of_entry = "\n\n" + "=" * 100 + "\n\n"
|
|
179
|
+
|
|
180
|
+
async with await trio.open_file(self._cdp_file_path, "a+", encoding="utf-8") as file:
|
|
181
|
+
async for log_entry in self._cdp_receive_channel:
|
|
182
|
+
if self._cdp_log_level_filter(log_entry.level) and self._cdp_target_type_filter(log_entry.target_data.type_):
|
|
183
|
+
await file.write(log_entry.model_dump_json(indent=4) + end_of_entry)
|
|
184
|
+
await file.flush()
|
|
185
|
+
except* TrioEndExceptions:
|
|
186
|
+
pass
|
|
187
|
+
except* BaseException as error:
|
|
188
|
+
log_exception(error)
|
|
189
|
+
finally:
|
|
190
|
+
if self._cdp_file_writing_stopped is not None:
|
|
191
|
+
self._cdp_file_writing_stopped.set()
|
|
192
|
+
|
|
193
|
+
async def run(self):
|
|
194
|
+
"""
|
|
195
|
+
Starts the target logger, setting up its receive channel and file writing task.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
if not self._is_active:
|
|
200
|
+
self._cdp_file_writing_stopped = trio.Event()
|
|
201
|
+
|
|
202
|
+
if self._cdp_file_path is not None:
|
|
203
|
+
self._nursery_object.start_soon(self._write_cdp_file)
|
|
204
|
+
|
|
205
|
+
self._fingerprint_file_writing_stopped = trio.Event()
|
|
206
|
+
|
|
207
|
+
if self._fingerprint_file_path is not None:
|
|
208
|
+
self._nursery_object.start_soon(self._write_fingerprint_file)
|
|
209
|
+
|
|
210
|
+
self._is_active = True
|
|
211
|
+
except* TrioEndExceptions:
|
|
212
|
+
await self.close()
|
|
213
|
+
except* BaseException as error:
|
|
214
|
+
log_exception(error)
|
|
215
|
+
await self.close()
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def build_target_logger(
|
|
219
|
+
target_data: TargetData,
|
|
220
|
+
nursery_object: trio.Nursery,
|
|
221
|
+
logger_settings: LoggerSettings
|
|
222
|
+
) -> Tuple[
|
|
223
|
+
Optional[trio.MemorySendChannel[CDPTargetLogEntry]],
|
|
224
|
+
Optional[trio.MemorySendChannel[FingerprintTargetLogEntry]],
|
|
225
|
+
TargetLogger
|
|
226
|
+
]:
|
|
227
|
+
"""
|
|
228
|
+
Builds and initializes a `TargetLogger` instance.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
target_data (TargetData): Data associated with the target.
|
|
232
|
+
nursery_object (trio.Nursery): Trio nursery for background tasks.
|
|
233
|
+
logger_settings (LoggerSettings): Logger configuration.
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
Tuple[Optional[trio.MemorySendChannel[CDPTargetLogEntry]], Optional[trio.MemorySendChannel[FingerprintTargetLogEntry]], TargetLogger]:
|
|
237
|
+
Tuple containing send channels for logs and the initialized logger instance.
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
if logger_settings.cdp_settings is not None:
|
|
241
|
+
cdp_send, cdp_recv = trio.open_memory_channel(logger_settings.cdp_settings.buffer_size)
|
|
242
|
+
else:
|
|
243
|
+
cdp_send, cdp_recv = None, None
|
|
244
|
+
|
|
245
|
+
if logger_settings.fingerprint_settings is not None:
|
|
246
|
+
fp_send, fp_recv = trio.open_memory_channel(logger_settings.fingerprint_settings.buffer_size)
|
|
247
|
+
else:
|
|
248
|
+
fp_send, fp_recv = None, None
|
|
249
|
+
|
|
250
|
+
target_logger = TargetLogger(
|
|
251
|
+
logger_settings=logger_settings,
|
|
252
|
+
nursery_object=nursery_object,
|
|
253
|
+
target_data=target_data,
|
|
254
|
+
cdp_receive_channel=cdp_recv,
|
|
255
|
+
fingerprint_receive_channel=fp_recv,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
return cdp_send, fp_send, target_logger
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from osn_selenium.dev_tools.manager.settings import SettingsMixin
|
|
2
|
+
from osn_selenium.dev_tools.manager.lifecycle import LifecycleMixin
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
__all__ = ["DevTools"]
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class DevTools(LifecycleMixin, SettingsMixin):
|
|
9
|
+
"""
|
|
10
|
+
Main entry point for managing Chrome DevTools Protocol (CDP) interactions.
|
|
11
|
+
|
|
12
|
+
This class combines lifecycle management, settings configuration, and target handling
|
|
13
|
+
to provide a comprehensive interface for controlling browser behavior via CDP.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
pass
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from contextlib import (
|
|
3
|
+
AbstractAsyncContextManager
|
|
4
|
+
)
|
|
5
|
+
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
6
|
+
from osn_selenium.dev_tools.logger.main import MainLogger
|
|
7
|
+
from osn_selenium.dev_tools.domains import DomainsSettings
|
|
8
|
+
from osn_selenium.dev_tools._wrappers import DevToolsPackage
|
|
9
|
+
from osn_selenium.dev_tools.settings import DevToolsSettings
|
|
10
|
+
from typing import (
|
|
11
|
+
Any,
|
|
12
|
+
Dict,
|
|
13
|
+
Optional,
|
|
14
|
+
TYPE_CHECKING
|
|
15
|
+
)
|
|
16
|
+
from osn_selenium.dev_tools._system_utils import prepare_log_dir
|
|
17
|
+
from selenium.webdriver.remote.bidi_connection import BidiConnection
|
|
18
|
+
from osn_selenium.dev_tools.logger.models import (
|
|
19
|
+
CDPLogLevelStats,
|
|
20
|
+
CDPMainLogEntry,
|
|
21
|
+
CDPTargetTypeStats,
|
|
22
|
+
FingerprintAPIStats,
|
|
23
|
+
FingerprintLogLevelStats,
|
|
24
|
+
FingerprintMainLogEntry
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
__all__ = ["BaseMixin"]
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from osn_selenium.webdrivers.trio_threads.core import CoreWebDriver
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BaseMixin:
|
|
35
|
+
"""
|
|
36
|
+
Base class for handling DevTools functionalities in Selenium WebDriver.
|
|
37
|
+
|
|
38
|
+
Provides an interface to interact with Chrome DevTools Protocol (CDP)
|
|
39
|
+
for advanced browser control and monitoring. This class supports event handling
|
|
40
|
+
and allows for dynamic modifications of browser behavior, such as network request interception,
|
|
41
|
+
by using an asynchronous context manager.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
_webdriver (CoreWebDriver): The parent WebDriver instance associated with this DevTools instance.
|
|
45
|
+
_new_targets_filter (Optional[List[Dict[str, Any]]]): Processed filters for new targets.
|
|
46
|
+
_new_targets_buffer_size (int): Buffer size for new target events.
|
|
47
|
+
_target_background_task (Optional[devtools_background_func_type]): Optional background task for targets.
|
|
48
|
+
_logger_settings (LoggerSettings): Logging configuration for the entire DevTools manager.
|
|
49
|
+
_bidi_connection (Optional[AbstractAsyncContextManager[BidiConnection, Any]]): Asynchronous context manager for the BiDi connection.
|
|
50
|
+
_bidi_connection_object (Optional[BidiConnection]): The BiDi connection object when active.
|
|
51
|
+
_nursery (Optional[AbstractAsyncContextManager[trio.Nursery, object]]): Asynchronous context manager for the Trio nursery.
|
|
52
|
+
_nursery_object (Optional[trio.Nursery]): The Trio nursery object when active, managing concurrent tasks.
|
|
53
|
+
_domains_settings (DomainsSettings): Settings for configuring DevTools domain handlers.
|
|
54
|
+
_handling_targets (Dict[str, DevToolsTarget]): Dictionary of target IDs currently being handled by event listeners.
|
|
55
|
+
targets_lock (trio.Lock): A lock used for synchronizing access to shared resources, like the List of handled targets.
|
|
56
|
+
exit_event (Optional[trio.Event]): Trio Event to signal exiting of DevTools event handling.
|
|
57
|
+
_is_active (bool): Flag indicating if the DevTools event handler is currently active.
|
|
58
|
+
_is_closing (bool): Flag indicating if the DevTools manager is in the process of closing.
|
|
59
|
+
_num_cdp_logs (int): Total count of all CDP log entries across all targets.
|
|
60
|
+
_num_fingerprint_logs (int): Total count of all Fingerprint log entries across all targets.
|
|
61
|
+
_cdp_targets_types_stats (Dict[str, CDPTargetTypeStats]): Statistics for each target type.
|
|
62
|
+
_cdp_log_level_stats (Dict[str, CDPLogLevelStats]): Overall statistics for each log level.
|
|
63
|
+
_main_logger_cdp_send_channel (Optional[trio.MemorySendChannel[CDPMainLogEntry]]): Send channel for the main logger.
|
|
64
|
+
_fingerprint_categories_stats (Dict[str, FingerprintAPIStats]): Statistics for each API category.
|
|
65
|
+
_fingerprint_log_level_stats (Dict[str, FingerprintLogLevelStats]): Overall statistics for each log level.
|
|
66
|
+
_main_logger_fingerprint_send_channel (Optional[trio.MemorySendChannel[FingerprintMainLogEntry]]): Send channel for the main logger.
|
|
67
|
+
_main_logger (Optional[MainLogger]): The main logger instance.
|
|
68
|
+
_fingerprint_injection_script (Optional[str]): Injection script for fingerprinting.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def __init__(
|
|
72
|
+
self,
|
|
73
|
+
parent_webdriver: "CoreWebDriver",
|
|
74
|
+
devtools_settings: Optional[DevToolsSettings] = None
|
|
75
|
+
):
|
|
76
|
+
"""
|
|
77
|
+
Initializes the DevTools manager.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
parent_webdriver (CoreWebDriver): The WebDriver instance to which this DevTools manager is attached.
|
|
81
|
+
devtools_settings (Optional[DevToolsSettings]): Configuration settings for DevTools.
|
|
82
|
+
If None, default settings will be used.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
if devtools_settings is None:
|
|
86
|
+
devtools_settings = DevToolsSettings()
|
|
87
|
+
|
|
88
|
+
self._webdriver = parent_webdriver
|
|
89
|
+
self._logger_settings = devtools_settings.logger_settings
|
|
90
|
+
self._domains_settings = devtools_settings.domains_settings
|
|
91
|
+
self._fingerprint_settings = devtools_settings.fingerprint_settings
|
|
92
|
+
self._new_targets_buffer_size = devtools_settings.new_targets_buffer_size
|
|
93
|
+
self._target_background_task = devtools_settings.target_background_task
|
|
94
|
+
|
|
95
|
+
self._new_targets_filter = [
|
|
96
|
+
filter_.model_dump(exclude_none=True, by_alias=True)
|
|
97
|
+
for filter_ in devtools_settings.new_targets_filter
|
|
98
|
+
] if devtools_settings.new_targets_filter is not None else None
|
|
99
|
+
|
|
100
|
+
self._bidi_connection: Optional[AbstractAsyncContextManager[BidiConnection, Any]] = None
|
|
101
|
+
self._bidi_connection_object: Optional[BidiConnection] = None
|
|
102
|
+
self._devtools_package: Optional[DevToolsPackage] = None
|
|
103
|
+
self._websocket_url: Optional[str] = None
|
|
104
|
+
self._nursery: Optional[AbstractAsyncContextManager[trio.Nursery, Optional[bool]]] = None
|
|
105
|
+
self._nursery_object: Optional[trio.Nursery] = None
|
|
106
|
+
self._handling_targets: Dict[str, DevToolsTarget] = {}
|
|
107
|
+
self.targets_lock = trio.Lock()
|
|
108
|
+
self.exit_event: Optional[trio.Event] = None
|
|
109
|
+
self._is_active = False
|
|
110
|
+
self._is_closing = False
|
|
111
|
+
self._num_cdp_logs = 0
|
|
112
|
+
self._num_fingerprint_logs = 0
|
|
113
|
+
self._cdp_targets_types_stats: Dict[str, CDPTargetTypeStats] = {}
|
|
114
|
+
self._cdp_log_level_stats: Dict[str, CDPLogLevelStats] = {}
|
|
115
|
+
self._main_logger_cdp_send_channel: Optional[trio.MemorySendChannel[CDPMainLogEntry]] = None
|
|
116
|
+
self._fingerprint_categories_stats: Dict[str, FingerprintAPIStats] = {}
|
|
117
|
+
self._fingerprint_log_level_stats: Dict[str, FingerprintLogLevelStats] = {}
|
|
118
|
+
self._main_logger_fingerprint_send_channel: Optional[trio.MemorySendChannel[FingerprintMainLogEntry]] = None
|
|
119
|
+
self._main_logger: Optional[MainLogger] = None
|
|
120
|
+
self._fingerprint_injection_script: Optional[str] = None
|
|
121
|
+
|
|
122
|
+
prepare_log_dir(logger_settings=devtools_settings.logger_settings)
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def is_active(self) -> bool:
|
|
126
|
+
"""
|
|
127
|
+
Checks if DevTools is currently active.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
bool: True if DevTools event handler context manager is active, False otherwise.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
return self._is_active
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def websocket_url(self) -> Optional[str]:
|
|
137
|
+
"""
|
|
138
|
+
Gets the WebSocket URL for the DevTools session.
|
|
139
|
+
|
|
140
|
+
This URL is used to establish a direct Chrome DevTools Protocol (CDP) connection
|
|
141
|
+
to the browser, enabling low-level control and event listening.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Optional[str]: The WebSocket URL, or None if it has not been retrieved yet.
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
return self._websocket_url
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from types import TracebackType
|
|
3
|
+
from typing import Optional, Type
|
|
4
|
+
from osn_selenium.dev_tools._decorators import log_on_error
|
|
5
|
+
from osn_selenium.dev_tools._wrappers import DevToolsPackage
|
|
6
|
+
from osn_selenium.dev_tools.manager.targets import TargetsMixin
|
|
7
|
+
from osn_selenium.dev_tools.logger.main import build_main_logger
|
|
8
|
+
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
9
|
+
from osn_selenium.exceptions.devtools import (
|
|
10
|
+
BidiConnectionNotEstablishedError,
|
|
11
|
+
CDPEndExceptions,
|
|
12
|
+
CantEnterDevToolsContextError
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = ["LifecycleMixin"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class LifecycleMixin(TargetsMixin):
|
|
20
|
+
"""
|
|
21
|
+
Mixin managing the lifecycle of the DevTools context, including connection setup and teardown.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def _get_websocket_url(self) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Retrieves the WebSocket URL for DevTools from the WebDriver.
|
|
27
|
+
|
|
28
|
+
This method attempts to get the WebSocket URL from the WebDriver capabilities or by directly querying the CDP details.
|
|
29
|
+
The WebSocket URL is necessary to establish a connection to the browser's DevTools.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
None: The WebSocket URL for DevTools, or None if it cannot be retrieved.
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
CDPEndExceptions: If a CDP-related connection error occurs.
|
|
36
|
+
BaseException: If another unexpected error occurs during URL retrieval.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
driver = self._webdriver.driver
|
|
41
|
+
|
|
42
|
+
if driver is None:
|
|
43
|
+
self._websocket_url = None
|
|
44
|
+
|
|
45
|
+
if driver.caps.get("se:cdp"):
|
|
46
|
+
self._websocket_url = driver.caps.get("se:cdp")
|
|
47
|
+
|
|
48
|
+
self._websocket_url = driver._get_cdp_details()[1]
|
|
49
|
+
except CDPEndExceptions as error:
|
|
50
|
+
raise error
|
|
51
|
+
except BaseException as error:
|
|
52
|
+
log_exception(error)
|
|
53
|
+
raise error
|
|
54
|
+
|
|
55
|
+
def _get_devtools_package(self) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Retrieves the DevTools protocol package from the active BiDi connection.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
DevToolsPackage: The DevTools protocol package object, providing access to CDP domains and commands.
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
BidiConnectionNotEstablishedError: If the BiDi connection is not active.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
if self._bidi_connection_object is not None:
|
|
68
|
+
self._devtools_package = DevToolsPackage(package=self._bidi_connection_object.devtools)
|
|
69
|
+
else:
|
|
70
|
+
raise BidiConnectionNotEstablishedError()
|
|
71
|
+
except CDPEndExceptions as error:
|
|
72
|
+
raise error
|
|
73
|
+
except BaseException as error:
|
|
74
|
+
log_exception(error)
|
|
75
|
+
raise error
|
|
76
|
+
|
|
77
|
+
async def run(self) -> None:
|
|
78
|
+
"""
|
|
79
|
+
Initializes and runs the DevTools manager.
|
|
80
|
+
|
|
81
|
+
This method sets up the BiDi connection, starts the Trio nursery, retrieves
|
|
82
|
+
necessary CDP packages and URLs, initializes the main logger, and adds the
|
|
83
|
+
initial target to be monitored.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
CantEnterDevToolsContextError: If the WebDriver is not initialized.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
if self._webdriver.driver is None:
|
|
90
|
+
raise CantEnterDevToolsContextError(reason="Driver is not initialized")
|
|
91
|
+
|
|
92
|
+
self._bidi_connection = self._webdriver.bidi_connection()
|
|
93
|
+
self._bidi_connection_object = await self._bidi_connection.__aenter__()
|
|
94
|
+
|
|
95
|
+
self._nursery = trio.open_nursery()
|
|
96
|
+
self._nursery_object = await self._nursery.__aenter__()
|
|
97
|
+
|
|
98
|
+
self._get_devtools_package()
|
|
99
|
+
self._get_websocket_url()
|
|
100
|
+
|
|
101
|
+
self._main_logger_cdp_send_channel, self._main_logger_fingerprint_send_channel, self._main_logger = build_main_logger(self._nursery_object, self._logger_settings)
|
|
102
|
+
await self._main_logger.run()
|
|
103
|
+
|
|
104
|
+
self.exit_event = trio.Event()
|
|
105
|
+
|
|
106
|
+
self._fingerprint_injection_script = await self._webdriver.sync_to_trio(sync_function=self._fingerprint_settings.generate_js)()
|
|
107
|
+
main_target = (await self._get_all_targets())[0]
|
|
108
|
+
|
|
109
|
+
await self._add_target(target_event=main_target, is_main_target=True)
|
|
110
|
+
|
|
111
|
+
self._is_active = True
|
|
112
|
+
|
|
113
|
+
async def __aenter__(self):
|
|
114
|
+
"""
|
|
115
|
+
Enters the asynchronous context for DevTools event handling.
|
|
116
|
+
|
|
117
|
+
This method establishes the BiDi connection, initializes the Trio nursery,
|
|
118
|
+
sets up the main target, and starts listening for DevTools events.
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
CantEnterDevToolsContextError: If the WebDriver is not initialized.
|
|
122
|
+
BaseException: If any other unexpected error occurs during context entry.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
await self.run()
|
|
126
|
+
|
|
127
|
+
async def stop(
|
|
128
|
+
self,
|
|
129
|
+
exc_type: Optional[Type[BaseException]],
|
|
130
|
+
exc_val: Optional[BaseException],
|
|
131
|
+
exc_tb: Optional[TracebackType],
|
|
132
|
+
) -> None:
|
|
133
|
+
"""
|
|
134
|
+
Stops the DevTools manager and cleans up resources.
|
|
135
|
+
|
|
136
|
+
This method signals all targets to stop, closes the main logger, cancels the nursery,
|
|
137
|
+
and closes the BiDi connection.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
exc_type (Optional[Type[BaseException]]): The exception type if stopping due to an error.
|
|
141
|
+
exc_val (Optional[BaseException]): The exception value if stopping due to an error.
|
|
142
|
+
exc_tb (Optional[TracebackType]): The traceback if stopping due to an error.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
@log_on_error
|
|
146
|
+
async def _stop_main_logger():
|
|
147
|
+
"""Stops the main logger and closes its channels."""
|
|
148
|
+
|
|
149
|
+
if self._main_logger_cdp_send_channel is not None:
|
|
150
|
+
await self._main_logger_cdp_send_channel.aclose()
|
|
151
|
+
self._main_logger_cdp_send_channel = None
|
|
152
|
+
|
|
153
|
+
if self._main_logger_fingerprint_send_channel is not None:
|
|
154
|
+
await self._main_logger_fingerprint_send_channel.aclose()
|
|
155
|
+
self._main_logger_fingerprint_send_channel = None
|
|
156
|
+
|
|
157
|
+
if self._main_logger is not None:
|
|
158
|
+
await self._main_logger.close()
|
|
159
|
+
self._main_logger = None
|
|
160
|
+
|
|
161
|
+
@log_on_error
|
|
162
|
+
async def _stop_all_targets():
|
|
163
|
+
"""Signals all active targets to stop and waits for their completion."""
|
|
164
|
+
|
|
165
|
+
for target in self._handling_targets.copy().values():
|
|
166
|
+
try:
|
|
167
|
+
await target.stop()
|
|
168
|
+
await target.stopped_event.wait()
|
|
169
|
+
except (BaseException):
|
|
170
|
+
pass
|
|
171
|
+
|
|
172
|
+
self._handling_targets = {}
|
|
173
|
+
|
|
174
|
+
@log_on_error
|
|
175
|
+
async def _close_nursery():
|
|
176
|
+
"""Asynchronously exits the Trio nursery context manager."""
|
|
177
|
+
|
|
178
|
+
if self._nursery_object is not None:
|
|
179
|
+
self._nursery_object.cancel_scope.cancel()
|
|
180
|
+
self._nursery_object = None
|
|
181
|
+
|
|
182
|
+
if self._nursery is not None:
|
|
183
|
+
await self._nursery.__aexit__(exc_type, exc_val, exc_tb)
|
|
184
|
+
self._nursery = None
|
|
185
|
+
|
|
186
|
+
@log_on_error
|
|
187
|
+
async def _close_bidi_connection():
|
|
188
|
+
"""Asynchronously exits the BiDi connection context manager."""
|
|
189
|
+
|
|
190
|
+
if self._bidi_connection is not None:
|
|
191
|
+
await self._bidi_connection.__aexit__(exc_type, exc_val, exc_tb)
|
|
192
|
+
self._bidi_connection = None
|
|
193
|
+
self._bidi_connection_object = None
|
|
194
|
+
|
|
195
|
+
if self._is_active:
|
|
196
|
+
self._is_closing = True
|
|
197
|
+
self.exit_event.set()
|
|
198
|
+
|
|
199
|
+
await _stop_all_targets()
|
|
200
|
+
await _stop_main_logger()
|
|
201
|
+
await _close_nursery()
|
|
202
|
+
await _close_bidi_connection()
|
|
203
|
+
|
|
204
|
+
self.exit_event = None
|
|
205
|
+
self._devtools_package = None
|
|
206
|
+
self._websocket_url = None
|
|
207
|
+
self._num_cdp_logs = 0
|
|
208
|
+
self._num_fingerprint_logs = 0
|
|
209
|
+
self._cdp_targets_types_stats = {}
|
|
210
|
+
self._cdp_log_level_stats = {}
|
|
211
|
+
self._fingerprint_categories_stats = {}
|
|
212
|
+
self._fingerprint_log_level_stats = {}
|
|
213
|
+
self._is_active = False
|
|
214
|
+
self._is_closing = False
|
|
215
|
+
|
|
216
|
+
async def __aexit__(
|
|
217
|
+
self,
|
|
218
|
+
exc_type: Optional[Type[BaseException]],
|
|
219
|
+
exc_val: Optional[BaseException],
|
|
220
|
+
exc_tb: Optional[TracebackType],
|
|
221
|
+
):
|
|
222
|
+
"""
|
|
223
|
+
Asynchronously exits the DevTools event handling context.
|
|
224
|
+
|
|
225
|
+
This method is called when exiting an `async with` block with a DevTools instance.
|
|
226
|
+
It ensures that all event listeners are cancelled, the Trio nursery is closed,
|
|
227
|
+
and the BiDi connection is properly shut down. Cleanup attempts are made even if
|
|
228
|
+
an exception occurred within the `async with` block.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
exc_type (Optional[Type[BaseException]]): The exception type, if any, that caused the context to be exited.
|
|
232
|
+
exc_val (Optional[BaseException]): The exception value, if any.
|
|
233
|
+
exc_tb (Optional[TracebackType]): The exception traceback, if any.
|
|
234
|
+
"""
|
|
235
|
+
|
|
236
|
+
await self.stop(exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb)
|