osn-selenium 0.0.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- osn_selenium/_base_models.py +41 -0
- osn_selenium/_cdp_import.py +253 -0
- osn_selenium/_functions.py +84 -0
- osn_selenium/_typehints.py +19 -0
- osn_selenium/abstract/executors/cdp/__init__.py +435 -0
- osn_selenium/abstract/executors/cdp/accessibility.py +62 -0
- osn_selenium/abstract/executors/cdp/animation.py +47 -0
- osn_selenium/abstract/executors/cdp/audits.py +39 -0
- osn_selenium/abstract/executors/cdp/autofill.py +34 -0
- osn_selenium/abstract/executors/cdp/background_service.py +22 -0
- osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +95 -0
- osn_selenium/abstract/executors/cdp/browser.py +122 -0
- osn_selenium/abstract/executors/cdp/cache_storage.py +49 -0
- osn_selenium/abstract/executors/cdp/cast.py +31 -0
- osn_selenium/abstract/executors/cdp/console.py +18 -0
- osn_selenium/abstract/executors/cdp/css.py +197 -0
- osn_selenium/abstract/executors/cdp/debugger.py +198 -0
- osn_selenium/abstract/executors/cdp/device_access.py +22 -0
- osn_selenium/abstract/executors/cdp/device_orientation.py +14 -0
- osn_selenium/abstract/executors/cdp/dom.py +305 -0
- osn_selenium/abstract/executors/cdp/dom_debugger.py +57 -0
- osn_selenium/abstract/executors/cdp/dom_snapshot.py +42 -0
- osn_selenium/abstract/executors/cdp/dom_storage.py +31 -0
- osn_selenium/abstract/executors/cdp/emulation.py +259 -0
- osn_selenium/abstract/executors/cdp/event_breakpoints.py +18 -0
- osn_selenium/abstract/executors/cdp/extensions.py +31 -0
- osn_selenium/abstract/executors/cdp/fed_cm.py +35 -0
- osn_selenium/abstract/executors/cdp/fetch.py +76 -0
- osn_selenium/abstract/executors/cdp/file_system.py +11 -0
- osn_selenium/abstract/executors/cdp/headless_experimental.py +30 -0
- osn_selenium/abstract/executors/cdp/heap_profiler.py +73 -0
- osn_selenium/abstract/executors/cdp/indexed_db.py +99 -0
- osn_selenium/abstract/executors/cdp/input.py +158 -0
- osn_selenium/abstract/executors/cdp/inspector.py +14 -0
- osn_selenium/abstract/executors/cdp/io.py +24 -0
- osn_selenium/abstract/executors/cdp/layer_tree.py +61 -0
- osn_selenium/abstract/executors/cdp/log.py +27 -0
- osn_selenium/abstract/executors/cdp/media.py +14 -0
- osn_selenium/abstract/executors/cdp/memory.py +61 -0
- osn_selenium/abstract/executors/cdp/network.py +252 -0
- osn_selenium/abstract/executors/cdp/overlay.py +166 -0
- osn_selenium/abstract/executors/cdp/page.py +347 -0
- osn_selenium/abstract/executors/cdp/performance.py +28 -0
- osn_selenium/abstract/executors/cdp/performance_timeline.py +11 -0
- osn_selenium/abstract/executors/cdp/preload.py +14 -0
- osn_selenium/abstract/executors/cdp/profiler.py +54 -0
- osn_selenium/abstract/executors/cdp/pwa.py +46 -0
- osn_selenium/abstract/executors/cdp/runtime.py +176 -0
- osn_selenium/abstract/executors/cdp/schema.py +11 -0
- osn_selenium/abstract/executors/cdp/security.py +26 -0
- osn_selenium/abstract/executors/cdp/service_worker.py +54 -0
- osn_selenium/abstract/executors/cdp/storage.py +175 -0
- osn_selenium/abstract/executors/cdp/system_info.py +24 -0
- osn_selenium/abstract/executors/cdp/target.py +125 -0
- osn_selenium/abstract/executors/cdp/tethering.py +14 -0
- osn_selenium/abstract/executors/cdp/tracing.py +48 -0
- osn_selenium/abstract/executors/cdp/web_audio.py +19 -0
- osn_selenium/abstract/executors/cdp/web_authn.py +76 -0
- osn_selenium/abstract/executors/cdp.py +63 -0
- osn_selenium/abstract/executors/javascript.py +203 -0
- osn_selenium/abstract/instances/action_chains/__init__.py +12 -0
- osn_selenium/abstract/instances/action_chains/base.py +25 -0
- osn_selenium/abstract/instances/action_chains/click.py +93 -0
- osn_selenium/abstract/instances/action_chains/drag_and_drop.py +46 -0
- osn_selenium/abstract/instances/action_chains/hm_keyboard.py +44 -0
- osn_selenium/abstract/instances/action_chains/hm_move.py +104 -0
- osn_selenium/abstract/instances/action_chains/hm_scroll.py +75 -0
- osn_selenium/abstract/instances/action_chains/keyboard.py +79 -0
- osn_selenium/abstract/instances/action_chains/move.py +60 -0
- osn_selenium/abstract/instances/action_chains/scroll.py +61 -0
- osn_selenium/abstract/instances/action_chains/utils.py +44 -0
- osn_selenium/abstract/instances/alert.py +67 -0
- osn_selenium/abstract/instances/browser.py +76 -0
- osn_selenium/abstract/instances/browsing_context.py +310 -0
- osn_selenium/abstract/instances/dialog.py +107 -0
- osn_selenium/abstract/instances/fedcm.py +133 -0
- osn_selenium/abstract/instances/mobile.py +79 -0
- osn_selenium/abstract/instances/network.py +100 -0
- osn_selenium/abstract/instances/permissions.py +52 -0
- osn_selenium/abstract/instances/script.py +109 -0
- osn_selenium/abstract/instances/shadow_root.py +81 -0
- osn_selenium/abstract/instances/storage.py +98 -0
- osn_selenium/abstract/instances/switch_to.py +104 -0
- osn_selenium/abstract/instances/web_driver_wait.py +57 -0
- osn_selenium/abstract/instances/web_element.py +395 -0
- osn_selenium/abstract/instances/web_extension.py +70 -0
- osn_selenium/abstract/webdriver/blink/__init__.py +18 -0
- osn_selenium/abstract/webdriver/blink/base.py +80 -0
- osn_selenium/abstract/webdriver/blink/casting.py +82 -0
- osn_selenium/abstract/webdriver/blink/features.py +51 -0
- osn_selenium/abstract/webdriver/blink/lifecycle.py +76 -0
- osn_selenium/abstract/webdriver/blink/logging.py +40 -0
- osn_selenium/abstract/webdriver/blink/network.py +45 -0
- osn_selenium/abstract/webdriver/blink/settings.py +68 -0
- osn_selenium/abstract/webdriver/chrome/__init__.py +18 -0
- osn_selenium/abstract/webdriver/chrome/base.py +36 -0
- osn_selenium/abstract/webdriver/chrome/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/chrome/settings.py +110 -0
- osn_selenium/abstract/webdriver/core/__init__.py +16 -0
- osn_selenium/abstract/webdriver/core/actions.py +58 -0
- osn_selenium/abstract/webdriver/core/auth.py +145 -0
- osn_selenium/abstract/webdriver/core/base.py +298 -0
- osn_selenium/abstract/webdriver/core/capture.py +84 -0
- osn_selenium/abstract/webdriver/core/components.py +82 -0
- osn_selenium/abstract/webdriver/core/devtools.py +69 -0
- osn_selenium/abstract/webdriver/core/element.py +55 -0
- osn_selenium/abstract/webdriver/core/file.py +82 -0
- osn_selenium/abstract/webdriver/core/lifecycle.py +103 -0
- osn_selenium/abstract/webdriver/core/navigation.py +65 -0
- osn_selenium/abstract/webdriver/core/script.py +88 -0
- osn_selenium/abstract/webdriver/core/settings.py +43 -0
- osn_selenium/abstract/webdriver/core/storage.py +81 -0
- osn_selenium/abstract/webdriver/core/timeouts.py +101 -0
- osn_selenium/abstract/webdriver/core/window.py +237 -0
- osn_selenium/abstract/webdriver/edge/__init__.py +18 -0
- osn_selenium/abstract/webdriver/edge/base.py +36 -0
- osn_selenium/abstract/webdriver/edge/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/edge/settings.py +110 -0
- osn_selenium/abstract/webdriver/yandex/__init__.py +18 -0
- osn_selenium/abstract/webdriver/yandex/base.py +18 -0
- osn_selenium/abstract/webdriver/yandex/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/yandex/settings.py +110 -0
- osn_selenium/base_mixin.py +122 -0
- osn_selenium/browsers_handler/__init__.py +47 -17
- osn_selenium/browsers_handler/_linux.py +226 -0
- osn_selenium/browsers_handler/_windows.py +21 -14
- osn_selenium/browsers_handler/{types.py → models.py} +5 -2
- osn_selenium/dev_tools/_decorators.py +149 -0
- osn_selenium/dev_tools/_exception_helpers.py +116 -0
- osn_selenium/dev_tools/_functions.py +174 -0
- osn_selenium/dev_tools/_system_utils.py +35 -0
- osn_selenium/dev_tools/_typehints.py +35 -0
- osn_selenium/dev_tools/_validators.py +227 -0
- osn_selenium/dev_tools/_wrappers.py +92 -0
- osn_selenium/dev_tools/domains/__init__.py +7 -40
- osn_selenium/dev_tools/domains/abstract.py +98 -254
- osn_selenium/dev_tools/domains/fetch.py +229 -906
- osn_selenium/dev_tools/domains_default/fetch.py +40 -28
- osn_selenium/dev_tools/filters.py +40 -0
- osn_selenium/dev_tools/logger/main.py +214 -0
- osn_selenium/dev_tools/logger/models.py +232 -0
- osn_selenium/dev_tools/logger/target.py +278 -0
- osn_selenium/dev_tools/manager/__init__.py +16 -0
- osn_selenium/dev_tools/manager/base.py +124 -0
- osn_selenium/dev_tools/manager/lifecycle.py +236 -0
- osn_selenium/dev_tools/manager/logging.py +153 -0
- osn_selenium/dev_tools/manager/settings.py +89 -0
- osn_selenium/dev_tools/manager/targets.py +175 -0
- osn_selenium/dev_tools/models.py +49 -0
- osn_selenium/dev_tools/settings.py +139 -0
- osn_selenium/dev_tools/target/__init__.py +16 -0
- osn_selenium/dev_tools/target/base.py +427 -0
- osn_selenium/dev_tools/target/detach.py +54 -0
- osn_selenium/dev_tools/target/discovery.py +112 -0
- osn_selenium/dev_tools/target/events.py +120 -0
- osn_selenium/dev_tools/target/fingerprint.py +126 -0
- osn_selenium/dev_tools/target/lifecycle.py +184 -0
- osn_selenium/dev_tools/target/logging.py +163 -0
- osn_selenium/exceptions/__init__.py +1 -0
- osn_selenium/exceptions/base.py +9 -0
- osn_selenium/exceptions/configuration.py +84 -0
- osn_selenium/exceptions/dependencies.py +60 -0
- osn_selenium/exceptions/devtools.py +114 -0
- osn_selenium/exceptions/flags.py +45 -0
- osn_selenium/exceptions/instance.py +92 -0
- osn_selenium/exceptions/javascript.py +31 -0
- osn_selenium/exceptions/logic.py +31 -0
- osn_selenium/exceptions/path.py +77 -0
- osn_selenium/exceptions/platform.py +33 -0
- osn_selenium/exceptions/protocol.py +86 -0
- osn_selenium/exceptions/webdriver.py +44 -0
- osn_selenium/exceptions/window.py +63 -0
- osn_selenium/executors/__init__.py +1 -0
- osn_selenium/executors/sync/__init__.py +1 -0
- osn_selenium/executors/sync/cdp/__init__.py +550 -0
- osn_selenium/executors/sync/cdp/accessibility.py +74 -0
- osn_selenium/executors/sync/cdp/animation.py +50 -0
- osn_selenium/executors/sync/cdp/audits.py +48 -0
- osn_selenium/executors/sync/cdp/autofill.py +39 -0
- osn_selenium/executors/sync/cdp/background_service.py +30 -0
- osn_selenium/executors/sync/cdp/bluetooth_emulation.py +101 -0
- osn_selenium/executors/sync/cdp/browser.py +131 -0
- osn_selenium/executors/sync/cdp/cache_storage.py +66 -0
- osn_selenium/executors/sync/cdp/cast.py +38 -0
- osn_selenium/executors/sync/cdp/console.py +24 -0
- osn_selenium/executors/sync/cdp/css.py +187 -0
- osn_selenium/executors/sync/cdp/debugger.py +206 -0
- osn_selenium/executors/sync/cdp/device_access.py +27 -0
- osn_selenium/executors/sync/cdp/device_orientation.py +24 -0
- osn_selenium/executors/sync/cdp/dom.py +310 -0
- osn_selenium/executors/sync/cdp/dom_debugger.py +56 -0
- osn_selenium/executors/sync/cdp/dom_snapshot.py +58 -0
- osn_selenium/executors/sync/cdp/dom_storage.py +38 -0
- osn_selenium/executors/sync/cdp/emulation.py +270 -0
- osn_selenium/executors/sync/cdp/event_breakpoints.py +27 -0
- osn_selenium/executors/sync/cdp/extensions.py +39 -0
- osn_selenium/executors/sync/cdp/fed_cm.py +45 -0
- osn_selenium/executors/sync/cdp/fetch.py +96 -0
- osn_selenium/executors/sync/cdp/file_system.py +18 -0
- osn_selenium/executors/sync/cdp/headless_experimental.py +44 -0
- osn_selenium/executors/sync/cdp/heap_profiler.py +89 -0
- osn_selenium/executors/sync/cdp/indexed_db.py +142 -0
- osn_selenium/executors/sync/cdp/input.py +233 -0
- osn_selenium/executors/sync/cdp/inspector.py +21 -0
- osn_selenium/executors/sync/cdp/io.py +33 -0
- osn_selenium/executors/sync/cdp/layer_tree.py +71 -0
- osn_selenium/executors/sync/cdp/log.py +35 -0
- osn_selenium/executors/sync/cdp/media.py +21 -0
- osn_selenium/executors/sync/cdp/memory.py +62 -0
- osn_selenium/executors/sync/cdp/network.py +287 -0
- osn_selenium/executors/sync/cdp/overlay.py +174 -0
- osn_selenium/executors/sync/cdp/page.py +365 -0
- osn_selenium/executors/sync/cdp/performance.py +33 -0
- osn_selenium/executors/sync/cdp/performance_timeline.py +26 -0
- osn_selenium/executors/sync/cdp/preload.py +21 -0
- osn_selenium/executors/sync/cdp/profiler.py +58 -0
- osn_selenium/executors/sync/cdp/pwa.py +55 -0
- osn_selenium/executors/sync/cdp/runtime.py +221 -0
- osn_selenium/executors/sync/cdp/schema.py +23 -0
- osn_selenium/executors/sync/cdp/security.py +30 -0
- osn_selenium/executors/sync/cdp/service_worker.py +56 -0
- osn_selenium/executors/sync/cdp/storage.py +151 -0
- osn_selenium/executors/sync/cdp/system_info.py +30 -0
- osn_selenium/executors/sync/cdp/target.py +147 -0
- osn_selenium/executors/sync/cdp/tethering.py +21 -0
- osn_selenium/executors/sync/cdp/tracing.py +62 -0
- osn_selenium/executors/sync/cdp/web_audio.py +24 -0
- osn_selenium/executors/sync/cdp/web_authn.py +82 -0
- osn_selenium/executors/sync/cdp.py +100 -0
- osn_selenium/executors/sync/javascript.py +79 -0
- osn_selenium/executors/trio_threads/__init__.py +1 -0
- osn_selenium/executors/trio_threads/cdp/__init__.py +771 -0
- osn_selenium/executors/trio_threads/cdp/accessibility.py +87 -0
- osn_selenium/executors/trio_threads/cdp/animation.py +63 -0
- osn_selenium/executors/trio_threads/cdp/audits.py +57 -0
- osn_selenium/executors/trio_threads/cdp/autofill.py +52 -0
- osn_selenium/executors/trio_threads/cdp/background_service.py +40 -0
- osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +111 -0
- osn_selenium/executors/trio_threads/cdp/browser.py +140 -0
- osn_selenium/executors/trio_threads/cdp/cache_storage.py +79 -0
- osn_selenium/executors/trio_threads/cdp/cast.py +47 -0
- osn_selenium/executors/trio_threads/cdp/console.py +33 -0
- osn_selenium/executors/trio_threads/cdp/css.py +196 -0
- osn_selenium/executors/trio_threads/cdp/debugger.py +219 -0
- osn_selenium/executors/trio_threads/cdp/device_access.py +40 -0
- osn_selenium/executors/trio_threads/cdp/device_orientation.py +34 -0
- osn_selenium/executors/trio_threads/cdp/dom.py +319 -0
- osn_selenium/executors/trio_threads/cdp/dom_debugger.py +69 -0
- osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +71 -0
- osn_selenium/executors/trio_threads/cdp/dom_storage.py +51 -0
- osn_selenium/executors/trio_threads/cdp/emulation.py +283 -0
- osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +37 -0
- osn_selenium/executors/trio_threads/cdp/extensions.py +52 -0
- osn_selenium/executors/trio_threads/cdp/fed_cm.py +54 -0
- osn_selenium/executors/trio_threads/cdp/fetch.py +105 -0
- osn_selenium/executors/trio_threads/cdp/file_system.py +31 -0
- osn_selenium/executors/trio_threads/cdp/headless_experimental.py +54 -0
- osn_selenium/executors/trio_threads/cdp/heap_profiler.py +102 -0
- osn_selenium/executors/trio_threads/cdp/indexed_db.py +155 -0
- osn_selenium/executors/trio_threads/cdp/input.py +242 -0
- osn_selenium/executors/trio_threads/cdp/inspector.py +34 -0
- osn_selenium/executors/trio_threads/cdp/io.py +42 -0
- osn_selenium/executors/trio_threads/cdp/layer_tree.py +84 -0
- osn_selenium/executors/trio_threads/cdp/log.py +44 -0
- osn_selenium/executors/trio_threads/cdp/media.py +30 -0
- osn_selenium/executors/trio_threads/cdp/memory.py +71 -0
- osn_selenium/executors/trio_threads/cdp/network.py +296 -0
- osn_selenium/executors/trio_threads/cdp/overlay.py +183 -0
- osn_selenium/executors/trio_threads/cdp/page.py +374 -0
- osn_selenium/executors/trio_threads/cdp/performance.py +46 -0
- osn_selenium/executors/trio_threads/cdp/performance_timeline.py +36 -0
- osn_selenium/executors/trio_threads/cdp/preload.py +30 -0
- osn_selenium/executors/trio_threads/cdp/profiler.py +71 -0
- osn_selenium/executors/trio_threads/cdp/pwa.py +64 -0
- osn_selenium/executors/trio_threads/cdp/runtime.py +230 -0
- osn_selenium/executors/trio_threads/cdp/schema.py +32 -0
- osn_selenium/executors/trio_threads/cdp/security.py +43 -0
- osn_selenium/executors/trio_threads/cdp/service_worker.py +69 -0
- osn_selenium/executors/trio_threads/cdp/storage.py +162 -0
- osn_selenium/executors/trio_threads/cdp/system_info.py +43 -0
- osn_selenium/executors/trio_threads/cdp/target.py +156 -0
- osn_selenium/executors/trio_threads/cdp/tethering.py +34 -0
- osn_selenium/executors/trio_threads/cdp/tracing.py +71 -0
- osn_selenium/executors/trio_threads/cdp/web_audio.py +37 -0
- osn_selenium/executors/trio_threads/cdp/web_authn.py +95 -0
- osn_selenium/executors/trio_threads/cdp.py +104 -0
- osn_selenium/executors/trio_threads/javascript.py +90 -0
- osn_selenium/executors/unified/__init__.py +1 -0
- osn_selenium/executors/unified/cdp/__init__.py +1 -0
- osn_selenium/executors/unified/cdp/accessibility.py +81 -0
- osn_selenium/executors/unified/cdp/animation.py +50 -0
- osn_selenium/executors/unified/cdp/audits.py +45 -0
- osn_selenium/executors/unified/cdp/autofill.py +41 -0
- osn_selenium/executors/unified/cdp/background_service.py +24 -0
- osn_selenium/executors/unified/cdp/bluetooth_emulation.py +132 -0
- osn_selenium/executors/unified/cdp/browser.py +143 -0
- osn_selenium/executors/unified/cdp/cache_storage.py +69 -0
- osn_selenium/executors/unified/cdp/cast.py +32 -0
- osn_selenium/executors/unified/cdp/console.py +18 -0
- osn_selenium/executors/unified/cdp/css.py +237 -0
- osn_selenium/executors/unified/cdp/debugger.py +243 -0
- osn_selenium/executors/unified/cdp/device_access.py +21 -0
- osn_selenium/executors/unified/cdp/device_orientation.py +18 -0
- osn_selenium/executors/unified/cdp/dom.py +380 -0
- osn_selenium/executors/unified/cdp/dom_debugger.py +65 -0
- osn_selenium/executors/unified/cdp/dom_snapshot.py +58 -0
- osn_selenium/executors/unified/cdp/dom_storage.py +38 -0
- osn_selenium/executors/unified/cdp/emulation.py +312 -0
- osn_selenium/executors/unified/cdp/event_breakpoints.py +24 -0
- osn_selenium/executors/unified/cdp/extensions.py +45 -0
- osn_selenium/executors/unified/cdp/fed_cm.py +51 -0
- osn_selenium/executors/unified/cdp/fetch.py +111 -0
- osn_selenium/executors/unified/cdp/file_system.py +15 -0
- osn_selenium/executors/unified/cdp/headless_experimental.py +38 -0
- osn_selenium/executors/unified/cdp/heap_profiler.py +101 -0
- osn_selenium/executors/unified/cdp/indexed_db.py +157 -0
- osn_selenium/executors/unified/cdp/input.py +254 -0
- osn_selenium/executors/unified/cdp/inspector.py +15 -0
- osn_selenium/executors/unified/cdp/io.py +29 -0
- osn_selenium/executors/unified/cdp/layer_tree.py +71 -0
- osn_selenium/executors/unified/cdp/log.py +29 -0
- osn_selenium/executors/unified/cdp/media.py +15 -0
- osn_selenium/executors/unified/cdp/memory.py +59 -0
- osn_selenium/executors/unified/cdp/network.py +323 -0
- osn_selenium/executors/unified/cdp/overlay.py +209 -0
- osn_selenium/executors/unified/cdp/page.py +410 -0
- osn_selenium/executors/unified/cdp/performance.py +27 -0
- osn_selenium/executors/unified/cdp/performance_timeline.py +17 -0
- osn_selenium/executors/unified/cdp/preload.py +15 -0
- osn_selenium/executors/unified/cdp/profiler.py +55 -0
- osn_selenium/executors/unified/cdp/pwa.py +55 -0
- osn_selenium/executors/unified/cdp/runtime.py +245 -0
- osn_selenium/executors/unified/cdp/schema.py +17 -0
- osn_selenium/executors/unified/cdp/security.py +27 -0
- osn_selenium/executors/unified/cdp/service_worker.py +62 -0
- osn_selenium/executors/unified/cdp/storage.py +178 -0
- osn_selenium/executors/unified/cdp/system_info.py +24 -0
- osn_selenium/executors/unified/cdp/target.py +165 -0
- osn_selenium/executors/unified/cdp/tethering.py +15 -0
- osn_selenium/executors/unified/cdp/tracing.py +62 -0
- osn_selenium/executors/unified/cdp/web_audio.py +18 -0
- osn_selenium/executors/unified/cdp/web_authn.py +103 -0
- osn_selenium/executors/unified/javascript.py +104 -0
- osn_selenium/flags/__init__.py +1 -0
- osn_selenium/flags/_functions.py +45 -0
- osn_selenium/flags/_typehints.py +34 -0
- osn_selenium/flags/_validators.py +101 -0
- osn_selenium/{webdrivers/BaseDriver/flags.py → flags/base.py} +159 -245
- osn_selenium/{webdrivers/Blink/flags.py → flags/blink.py} +130 -374
- osn_selenium/flags/chrome.py +259 -0
- osn_selenium/flags/edge.py +259 -0
- osn_selenium/flags/models/__init__.py +1 -0
- osn_selenium/flags/models/base.py +130 -0
- osn_selenium/flags/models/blink.py +263 -0
- osn_selenium/{webdrivers/Chrome/flags.py → flags/models/chrome.py} +25 -75
- osn_selenium/{webdrivers/Edge/flags.py → flags/models/edge.py} +25 -75
- osn_selenium/flags/models/values.py +44 -0
- osn_selenium/{webdrivers/Yandex/flags.py → flags/models/yandex.py} +26 -76
- osn_selenium/flags/yandex.py +259 -0
- osn_selenium/instances/__init__.py +1 -0
- osn_selenium/instances/_functions.py +242 -0
- osn_selenium/instances/_typehints.py +148 -0
- osn_selenium/instances/_utils.py +143 -0
- osn_selenium/instances/convert.py +287 -0
- osn_selenium/instances/protocols.py +105 -0
- osn_selenium/instances/sync/__init__.py +1 -0
- osn_selenium/instances/sync/action_chains/__init__.py +32 -0
- osn_selenium/instances/sync/action_chains/base.py +74 -0
- osn_selenium/instances/sync/action_chains/click.py +61 -0
- osn_selenium/instances/sync/action_chains/drag_and_drop.py +45 -0
- osn_selenium/instances/sync/action_chains/hm_keyboard.py +37 -0
- osn_selenium/instances/sync/action_chains/hm_move.py +81 -0
- osn_selenium/instances/sync/action_chains/hm_scroll.py +60 -0
- osn_selenium/instances/sync/action_chains/keyboard.py +55 -0
- osn_selenium/instances/sync/action_chains/move.py +46 -0
- osn_selenium/instances/sync/action_chains/scroll.py +43 -0
- osn_selenium/instances/sync/action_chains/utils.py +30 -0
- osn_selenium/instances/sync/alert.py +69 -0
- osn_selenium/instances/sync/browser.py +72 -0
- osn_selenium/instances/sync/browsing_context.py +193 -0
- osn_selenium/instances/sync/dialog.py +81 -0
- osn_selenium/instances/sync/fedcm.py +92 -0
- osn_selenium/instances/sync/mobile.py +75 -0
- osn_selenium/instances/sync/network.py +90 -0
- osn_selenium/instances/sync/permissions.py +80 -0
- osn_selenium/instances/sync/script.py +77 -0
- osn_selenium/instances/sync/shadow_root.py +113 -0
- osn_selenium/instances/sync/storage.py +91 -0
- osn_selenium/instances/sync/switch_to.py +92 -0
- osn_selenium/instances/sync/web_driver_wait.py +83 -0
- osn_selenium/instances/sync/web_element.py +179 -0
- osn_selenium/instances/sync/web_extension.py +77 -0
- osn_selenium/instances/trio_threads/__init__.py +1 -0
- osn_selenium/instances/trio_threads/action_chains/__init__.py +32 -0
- osn_selenium/instances/trio_threads/action_chains/base.py +88 -0
- osn_selenium/instances/trio_threads/action_chains/click.py +71 -0
- osn_selenium/instances/trio_threads/action_chains/drag_and_drop.py +49 -0
- osn_selenium/instances/trio_threads/action_chains/hm_keyboard.py +41 -0
- osn_selenium/instances/trio_threads/action_chains/hm_move.py +91 -0
- osn_selenium/instances/trio_threads/action_chains/hm_scroll.py +66 -0
- osn_selenium/instances/trio_threads/action_chains/keyboard.py +63 -0
- osn_selenium/instances/trio_threads/action_chains/move.py +52 -0
- osn_selenium/instances/trio_threads/action_chains/scroll.py +49 -0
- osn_selenium/instances/trio_threads/action_chains/utils.py +32 -0
- osn_selenium/instances/trio_threads/alert.py +87 -0
- osn_selenium/instances/trio_threads/browser.py +90 -0
- osn_selenium/instances/trio_threads/browsing_context.py +216 -0
- osn_selenium/instances/trio_threads/dialog.py +99 -0
- osn_selenium/instances/trio_threads/fedcm.py +110 -0
- osn_selenium/instances/trio_threads/mobile.py +93 -0
- osn_selenium/instances/trio_threads/network.py +108 -0
- osn_selenium/instances/trio_threads/permissions.py +102 -0
- osn_selenium/instances/trio_threads/script.py +95 -0
- osn_selenium/instances/trio_threads/shadow_root.py +154 -0
- osn_selenium/instances/trio_threads/storage.py +109 -0
- osn_selenium/instances/trio_threads/switch_to.py +124 -0
- osn_selenium/instances/trio_threads/web_driver_wait.py +101 -0
- osn_selenium/instances/trio_threads/web_element.py +217 -0
- osn_selenium/instances/trio_threads/web_extension.py +99 -0
- osn_selenium/instances/unified/__init__.py +1 -0
- osn_selenium/instances/unified/action_chains/__init__.py +22 -0
- osn_selenium/instances/unified/action_chains/base.py +31 -0
- osn_selenium/instances/unified/action_chains/click.py +27 -0
- osn_selenium/instances/unified/action_chains/drag_and_drop.py +24 -0
- osn_selenium/instances/unified/action_chains/hm_keyboard.py +30 -0
- osn_selenium/instances/unified/action_chains/hm_move.py +66 -0
- osn_selenium/instances/unified/action_chains/hm_scroll.py +79 -0
- osn_selenium/instances/unified/action_chains/keyboard.py +24 -0
- osn_selenium/instances/unified/action_chains/move.py +24 -0
- osn_selenium/instances/unified/action_chains/scroll.py +21 -0
- osn_selenium/instances/unified/action_chains/utils.py +19 -0
- osn_selenium/instances/unified/alert.py +29 -0
- osn_selenium/instances/unified/browser.py +33 -0
- osn_selenium/instances/unified/browsing_context.py +151 -0
- osn_selenium/instances/unified/dialog.py +42 -0
- osn_selenium/instances/unified/fedcm.py +48 -0
- osn_selenium/instances/unified/mobile.py +36 -0
- osn_selenium/instances/unified/network.py +50 -0
- osn_selenium/instances/unified/permissions.py +43 -0
- osn_selenium/instances/unified/script.py +38 -0
- osn_selenium/instances/unified/shadow_root.py +46 -0
- osn_selenium/instances/unified/storage.py +48 -0
- osn_selenium/instances/unified/switch_to.py +49 -0
- osn_selenium/instances/unified/web_driver_wait.py +45 -0
- osn_selenium/instances/unified/web_element.py +145 -0
- osn_selenium/instances/unified/web_extension.py +38 -0
- osn_selenium/javascript/__init__.py +1 -0
- osn_selenium/javascript/_functions.py +63 -0
- osn_selenium/javascript/fingerprint/__init__.py +120 -0
- osn_selenium/javascript/fingerprint/_decorators.py +41 -0
- osn_selenium/javascript/fingerprint/_detect/__init__.py +1 -0
- osn_selenium/javascript/fingerprint/_detect/functions.py +253 -0
- osn_selenium/javascript/fingerprint/_detect/templates.py +128 -0
- osn_selenium/javascript/fingerprint/_functions.py +35 -0
- osn_selenium/javascript/fingerprint/_typehints.py +27 -0
- osn_selenium/javascript/fingerprint/registry/__init__.py +7 -0
- osn_selenium/javascript/fingerprint/registry/_core_functions.py +236 -0
- osn_selenium/javascript/fingerprint/registry/_functions.py +923 -0
- osn_selenium/javascript/fingerprint/registry/_typehints.py +6 -0
- osn_selenium/javascript/fingerprint/registry/_utils.py +6 -0
- osn_selenium/javascript/fingerprint/registry/models.py +41 -0
- osn_selenium/javascript/fingerprint/spoof/__init__.py +1 -0
- osn_selenium/javascript/fingerprint/spoof/_functions.py +172 -0
- osn_selenium/javascript/fingerprint/spoof/_templates.py +134 -0
- osn_selenium/javascript/fingerprint/spoof/_typehints.py +22 -0
- osn_selenium/javascript/fingerprint/spoof/core_rules.py +141 -0
- osn_selenium/javascript/fingerprint/spoof/noise.py +51 -0
- osn_selenium/javascript/fingerprint/spoof/rules.py +313 -0
- osn_selenium/javascript/functions.py +44 -0
- osn_selenium/javascript/models.py +35 -0
- osn_selenium/javascript/scripts/start_fingerprint_detection.js +56 -0
- osn_selenium/models.py +94 -0
- osn_selenium/trio_threads_mixin.py +159 -0
- osn_selenium/webdrivers/_args_helpers.py +181 -0
- osn_selenium/webdrivers/_bridges.py +57 -0
- osn_selenium/webdrivers/_decorators.py +83 -0
- osn_selenium/webdrivers/_executable_tables/__init__.py +1 -0
- osn_selenium/webdrivers/_executable_tables/functions.py +113 -0
- osn_selenium/webdrivers/_executable_tables/models.py +19 -0
- osn_selenium/webdrivers/_typehints.py +10 -0
- osn_selenium/webdrivers/protocols.py +50 -0
- osn_selenium/webdrivers/sync/__init__.py +1 -0
- osn_selenium/webdrivers/sync/blink/__init__.py +124 -0
- osn_selenium/webdrivers/sync/blink/base.py +140 -0
- osn_selenium/webdrivers/sync/blink/casting.py +34 -0
- osn_selenium/webdrivers/sync/blink/features.py +28 -0
- osn_selenium/webdrivers/sync/blink/lifecycle.py +66 -0
- osn_selenium/webdrivers/sync/blink/logging.py +25 -0
- osn_selenium/webdrivers/sync/blink/network.py +28 -0
- osn_selenium/webdrivers/sync/blink/settings.py +63 -0
- osn_selenium/webdrivers/sync/chrome/__init__.py +102 -0
- osn_selenium/webdrivers/sync/chrome/base.py +118 -0
- osn_selenium/webdrivers/sync/chrome/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/chrome/settings.py +58 -0
- osn_selenium/webdrivers/sync/core/__init__.py +100 -0
- osn_selenium/webdrivers/sync/core/actions.py +59 -0
- osn_selenium/webdrivers/sync/core/auth.py +77 -0
- osn_selenium/webdrivers/sync/core/base.py +175 -0
- osn_selenium/webdrivers/sync/core/capture.py +37 -0
- osn_selenium/webdrivers/sync/core/comonents.py +57 -0
- osn_selenium/webdrivers/sync/core/devtools.py +47 -0
- osn_selenium/webdrivers/sync/core/element.py +42 -0
- osn_selenium/webdrivers/sync/core/file.py +40 -0
- osn_selenium/webdrivers/sync/core/lifecycle.py +59 -0
- osn_selenium/webdrivers/sync/core/navigation.py +36 -0
- osn_selenium/webdrivers/sync/core/script.py +53 -0
- osn_selenium/webdrivers/sync/core/settings.py +35 -0
- osn_selenium/webdrivers/sync/core/storage.py +48 -0
- osn_selenium/webdrivers/sync/core/timeouts.py +59 -0
- osn_selenium/webdrivers/sync/core/window.py +99 -0
- osn_selenium/webdrivers/sync/edge/__init__.py +102 -0
- osn_selenium/webdrivers/sync/edge/base.py +114 -0
- osn_selenium/webdrivers/sync/edge/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/edge/settings.py +58 -0
- osn_selenium/webdrivers/sync/yandex/__init__.py +102 -0
- osn_selenium/webdrivers/sync/yandex/base.py +111 -0
- osn_selenium/webdrivers/sync/yandex/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/yandex/settings.py +58 -0
- osn_selenium/webdrivers/trio_threads/__init__.py +1 -0
- osn_selenium/webdrivers/trio_threads/blink/__init__.py +134 -0
- osn_selenium/webdrivers/trio_threads/blink/base.py +143 -0
- osn_selenium/webdrivers/trio_threads/blink/casting.py +35 -0
- osn_selenium/webdrivers/trio_threads/blink/features.py +29 -0
- osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +66 -0
- osn_selenium/webdrivers/trio_threads/blink/logging.py +26 -0
- osn_selenium/webdrivers/trio_threads/blink/network.py +29 -0
- osn_selenium/webdrivers/trio_threads/blink/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/chrome/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/chrome/base.py +119 -0
- osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/chrome/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/core/__init__.py +115 -0
- osn_selenium/webdrivers/trio_threads/core/actions.py +72 -0
- osn_selenium/webdrivers/trio_threads/core/auth.py +88 -0
- osn_selenium/webdrivers/trio_threads/core/base.py +199 -0
- osn_selenium/webdrivers/trio_threads/core/capture.py +38 -0
- osn_selenium/webdrivers/trio_threads/core/comonents.py +92 -0
- osn_selenium/webdrivers/trio_threads/core/devtools.py +53 -0
- osn_selenium/webdrivers/trio_threads/core/element.py +58 -0
- osn_selenium/webdrivers/trio_threads/core/file.py +45 -0
- osn_selenium/webdrivers/trio_threads/core/lifecycle.py +60 -0
- osn_selenium/webdrivers/trio_threads/core/navigation.py +41 -0
- osn_selenium/webdrivers/trio_threads/core/script.py +59 -0
- osn_selenium/webdrivers/trio_threads/core/settings.py +36 -0
- osn_selenium/webdrivers/trio_threads/core/storage.py +54 -0
- osn_selenium/webdrivers/trio_threads/core/timeouts.py +60 -0
- osn_selenium/webdrivers/trio_threads/core/window.py +105 -0
- osn_selenium/webdrivers/trio_threads/edge/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/edge/base.py +115 -0
- osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/edge/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/yandex/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/yandex/base.py +112 -0
- osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/yandex/settings.py +63 -0
- osn_selenium/webdrivers/unified/__init__.py +1 -0
- osn_selenium/webdrivers/unified/blink/__init__.py +1 -0
- osn_selenium/webdrivers/unified/blink/base.py +135 -0
- osn_selenium/webdrivers/unified/blink/casting.py +30 -0
- osn_selenium/webdrivers/unified/blink/features.py +22 -0
- osn_selenium/webdrivers/unified/blink/lifecycle.py +114 -0
- osn_selenium/webdrivers/unified/blink/logging.py +18 -0
- osn_selenium/webdrivers/unified/blink/network.py +22 -0
- osn_selenium/webdrivers/unified/blink/settings.py +86 -0
- osn_selenium/webdrivers/unified/chrome/__init__.py +1 -0
- osn_selenium/webdrivers/unified/chrome/base.py +58 -0
- osn_selenium/webdrivers/unified/chrome/lifecycle.py +88 -0
- osn_selenium/webdrivers/unified/chrome/settings.py +48 -0
- osn_selenium/webdrivers/unified/core/__init__.py +1 -0
- osn_selenium/webdrivers/unified/core/actions.py +43 -0
- osn_selenium/webdrivers/unified/core/auth.py +70 -0
- osn_selenium/webdrivers/unified/core/base.py +139 -0
- osn_selenium/webdrivers/unified/core/capture.py +32 -0
- osn_selenium/webdrivers/unified/core/components.py +32 -0
- osn_selenium/webdrivers/unified/core/devtools.py +35 -0
- osn_selenium/webdrivers/unified/core/element.py +24 -0
- osn_selenium/webdrivers/unified/core/file.py +35 -0
- osn_selenium/webdrivers/unified/core/lifecycle.py +84 -0
- osn_selenium/webdrivers/unified/core/navigation.py +31 -0
- osn_selenium/webdrivers/unified/core/script.py +32 -0
- osn_selenium/webdrivers/unified/core/settings.py +44 -0
- osn_selenium/webdrivers/unified/core/storage.py +37 -0
- osn_selenium/webdrivers/unified/core/timeouts.py +56 -0
- osn_selenium/webdrivers/unified/core/window.py +135 -0
- osn_selenium/webdrivers/unified/edge/__init__.py +1 -0
- osn_selenium/webdrivers/unified/edge/base.py +56 -0
- osn_selenium/webdrivers/unified/edge/lifecycle.py +88 -0
- osn_selenium/webdrivers/unified/edge/settings.py +48 -0
- osn_selenium/webdrivers/unified/yandex/__init__.py +1 -0
- osn_selenium/webdrivers/unified/yandex/base.py +58 -0
- osn_selenium/webdrivers/unified/yandex/lifecycle.py +58 -0
- osn_selenium/webdrivers/unified/yandex/settings.py +48 -0
- osn_selenium-1.1.0.dist-info/METADATA +252 -0
- osn_selenium-1.1.0.dist-info/RECORD +615 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/WHEEL +1 -1
- osn_selenium/captcha_workers/__init__.py +0 -26
- osn_selenium/dev_tools/_types.py +0 -22
- osn_selenium/dev_tools/errors.py +0 -89
- osn_selenium/dev_tools/logger.py +0 -558
- osn_selenium/dev_tools/manager.py +0 -1551
- osn_selenium/dev_tools/utils.py +0 -509
- osn_selenium/errors.py +0 -16
- osn_selenium/types.py +0 -118
- osn_selenium/webdrivers/BaseDriver/_utils.py +0 -37
- osn_selenium/webdrivers/BaseDriver/protocols.py +0 -2135
- osn_selenium/webdrivers/BaseDriver/trio_wrapper.py +0 -71
- osn_selenium/webdrivers/BaseDriver/webdriver.py +0 -2626
- osn_selenium/webdrivers/Blink/protocols.py +0 -330
- osn_selenium/webdrivers/Blink/webdriver.py +0 -637
- osn_selenium/webdrivers/Chrome/protocols.py +0 -228
- osn_selenium/webdrivers/Chrome/webdriver.py +0 -394
- osn_selenium/webdrivers/Edge/protocols.py +0 -228
- osn_selenium/webdrivers/Edge/webdriver.py +0 -394
- osn_selenium/webdrivers/Yandex/protocols.py +0 -211
- osn_selenium/webdrivers/Yandex/webdriver.py +0 -350
- osn_selenium/webdrivers/_functions.py +0 -504
- osn_selenium/webdrivers/types.py +0 -390
- osn_selenium-0.0.0.dist-info/METADATA +0 -710
- osn_selenium-0.0.0.dist-info/RECORD +0 -57
- /osn_selenium/{webdrivers/BaseDriver → abstract}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Blink → abstract/executors}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Chrome → abstract/instances}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Edge → abstract/webdriver}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Yandex → dev_tools/logger}/__init__.py +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/check_element_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_document_scroll_size.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_css.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_rect_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_random_element_point_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_position.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_rect.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_size.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/open_new_tab.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/stop_window_loading.js +0 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from osn_selenium.dev_tools.models import TargetData
|
|
3
|
+
from selenium.webdriver.common.bidi.cdp import CdpSession
|
|
4
|
+
from osn_selenium.dev_tools._wrappers import DevToolsPackage
|
|
5
|
+
from osn_selenium.dev_tools.logger.target import TargetLogger
|
|
6
|
+
from typing import (
|
|
7
|
+
Any,
|
|
8
|
+
Callable,
|
|
9
|
+
Coroutine,
|
|
10
|
+
Dict,
|
|
11
|
+
Optional,
|
|
12
|
+
Sequence,
|
|
13
|
+
TYPE_CHECKING,
|
|
14
|
+
Tuple
|
|
15
|
+
)
|
|
16
|
+
from osn_selenium.dev_tools._validators import (
|
|
17
|
+
validate_target_event_filter,
|
|
18
|
+
validate_type_filter
|
|
19
|
+
)
|
|
20
|
+
from osn_selenium.dev_tools.logger.models import (
|
|
21
|
+
CDPLoggerChannelStats,
|
|
22
|
+
CDPTargetLogEntry,
|
|
23
|
+
FingerprintLoggerChannelStats,
|
|
24
|
+
FingerprintTargetLogEntry
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
__all__ = ["BaseMixin"]
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
32
|
+
from osn_selenium.dev_tools.domains import DomainsSettings
|
|
33
|
+
from osn_selenium.dev_tools.settings import LoggerSettings
|
|
34
|
+
from osn_selenium.dev_tools._typehints import DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class BaseMixin:
|
|
38
|
+
"""
|
|
39
|
+
Base mixin for DevToolsTarget providing initialization, properties, and logging functionality.
|
|
40
|
+
|
|
41
|
+
This class handles the core state of a DevTools target, including its data, logging channels,
|
|
42
|
+
filter configurations, and synchronization primitives.
|
|
43
|
+
|
|
44
|
+
Attributes:
|
|
45
|
+
target_data (TargetData): The essential data identifying the target (id, type, url, etc.).
|
|
46
|
+
devtools_package (DevToolsPackage): The wrapper for the DevTools protocol module.
|
|
47
|
+
websocket_url (Optional[str]): The WebSocket URL used to connect to this target.
|
|
48
|
+
exit_event (trio.Event): Event to signal global exit.
|
|
49
|
+
started_event (trio.Event): Event set when the target handling has started.
|
|
50
|
+
about_to_stop_event (trio.Event): Event set when the target is about to stop.
|
|
51
|
+
stopped_event (trio.Event): Event set when the target handling has fully stopped.
|
|
52
|
+
background_task_ended (Optional[trio.Event]): Event set when the background task completes.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
target_data: TargetData,
|
|
58
|
+
is_main_target: bool,
|
|
59
|
+
logger_settings: "LoggerSettings",
|
|
60
|
+
domains_settings: Optional["DomainsSettings"],
|
|
61
|
+
devtools_package: DevToolsPackage,
|
|
62
|
+
websocket_url: Optional[str],
|
|
63
|
+
new_targets_filter_list: Sequence[Dict[str, Any]],
|
|
64
|
+
new_targets_buffer_size: int,
|
|
65
|
+
nursery: trio.Nursery,
|
|
66
|
+
exit_event: trio.Event,
|
|
67
|
+
fingerprint_injection_script: Optional[str],
|
|
68
|
+
target_background_task: Optional["DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT"],
|
|
69
|
+
add_target_func: Callable[[Any], Coroutine[Any, Any, bool]],
|
|
70
|
+
remove_target_func: Callable[["DevToolsTarget"], Coroutine[Any, Any, Optional[bool]]],
|
|
71
|
+
add_cdp_log_func: Callable[[CDPTargetLogEntry], Coroutine[Any, Any, None]],
|
|
72
|
+
add_fingerprint_log_func: Callable[[FingerprintTargetLogEntry], Coroutine[Any, Any, None]],
|
|
73
|
+
):
|
|
74
|
+
"""
|
|
75
|
+
Initializes the BaseMixin.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
target_data (TargetData): Information about the target.
|
|
79
|
+
is_main_target (bool): Whether this is the primary target.
|
|
80
|
+
logger_settings ("LoggerSettings"): Configuration for logging.
|
|
81
|
+
domains_settings (Optional["DomainsSettings"]): Configuration for enabled domains and handlers.
|
|
82
|
+
devtools_package (DevToolsPackage): Access to CDP commands and events.
|
|
83
|
+
websocket_url (Optional[str]): The debugger URL.
|
|
84
|
+
new_targets_filter_list (Sequence[Mapping[str, Any]]): Filters for discovering new targets.
|
|
85
|
+
new_targets_buffer_size (int): Buffer size for new target events.
|
|
86
|
+
nursery (trio.Nursery): Trio nursery for background tasks.
|
|
87
|
+
exit_event (trio.Event): Signal to stop all operations.
|
|
88
|
+
fingerprint_injection_script (Optional[str]): JS script to inject into the target.
|
|
89
|
+
target_background_task (Optional[devtools_background_func_type]): Optional background task to run.
|
|
90
|
+
add_target_func (Callable[[Any], Coroutine[Any, Any, bool]]): Callback to add a new target.
|
|
91
|
+
remove_target_func (Callable[[DevToolsTarget], Coroutine[Any, Any, Optional[bool]]]): Callback to remove this target.
|
|
92
|
+
add_cdp_log_func (Callable[[CDPTargetLogEntry], Coroutine[Any, Any, None]]): Callback to record a CDP log entry.
|
|
93
|
+
add_fingerprint_log_func (Callable[[FingerprintTargetLogEntry], Coroutine[Any, Any, None]]): Callback to record a fingerprint log entry.
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
self.target_data = target_data
|
|
97
|
+
self._is_main_target = is_main_target
|
|
98
|
+
self._logger_settings = logger_settings
|
|
99
|
+
self._domains_settings = domains_settings
|
|
100
|
+
self.devtools_package = devtools_package
|
|
101
|
+
self.websocket_url = websocket_url
|
|
102
|
+
self._new_targets_filter_list = new_targets_filter_list
|
|
103
|
+
self._new_targets_buffer_size = new_targets_buffer_size
|
|
104
|
+
self._nursery_object = nursery
|
|
105
|
+
self.exit_event = exit_event
|
|
106
|
+
self._target_background_task = target_background_task
|
|
107
|
+
self._add_target_func = add_target_func
|
|
108
|
+
self._remove_target_func = remove_target_func
|
|
109
|
+
self._add_cdp_log_func = add_cdp_log_func
|
|
110
|
+
self._add_fingerprint_log_func = add_fingerprint_log_func
|
|
111
|
+
self._fingerprint_injection_script = fingerprint_injection_script
|
|
112
|
+
|
|
113
|
+
self._new_targets_events_filters = validate_target_event_filter(filter_=new_targets_filter_list)
|
|
114
|
+
|
|
115
|
+
self._cdp_target_type_log_accepted = validate_type_filter(
|
|
116
|
+
type_=self.type_,
|
|
117
|
+
filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
|
|
118
|
+
filter_instances=self._logger_settings.cdp_settings.target_type_filter
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
self._cdp_log_stats = CDPLoggerChannelStats(
|
|
122
|
+
target_id=target_data.target_id,
|
|
123
|
+
title=target_data.title,
|
|
124
|
+
url=target_data.url,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
self._fingerprint_log_stats = FingerprintLoggerChannelStats(
|
|
128
|
+
target_id=target_data.target_id,
|
|
129
|
+
title=target_data.title,
|
|
130
|
+
url=target_data.url,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
self.started_event = trio.Event()
|
|
134
|
+
self.about_to_stop_event = trio.Event()
|
|
135
|
+
self.background_task_ended: Optional[trio.Event] = None
|
|
136
|
+
self.stopped_event = trio.Event()
|
|
137
|
+
self._logger_cdp_send_channel: Optional[trio.MemorySendChannel[CDPTargetLogEntry]] = None
|
|
138
|
+
self._logger_fingerprint_send_channel: Optional[trio.MemorySendChannel[FingerprintTargetLogEntry]] = None
|
|
139
|
+
self._logger: Optional[TargetLogger] = None
|
|
140
|
+
self._cdp_session: Optional[CdpSession] = None
|
|
141
|
+
self._new_target_receive_channel: Optional[Tuple[trio.MemoryReceiveChannel, trio.Event]] = None
|
|
142
|
+
self._detached_receive_channel: Optional[trio.MemoryReceiveChannel] = None
|
|
143
|
+
self._events_receive_channels: Dict[str, Tuple[trio.MemoryReceiveChannel, trio.Event]] = {}
|
|
144
|
+
self._cancel_scopes: Dict[str, trio.CancelScope] = {}
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def type_(self) -> Optional[str]:
|
|
148
|
+
"""
|
|
149
|
+
Gets the type of the target (e.g., 'page', 'iframe').
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
Optional[str]: The target type.
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
return self.target_data.type_
|
|
156
|
+
|
|
157
|
+
@type_.setter
|
|
158
|
+
def type_(self, value: Optional[str]) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Sets the target type and re-evaluates log filtering.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
value (Optional[str]): The new target type.
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
self._cdp_target_type_log_accepted = validate_type_filter(
|
|
167
|
+
type_=value,
|
|
168
|
+
filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
|
|
169
|
+
filter_instances=self._logger_settings.cdp_settings.target_type_filter
|
|
170
|
+
)
|
|
171
|
+
self.target_data.type_ = value
|
|
172
|
+
|
|
173
|
+
@property
|
|
174
|
+
def attached(self) -> Optional[bool]:
|
|
175
|
+
"""
|
|
176
|
+
Checks if the target is currently attached.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Optional[bool]: True if attached, False otherwise.
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
return self.target_data.attached
|
|
183
|
+
|
|
184
|
+
@attached.setter
|
|
185
|
+
def attached(self, value: Optional[bool]) -> None:
|
|
186
|
+
"""
|
|
187
|
+
Sets the attached status.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
value (Optional[bool]): The new attached status.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
self.target_data.attached = value
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def browser_context_id(self) -> Optional[str]:
|
|
197
|
+
"""
|
|
198
|
+
Gets the browser context ID.
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
Optional[str]: The browser context ID.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
return self.target_data.browser_context_id
|
|
205
|
+
|
|
206
|
+
@browser_context_id.setter
|
|
207
|
+
def browser_context_id(self, value: Optional[str]) -> None:
|
|
208
|
+
"""
|
|
209
|
+
Sets the browser context ID.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
value (Optional[str]): The new browser context ID.
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
self.target_data.browser_context_id = value
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
def can_access_opener(self) -> Optional[bool]:
|
|
219
|
+
"""
|
|
220
|
+
Checks if the target can access its opener.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Optional[bool]: True if accessible, False otherwise.
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
return self.target_data.can_access_opener
|
|
227
|
+
|
|
228
|
+
@can_access_opener.setter
|
|
229
|
+
def can_access_opener(self, value: Optional[bool]) -> None:
|
|
230
|
+
"""
|
|
231
|
+
Sets whether the target can access its opener.
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
value (Optional[bool]): Access status.
|
|
235
|
+
"""
|
|
236
|
+
|
|
237
|
+
self.target_data.can_access_opener = value
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def cancel_scopes(self) -> Dict[str, trio.CancelScope]:
|
|
241
|
+
"""
|
|
242
|
+
Provides access to the dictionary of cancellation scopes.
|
|
243
|
+
|
|
244
|
+
Returns:
|
|
245
|
+
Dict[str, trio.CancelScope]: The cancel scopes dictionary.
|
|
246
|
+
"""
|
|
247
|
+
|
|
248
|
+
return self._cancel_scopes
|
|
249
|
+
|
|
250
|
+
@property
|
|
251
|
+
def cdp_log_stats(self) -> CDPLoggerChannelStats:
|
|
252
|
+
"""
|
|
253
|
+
Gets the CDP logging statistics for this target channel.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
CDPLoggerChannelStats: The statistics object.
|
|
257
|
+
"""
|
|
258
|
+
|
|
259
|
+
return self._cdp_log_stats
|
|
260
|
+
|
|
261
|
+
@property
|
|
262
|
+
def cdp_session(self) -> CdpSession:
|
|
263
|
+
"""
|
|
264
|
+
Gets the active CDP session for this target.
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
CdpSession: The CDP session object.
|
|
268
|
+
"""
|
|
269
|
+
|
|
270
|
+
return self._cdp_session
|
|
271
|
+
|
|
272
|
+
@property
|
|
273
|
+
def fingerprint_log_stats(self) -> FingerprintLoggerChannelStats:
|
|
274
|
+
"""
|
|
275
|
+
Gets the fingerprint logging statistics for this target channel.
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
FingerprintLoggerChannelStats: The statistics object.
|
|
279
|
+
"""
|
|
280
|
+
|
|
281
|
+
return self._fingerprint_log_stats
|
|
282
|
+
|
|
283
|
+
@property
|
|
284
|
+
def opener_frame_id(self) -> Optional[str]:
|
|
285
|
+
"""
|
|
286
|
+
Gets the ID of the opener frame.
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
Optional[str]: The opener frame ID.
|
|
290
|
+
"""
|
|
291
|
+
|
|
292
|
+
return self.target_data.opener_frame_id
|
|
293
|
+
|
|
294
|
+
@opener_frame_id.setter
|
|
295
|
+
def opener_frame_id(self, value: Optional[str]) -> None:
|
|
296
|
+
"""
|
|
297
|
+
Sets the ID of the opener frame.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
value (Optional[str]): The new opener frame ID.
|
|
301
|
+
"""
|
|
302
|
+
|
|
303
|
+
self.target_data.opener_frame_id = value
|
|
304
|
+
|
|
305
|
+
@property
|
|
306
|
+
def opener_id(self) -> Optional[str]:
|
|
307
|
+
"""
|
|
308
|
+
Gets the ID of the opener target.
|
|
309
|
+
|
|
310
|
+
Returns:
|
|
311
|
+
Optional[str]: The opener ID.
|
|
312
|
+
"""
|
|
313
|
+
|
|
314
|
+
return self.target_data.opener_id
|
|
315
|
+
|
|
316
|
+
@opener_id.setter
|
|
317
|
+
def opener_id(self, value: Optional[str]) -> None:
|
|
318
|
+
"""
|
|
319
|
+
Sets the ID of the opener target.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
value (Optional[str]): The new opener ID.
|
|
323
|
+
"""
|
|
324
|
+
|
|
325
|
+
self.target_data.opener_id = value
|
|
326
|
+
|
|
327
|
+
@property
|
|
328
|
+
def subtype(self) -> Optional[str]:
|
|
329
|
+
"""
|
|
330
|
+
Gets the subtype of the target.
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
Optional[str]: The subtype.
|
|
334
|
+
"""
|
|
335
|
+
|
|
336
|
+
return self.target_data.subtype
|
|
337
|
+
|
|
338
|
+
@subtype.setter
|
|
339
|
+
def subtype(self, value: Optional[str]) -> None:
|
|
340
|
+
"""
|
|
341
|
+
Sets the subtype of the target.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
value (Optional[str]): The new subtype.
|
|
345
|
+
"""
|
|
346
|
+
|
|
347
|
+
self.target_data.subtype = value
|
|
348
|
+
|
|
349
|
+
@property
|
|
350
|
+
def target_id(self) -> Optional[str]:
|
|
351
|
+
"""
|
|
352
|
+
Gets the unique target ID.
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
Optional[str]: The target ID.
|
|
356
|
+
"""
|
|
357
|
+
|
|
358
|
+
return self.target_data.target_id
|
|
359
|
+
|
|
360
|
+
@target_id.setter
|
|
361
|
+
def target_id(self, value: Optional[str]) -> None:
|
|
362
|
+
"""
|
|
363
|
+
Sets the target ID and updates log stats.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
value (Optional[str]): The new target ID.
|
|
367
|
+
"""
|
|
368
|
+
|
|
369
|
+
self._cdp_log_stats.target_id = value
|
|
370
|
+
self.target_data.target_id = value
|
|
371
|
+
|
|
372
|
+
@property
|
|
373
|
+
def target_type_log_accepted(self) -> bool:
|
|
374
|
+
"""
|
|
375
|
+
Checks if logging is accepted for this target type.
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
bool: True if logging is allowed, False otherwise.
|
|
379
|
+
"""
|
|
380
|
+
|
|
381
|
+
return self._cdp_target_type_log_accepted
|
|
382
|
+
|
|
383
|
+
@property
|
|
384
|
+
def title(self) -> Optional[str]:
|
|
385
|
+
"""
|
|
386
|
+
Gets the title of the target.
|
|
387
|
+
|
|
388
|
+
Returns:
|
|
389
|
+
Optional[str]: The title.
|
|
390
|
+
"""
|
|
391
|
+
|
|
392
|
+
return self.target_data.title
|
|
393
|
+
|
|
394
|
+
@title.setter
|
|
395
|
+
def title(self, value: Optional[str]) -> None:
|
|
396
|
+
"""
|
|
397
|
+
Sets the title of the target and updates log stats.
|
|
398
|
+
|
|
399
|
+
Args:
|
|
400
|
+
value (Optional[str]): The new title.
|
|
401
|
+
"""
|
|
402
|
+
|
|
403
|
+
self._cdp_log_stats.title = value
|
|
404
|
+
self.target_data.title = value
|
|
405
|
+
|
|
406
|
+
@property
|
|
407
|
+
def url(self) -> Optional[str]:
|
|
408
|
+
"""
|
|
409
|
+
Gets the URL of the target.
|
|
410
|
+
|
|
411
|
+
Returns:
|
|
412
|
+
Optional[str]: The URL.
|
|
413
|
+
"""
|
|
414
|
+
|
|
415
|
+
return self.target_data.url
|
|
416
|
+
|
|
417
|
+
@url.setter
|
|
418
|
+
def url(self, value: Optional[str]) -> None:
|
|
419
|
+
"""
|
|
420
|
+
Sets the URL of the target and updates log stats.
|
|
421
|
+
|
|
422
|
+
Args:
|
|
423
|
+
value (Optional[str]): The new URL.
|
|
424
|
+
"""
|
|
425
|
+
|
|
426
|
+
self._cdp_log_stats.url = value
|
|
427
|
+
self.target_data.url = value
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
3
|
+
from osn_selenium.dev_tools.target.logging import LoggingMixin
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
__all__ = ["DetachMixin"]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DetachMixin(LoggingMixin):
|
|
10
|
+
"""
|
|
11
|
+
Mixin for monitoring target detach, crash, or destruction events.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
async def stop(self):
|
|
15
|
+
"""
|
|
16
|
+
Signals the target to begin its shutdown process.
|
|
17
|
+
|
|
18
|
+
Sets the `about_to_stop_event` which allows the main loop to exit.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
self.about_to_stop_event.set()
|
|
22
|
+
|
|
23
|
+
async def _run_detach_checking(self):
|
|
24
|
+
"""
|
|
25
|
+
Continuously listens for CDP events indicating the target is no longer available.
|
|
26
|
+
|
|
27
|
+
Monitors `TargetCrashed`, `TargetDestroyed`, and `DetachedFromTarget` events.
|
|
28
|
+
If the target associated with this instance is affected, it triggers the stop sequence.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
TargetCrashed = self.devtools_package.get("target.TargetCrashed")
|
|
32
|
+
TargetDestroyed = self.devtools_package.get("target.TargetDestroyed")
|
|
33
|
+
DetachedFromTarget = self.devtools_package.get("target.DetachedFromTarget")
|
|
34
|
+
|
|
35
|
+
self._detached_receive_channel: trio.MemoryReceiveChannel = self.cdp_session.listen(TargetCrashed, TargetDestroyed, DetachedFromTarget, buffer_size=10)
|
|
36
|
+
|
|
37
|
+
should_stop = False
|
|
38
|
+
break_ = False
|
|
39
|
+
|
|
40
|
+
while not should_stop and not break_:
|
|
41
|
+
try:
|
|
42
|
+
event = await self._detached_receive_channel.receive()
|
|
43
|
+
|
|
44
|
+
if isinstance(event, (TargetCrashed, TargetDestroyed, DetachedFromTarget,)):
|
|
45
|
+
if event.target_id == self.target_id:
|
|
46
|
+
should_stop = True
|
|
47
|
+
except* CDPEndExceptions:
|
|
48
|
+
break_ = True
|
|
49
|
+
except* BaseException as error:
|
|
50
|
+
await self.log_cdp_error(error=error)
|
|
51
|
+
break_ = True
|
|
52
|
+
|
|
53
|
+
if should_stop:
|
|
54
|
+
await self.stop()
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from typing import Tuple
|
|
3
|
+
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
4
|
+
from osn_selenium.dev_tools.target.logging import LoggingMixin
|
|
5
|
+
from osn_selenium.dev_tools._functions import execute_cdp_command
|
|
6
|
+
from osn_selenium.dev_tools._validators import (
|
|
7
|
+
validate_target_event
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
__all__ = ["DiscoveryMixin"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DiscoveryMixin(LoggingMixin):
|
|
15
|
+
"""
|
|
16
|
+
Mixin for discovering and attaching to new DevTools targets.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
async def _run_new_targets_listener(self, new_targets_listener_ready_event: trio.Event):
|
|
20
|
+
"""
|
|
21
|
+
Listens for `TargetCreated` and `TargetInfoChanged` events to manage new targets.
|
|
22
|
+
|
|
23
|
+
Attaches to valid new targets and adds them to the management system.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
new_targets_listener_ready_event (trio.Event): Event to signal that the listener is successfully started.
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
CDPEndExceptions: If connection issues occur during initialization.
|
|
30
|
+
BaseException: If other errors occur during initialization.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
await self.log_cdp_step(message="New Targets listener starting.")
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
self._new_target_receive_channel: Tuple[trio.MemoryReceiveChannel, trio.Event] = (
|
|
37
|
+
self.cdp_session.listen(
|
|
38
|
+
self.devtools_package.get("target.TargetCreated"),
|
|
39
|
+
# self.devtools_package.get("target.AttachedToTarget"),
|
|
40
|
+
self.devtools_package.get("target.TargetInfoChanged"),
|
|
41
|
+
buffer_size=self._new_targets_buffer_size
|
|
42
|
+
),
|
|
43
|
+
trio.Event()
|
|
44
|
+
)
|
|
45
|
+
new_targets_listener_ready_event.set()
|
|
46
|
+
except CDPEndExceptions as error:
|
|
47
|
+
raise error
|
|
48
|
+
except BaseException as error:
|
|
49
|
+
await self.log_cdp_error(error=error)
|
|
50
|
+
raise error
|
|
51
|
+
|
|
52
|
+
await self.log_cdp_step(message="New Targets listener started.")
|
|
53
|
+
|
|
54
|
+
keep_alive = True
|
|
55
|
+
while keep_alive:
|
|
56
|
+
try:
|
|
57
|
+
event = await self._new_target_receive_channel[0].receive()
|
|
58
|
+
|
|
59
|
+
if validate_target_event(event=event, filter_=self._new_targets_events_filters):
|
|
60
|
+
await execute_cdp_command(
|
|
61
|
+
self=self,
|
|
62
|
+
error_mode="log",
|
|
63
|
+
function=self.devtools_package.get("target.attach_to_target"),
|
|
64
|
+
target_id=event.target_info.target_id,
|
|
65
|
+
flatten=True
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
self._nursery_object.start_soon(self._add_target_func, event)
|
|
69
|
+
except* CDPEndExceptions:
|
|
70
|
+
keep_alive = False
|
|
71
|
+
except* BaseException as error:
|
|
72
|
+
await self.log_cdp_error(error=error)
|
|
73
|
+
keep_alive = False
|
|
74
|
+
|
|
75
|
+
self._new_target_receive_channel[1].set()
|
|
76
|
+
|
|
77
|
+
async def _setup_new_targets_attaching(self):
|
|
78
|
+
"""
|
|
79
|
+
Configures the target to discover and auto-attach to new targets.
|
|
80
|
+
|
|
81
|
+
Executes CDP commands to set discovery mode and auto-attach behavior
|
|
82
|
+
based on the configured filters.
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
CDPEndExceptions: If the connection closes during setup.
|
|
86
|
+
BaseException: If other errors occur.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
target_filter = self.devtools_package.get("target.TargetFilter")(self._new_targets_filter_list) if self._new_targets_filter_list is not None else None
|
|
91
|
+
|
|
92
|
+
await execute_cdp_command(
|
|
93
|
+
self=self,
|
|
94
|
+
error_mode="log",
|
|
95
|
+
function=self.devtools_package.get("target.set_discover_targets"),
|
|
96
|
+
discover=True,
|
|
97
|
+
filter_=target_filter,
|
|
98
|
+
)
|
|
99
|
+
await execute_cdp_command(
|
|
100
|
+
self=self,
|
|
101
|
+
error_mode="log",
|
|
102
|
+
function=self.devtools_package.get("target.set_auto_attach"),
|
|
103
|
+
auto_attach=True,
|
|
104
|
+
wait_for_debugger_on_start=True,
|
|
105
|
+
flatten=True,
|
|
106
|
+
filter_=target_filter,
|
|
107
|
+
)
|
|
108
|
+
except CDPEndExceptions as error:
|
|
109
|
+
raise error
|
|
110
|
+
except BaseException as error:
|
|
111
|
+
await self.log_cdp_error(error=error)
|
|
112
|
+
raise error
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from typing import List, TYPE_CHECKING
|
|
3
|
+
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
4
|
+
from osn_selenium.dev_tools.target.logging import LoggingMixin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
__all__ = ["EventHandlersMixin"]
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from osn_selenium.dev_tools.domains.abstract import (AbstractDomainSettings, AbstractEventSettings)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class EventHandlersMixin(LoggingMixin):
|
|
14
|
+
"""
|
|
15
|
+
Mixin for handling generic DevTools domain events.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
async def _run_event_handler(
|
|
19
|
+
self,
|
|
20
|
+
domain_handler_ready_event: trio.Event,
|
|
21
|
+
event_config: "AbstractEventSettings"
|
|
22
|
+
):
|
|
23
|
+
"""
|
|
24
|
+
Runs a specific event handler listener loop.
|
|
25
|
+
|
|
26
|
+
Listens for events of the type specified in `event_config` and invokes the configured `handle_function`.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
domain_handler_ready_event (trio.Event): Event to signal that this specific handler is ready.
|
|
30
|
+
event_config (AbstractEventSettings): Configuration for the specific event.
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
CDPEndExceptions: If connection issues occur.
|
|
34
|
+
BaseException: If initialization fails.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
await self.log_cdp_step(message=f"Event handler '{event_config.class_to_use_path}' starting.")
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
receiver_channel: trio.MemoryReceiveChannel = self.cdp_session.listen(
|
|
41
|
+
self.devtools_package.get(event_config.class_to_use_path),
|
|
42
|
+
buffer_size=event_config.listen_buffer_size
|
|
43
|
+
)
|
|
44
|
+
channel_stopped_event = trio.Event()
|
|
45
|
+
|
|
46
|
+
self._events_receive_channels[event_config.class_to_use_path] = (receiver_channel, channel_stopped_event)
|
|
47
|
+
|
|
48
|
+
domain_handler_ready_event.set()
|
|
49
|
+
handler = event_config.handle_function
|
|
50
|
+
except CDPEndExceptions as error:
|
|
51
|
+
raise error
|
|
52
|
+
except BaseException as error:
|
|
53
|
+
await self.log_cdp_error(error=error)
|
|
54
|
+
raise error
|
|
55
|
+
|
|
56
|
+
await self.log_cdp_step(message=f"Event handler '{event_config.class_to_use_path}' started.")
|
|
57
|
+
|
|
58
|
+
keep_alive = True
|
|
59
|
+
while keep_alive:
|
|
60
|
+
try:
|
|
61
|
+
event = await receiver_channel.receive()
|
|
62
|
+
self._nursery_object.start_soon(handler, self, event_config, event)
|
|
63
|
+
except* CDPEndExceptions:
|
|
64
|
+
keep_alive = False
|
|
65
|
+
except* BaseException as error:
|
|
66
|
+
await self.log_cdp_error(error=error)
|
|
67
|
+
keep_alive = False
|
|
68
|
+
|
|
69
|
+
channel_stopped_event.set()
|
|
70
|
+
|
|
71
|
+
async def _run_events_handlers(
|
|
72
|
+
self,
|
|
73
|
+
events_ready_event: trio.Event,
|
|
74
|
+
domain_config: "AbstractDomainSettings"
|
|
75
|
+
):
|
|
76
|
+
"""
|
|
77
|
+
Sets up and runs event handlers for a specific domain.
|
|
78
|
+
|
|
79
|
+
Iterates through the domain configuration and starts a separate task for each configured event handler.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
events_ready_event (trio.Event): Event to signal when all handlers for the domain are ready.
|
|
83
|
+
domain_config (AbstractDomainSettings): Configuration for the domain events.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
CDPEndExceptions: If connection issues occur.
|
|
87
|
+
BaseException: If other errors occur during setup.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
await self.log_cdp_step(
|
|
91
|
+
message=f"Domain '{domain_config.name}' events handlers setup started."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
events_handlers_ready_events: List[trio.Event] = []
|
|
96
|
+
|
|
97
|
+
for event_name, event_config in domain_config.handlers.model_dump(exclude_none=True).items():
|
|
98
|
+
if event_config is not None:
|
|
99
|
+
event_handler_ready_event = trio.Event()
|
|
100
|
+
events_handlers_ready_events.append(event_handler_ready_event)
|
|
101
|
+
|
|
102
|
+
self._nursery_object.start_soon(
|
|
103
|
+
self._run_event_handler,
|
|
104
|
+
event_handler_ready_event,
|
|
105
|
+
getattr(domain_config.handlers, event_name)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
for event_handler_ready_event in events_handlers_ready_events:
|
|
109
|
+
await event_handler_ready_event.wait()
|
|
110
|
+
|
|
111
|
+
events_ready_event.set()
|
|
112
|
+
|
|
113
|
+
await self.log_cdp_step(
|
|
114
|
+
message=f"Domain '{domain_config.name}' events handlers setup complete."
|
|
115
|
+
)
|
|
116
|
+
except* CDPEndExceptions as error:
|
|
117
|
+
raise error
|
|
118
|
+
except* BaseException as error:
|
|
119
|
+
await self.log_cdp_error(error=error)
|
|
120
|
+
raise error
|