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,149 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
import inspect
|
|
3
|
+
import warnings
|
|
4
|
+
import functools
|
|
5
|
+
from osn_selenium.exceptions.devtools import ExceptionThrown
|
|
6
|
+
from osn_selenium.exceptions.instance import NotExpectedTypeError
|
|
7
|
+
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
8
|
+
from typing import (
|
|
9
|
+
Any,
|
|
10
|
+
Callable,
|
|
11
|
+
ParamSpec,
|
|
12
|
+
TYPE_CHECKING,
|
|
13
|
+
TypeVar,
|
|
14
|
+
Union
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["background_task_decorator", "log_on_error", "warn_if_active"]
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from osn_selenium.dev_tools.manager import DevTools
|
|
22
|
+
from osn_selenium.dev_tools.target.base import BaseMixin
|
|
23
|
+
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
24
|
+
from osn_selenium.dev_tools._typehints import DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT
|
|
25
|
+
|
|
26
|
+
_METHOD_INPUT = ParamSpec("_METHOD_INPUT")
|
|
27
|
+
_METHOD_OUTPUT = TypeVar("_METHOD_OUTPUT")
|
|
28
|
+
_METHOD = TypeVar("_METHOD", bound=Callable[..., Any])
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def warn_if_active(func: _METHOD) -> _METHOD:
|
|
32
|
+
"""
|
|
33
|
+
Decorator to warn if DevTools operations are attempted while DevTools is active.
|
|
34
|
+
|
|
35
|
+
This decorator is used to wrap methods in the DevTools class that should not be called
|
|
36
|
+
while the DevTools event handler context manager is active. It checks the `is_active` flag
|
|
37
|
+
of the DevTools instance. If DevTools is active, it issues a warning; otherwise, it proceeds
|
|
38
|
+
to execute the original method.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
func (_METHOD): The function to be wrapped. This should be a method of the DevTools class.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
_METHOD: The wrapped function. When called, it will check if DevTools is active and either
|
|
45
|
+
execute the original function or issue a warning.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
@functools.wraps(func)
|
|
49
|
+
def sync_wrapper(
|
|
50
|
+
self: "DevTools",
|
|
51
|
+
*args: _METHOD_INPUT.args,
|
|
52
|
+
**kwargs: _METHOD_INPUT.kwargs
|
|
53
|
+
) -> Any:
|
|
54
|
+
if self.is_active:
|
|
55
|
+
warnings.warn("DevTools is active. Exit dev_tools context before changing settings.")
|
|
56
|
+
|
|
57
|
+
return func(self, *args, **kwargs)
|
|
58
|
+
|
|
59
|
+
@functools.wraps(func)
|
|
60
|
+
async def async_wrapper(
|
|
61
|
+
self: "DevTools",
|
|
62
|
+
*args: _METHOD_INPUT.args,
|
|
63
|
+
**kwargs: _METHOD_INPUT.kwargs
|
|
64
|
+
) -> Any:
|
|
65
|
+
if self.is_active:
|
|
66
|
+
warnings.warn("DevTools is active. Exit dev_tools context before changing settings.")
|
|
67
|
+
|
|
68
|
+
return await func(self, *args, **kwargs)
|
|
69
|
+
|
|
70
|
+
if inspect.iscoroutinefunction(func):
|
|
71
|
+
return async_wrapper
|
|
72
|
+
|
|
73
|
+
if inspect.isfunction(func):
|
|
74
|
+
return sync_wrapper
|
|
75
|
+
|
|
76
|
+
raise NotExpectedTypeError(expected_type=["coroutine function", "function"], received_instance=func)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def log_on_error(func: _METHOD) -> _METHOD:
|
|
80
|
+
"""
|
|
81
|
+
Decorator that logs any `BaseException` raised by the decorated async function.
|
|
82
|
+
|
|
83
|
+
If an exception occurs, it is logged using `log_exception`, and an `ExceptionThrown`
|
|
84
|
+
object wrapping the exception is returned instead of re-raising it.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
func (_METHOD): The asynchronous function to be wrapped.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
_METHOD: The wrapped asynchronous function.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
@functools.wraps(func)
|
|
94
|
+
def sync_wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
95
|
+
try:
|
|
96
|
+
return func(*args, **kwargs)
|
|
97
|
+
except BaseException as exception:
|
|
98
|
+
log_exception(exception)
|
|
99
|
+
return ExceptionThrown(exception)
|
|
100
|
+
|
|
101
|
+
@functools.wraps(func)
|
|
102
|
+
async def async_wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
103
|
+
try:
|
|
104
|
+
return await func(*args, **kwargs)
|
|
105
|
+
except BaseException as exception:
|
|
106
|
+
log_exception(exception)
|
|
107
|
+
return ExceptionThrown(exception)
|
|
108
|
+
|
|
109
|
+
if inspect.iscoroutinefunction(func):
|
|
110
|
+
return async_wrapper
|
|
111
|
+
|
|
112
|
+
if inspect.isfunction(func):
|
|
113
|
+
return sync_wrapper
|
|
114
|
+
|
|
115
|
+
raise NotExpectedTypeError(expected_type=["coroutine function", "function"], received_instance=func)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def background_task_decorator(func: "DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT") -> "DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT":
|
|
119
|
+
"""
|
|
120
|
+
Decorator for target background tasks to manage their lifecycle.
|
|
121
|
+
|
|
122
|
+
This decorator wraps a target's background task function. It ensures that
|
|
123
|
+
`target.background_task_ended` event is set when the function completes,
|
|
124
|
+
allowing the `BaseTargetMixin` to track the task's termination.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
func ("DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT"): The asynchronous background task function
|
|
128
|
+
to be wrapped. It should accept a target instance.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
"DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT": The wrapped function.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
@functools.wraps(func)
|
|
135
|
+
async def wrapper(target: Union["BaseMixin", "DevToolsTarget"]) -> Any:
|
|
136
|
+
if not target.about_to_stop_event.is_set():
|
|
137
|
+
with trio.CancelScope() as cancel_scope:
|
|
138
|
+
target.cancel_scopes["background_task"] = cancel_scope
|
|
139
|
+
|
|
140
|
+
try:
|
|
141
|
+
target.background_task_ended = trio.Event()
|
|
142
|
+
|
|
143
|
+
await func(target)
|
|
144
|
+
|
|
145
|
+
target.background_task_ended.set()
|
|
146
|
+
finally:
|
|
147
|
+
target.cancel_scopes.pop("background_task")
|
|
148
|
+
|
|
149
|
+
return wrapper
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import traceback
|
|
4
|
+
from typing import (
|
|
5
|
+
Any,
|
|
6
|
+
Dict,
|
|
7
|
+
List,
|
|
8
|
+
Optional
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__all__ = ["extract_exception_trace", "log_exception"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def extract_exception_trace(exception: BaseException) -> str:
|
|
16
|
+
"""
|
|
17
|
+
Extracts a comprehensive traceback string for an exception, including handling for `ExceptionGroup`s.
|
|
18
|
+
|
|
19
|
+
This function recursively flattens `ExceptionGroup`s to ensure all nested exceptions
|
|
20
|
+
have their tracebacks included in the final output string.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
exception (BaseException): The exception object to extract the trace from.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
str: A multi-line string containing the formatted traceback(s) for the given exception
|
|
27
|
+
and any nested exceptions within an `ExceptionGroup`.
|
|
28
|
+
|
|
29
|
+
EXAMPLES
|
|
30
|
+
________
|
|
31
|
+
>>> try:
|
|
32
|
+
... raise ValueError("Simple error occurred")
|
|
33
|
+
... except ValueError as e:
|
|
34
|
+
... trace = extract_exception_trace(e)
|
|
35
|
+
... # The first line typically indicates the start of a traceback
|
|
36
|
+
... print(trace.splitlines()[0].strip())
|
|
37
|
+
>>> try:
|
|
38
|
+
... raise ExceptionGroup(
|
|
39
|
+
... "Multiple issues",
|
|
40
|
+
... [
|
|
41
|
+
... TypeError("Invalid type provided"),
|
|
42
|
+
... ValueError("Value out of range")
|
|
43
|
+
... ]
|
|
44
|
+
... )
|
|
45
|
+
... except ExceptionGroup as eg:
|
|
46
|
+
... trace = extract_exception_trace(eg)
|
|
47
|
+
... # Check if tracebacks for both nested exceptions are present
|
|
48
|
+
... print("TypeError" in trace and "ValueError" in trace)
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def format_exception(exception_: BaseException) -> str:
|
|
52
|
+
"""
|
|
53
|
+
Formats a single exception's traceback into a string.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
exception_ (BaseException): The exception to format.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
str: The formatted exception string.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
return "".join(
|
|
63
|
+
traceback.format_exception(exception_.__class__, exception_, exception_.__traceback__)
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def flatten_exceptions(exception_: BaseException) -> List[BaseException]:
|
|
67
|
+
"""
|
|
68
|
+
Recursively flattens an ExceptionGroup into a List of individual exceptions.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
exception_ (BaseException): The exception to flatten.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
List[BaseException]: A list of flattened exceptions.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
if isinstance(exception_, ExceptionGroup):
|
|
78
|
+
inner_exceptions = exception_.exceptions
|
|
79
|
+
else:
|
|
80
|
+
return [exception_]
|
|
81
|
+
|
|
82
|
+
result = []
|
|
83
|
+
|
|
84
|
+
for exception__ in inner_exceptions:
|
|
85
|
+
result.extend(flatten_exceptions(exception__))
|
|
86
|
+
|
|
87
|
+
return result
|
|
88
|
+
|
|
89
|
+
return "\n".join(format_exception(exc) for exc in flatten_exceptions(exception))
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def log_exception(exception: BaseException, extra_data: Optional[Dict[str, Any]] = None):
|
|
93
|
+
"""
|
|
94
|
+
Logs the full traceback of an exception at the ERROR level.
|
|
95
|
+
|
|
96
|
+
This function uses `extract_exception_trace` to get a comprehensive traceback string
|
|
97
|
+
and then logs it using the standard logging module.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
exception (BaseException): The exception object to log.
|
|
101
|
+
extra_data (Optional[Dict[str, Any]]): Additional data to log with the exception.
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
if extra_data is None:
|
|
105
|
+
exception_data = extract_exception_trace(exception)
|
|
106
|
+
else:
|
|
107
|
+
trace = extract_exception_trace(exception)
|
|
108
|
+
max_len = max(len(line) for line in trace.splitlines())
|
|
109
|
+
|
|
110
|
+
exception_data = "{bound}\n{exception}\nWith extra data:\n{extra_data}\n{bound}".format(
|
|
111
|
+
bound="=" * max_len,
|
|
112
|
+
exception=trace,
|
|
113
|
+
extra_data=json.dumps(extra_data, indent=4, ensure_ascii=False)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
logging.log(logging.ERROR, exception_data)
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
import random
|
|
3
|
+
from typing import (
|
|
4
|
+
Any,
|
|
5
|
+
Callable,
|
|
6
|
+
Literal,
|
|
7
|
+
TYPE_CHECKING,
|
|
8
|
+
Union
|
|
9
|
+
)
|
|
10
|
+
from osn_selenium.exceptions.configuration import (
|
|
11
|
+
NotExpectedValueError
|
|
12
|
+
)
|
|
13
|
+
from osn_selenium.exceptions.devtools import (
|
|
14
|
+
CDPEndExceptions,
|
|
15
|
+
ExceptionThrown
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = ["cdp_command_error", "execute_cdp_command", "wait_one"]
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from osn_selenium.dev_tools.target.logging import LoggingMixin as LoggingTargetMixin
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def wait_one(*events: trio.Event):
|
|
26
|
+
"""
|
|
27
|
+
Waits for the first of multiple Trio events to be set.
|
|
28
|
+
|
|
29
|
+
This function creates a nursery and starts a task for each provided event.
|
|
30
|
+
As soon as any event is set, it receives a signal, cancels the nursery,
|
|
31
|
+
and returns.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
*events (trio.Event): One or more Trio Event objects to wait for.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
async def waiter(event: trio.Event, send_chan_: trio.MemorySendChannel):
|
|
38
|
+
"""Internal helper to wait for an event and send a signal."""
|
|
39
|
+
|
|
40
|
+
await event.wait()
|
|
41
|
+
await send_chan_.send(0)
|
|
42
|
+
|
|
43
|
+
send_chan, receive_chan = trio.open_memory_channel(0)
|
|
44
|
+
|
|
45
|
+
async with trio.open_nursery() as nursery:
|
|
46
|
+
for event_ in events:
|
|
47
|
+
nursery.start_soon(waiter, event_, send_chan.clone())
|
|
48
|
+
|
|
49
|
+
await receive_chan.receive()
|
|
50
|
+
nursery.cancel_scope.cancel()
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
async def cdp_command_error(
|
|
54
|
+
self: "LoggingTargetMixin",
|
|
55
|
+
error: BaseException,
|
|
56
|
+
error_mode: Literal["raise", "log", "log_without_args", "pass"],
|
|
57
|
+
command_name: str,
|
|
58
|
+
*args: Any,
|
|
59
|
+
**kwargs: Any,
|
|
60
|
+
):
|
|
61
|
+
"""
|
|
62
|
+
Handles errors occurring during CDP command execution based on the specified error mode.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
self ("LoggingTargetMixin"): The instance executing the command.
|
|
66
|
+
error (BaseException): The exception that was caught.
|
|
67
|
+
error_mode (Literal["raise", "log", "log_without_args", "pass"]): Strategy for handling the error.
|
|
68
|
+
command_name (str): Name of the CDP command that failed.
|
|
69
|
+
*args (Any): Positional arguments passed to the command.
|
|
70
|
+
**kwargs (Any): Keyword arguments passed to the command.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Union[Any, ExceptionThrown]: Returns ExceptionThrown if not raising.
|
|
74
|
+
|
|
75
|
+
Raises:
|
|
76
|
+
BaseException: The original error if error_mode is "raise".
|
|
77
|
+
NotExpectedValueError: If an invalid error_mode is provided.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
if error_mode == "raise":
|
|
81
|
+
raise error
|
|
82
|
+
|
|
83
|
+
if error_mode == "log":
|
|
84
|
+
await self.log_cdp_error(
|
|
85
|
+
error=error,
|
|
86
|
+
extra_data={"cdp_command": command_name, "args": args, "kwargs": kwargs}
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return ExceptionThrown(exception=error)
|
|
90
|
+
|
|
91
|
+
if error_mode == "log_without_args":
|
|
92
|
+
await self.log_cdp_error(error=error, extra_data={"cdp_command": command_name})
|
|
93
|
+
|
|
94
|
+
return ExceptionThrown(exception=error)
|
|
95
|
+
|
|
96
|
+
if error_mode == "pass":
|
|
97
|
+
return ExceptionThrown(exception=error)
|
|
98
|
+
|
|
99
|
+
raise NotExpectedValueError(
|
|
100
|
+
value_name="error_mode",
|
|
101
|
+
value=error_mode,
|
|
102
|
+
valid_values=["raise", "log", "pass"]
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
async def execute_cdp_command(
|
|
107
|
+
self: "LoggingTargetMixin",
|
|
108
|
+
function: Callable[..., Any],
|
|
109
|
+
cdp_error_mode: Literal["raise", "log", "log_without_args", "pass"] = "raise",
|
|
110
|
+
error_mode: Literal["raise", "log", "log_without_args", "pass"] = "raise",
|
|
111
|
+
command_retries: int = 0,
|
|
112
|
+
*args: Any,
|
|
113
|
+
**kwargs: Any,
|
|
114
|
+
) -> Union[Any, ExceptionThrown]:
|
|
115
|
+
"""
|
|
116
|
+
Executes a Chrome DevTools Protocol (CDP) command with specified error handling.
|
|
117
|
+
|
|
118
|
+
This function attempts to execute a CDP command via the `cdp_session`.
|
|
119
|
+
It provides different behaviors based on the `error_mode` if an exception occurs:
|
|
120
|
+
- "raise": Re-raises the exception immediately.
|
|
121
|
+
- "log": Logs the exception using the target's logger and returns an `ExceptionThrown` object.
|
|
122
|
+
- "pass": Returns an `ExceptionThrown` object without logging the exception.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
self ("LoggingTargetMixin"): The `LoggingTargetMixin` instance through which the command is executed.
|
|
126
|
+
function (Callable[..., Any]): The CDP command function to execute (e.g., `devtools.page.navigate`).
|
|
127
|
+
cdp_error_mode (Literal["raise", "log", "log_without_args", "pass"]): Strategy for connection errors.
|
|
128
|
+
error_mode (Literal["raise", "log", "log_without_args", "pass"]): Strategy for general execution errors.
|
|
129
|
+
command_retries (int): Number of times to retry the command on failure.
|
|
130
|
+
*args (Any): Positional arguments to pass to the CDP command function.
|
|
131
|
+
**kwargs (Any): Keyword arguments to pass to the CDP command function.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Union[Any, ExceptionThrown]: The result of the CDP command if successful,
|
|
135
|
+
or an `ExceptionThrown` object if an error occurred and `error_mode` is "log" or "pass".
|
|
136
|
+
|
|
137
|
+
Raises:
|
|
138
|
+
CDPEndExceptions: If a CDP-related connection error occurs, these are always re-raised.
|
|
139
|
+
BaseException: If `error_mode` is "raise" and any other exception occurs.
|
|
140
|
+
ValueError: If an unknown `error_mode` is provided.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
await self.log_cdp(
|
|
145
|
+
level="DEBUG",
|
|
146
|
+
message=f"Executing CDP command: {function.__name__}",
|
|
147
|
+
extra_data={"args": args, "kwargs": kwargs}
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
for i in range(command_retries):
|
|
151
|
+
try:
|
|
152
|
+
return await self.cdp_session.execute(function(*args, **kwargs))
|
|
153
|
+
except* (BaseException,):
|
|
154
|
+
await trio.sleep(random.uniform(0.5, 1.5))
|
|
155
|
+
|
|
156
|
+
return await self.cdp_session.execute(function(*args, **kwargs))
|
|
157
|
+
except CDPEndExceptions as error:
|
|
158
|
+
return await cdp_command_error(
|
|
159
|
+
self=self,
|
|
160
|
+
error=error,
|
|
161
|
+
error_mode=cdp_error_mode,
|
|
162
|
+
command_name=function.__name__,
|
|
163
|
+
*args,
|
|
164
|
+
**kwargs
|
|
165
|
+
)
|
|
166
|
+
except BaseException as error:
|
|
167
|
+
return await cdp_command_error(
|
|
168
|
+
self=self,
|
|
169
|
+
error=error,
|
|
170
|
+
error_mode=error_mode,
|
|
171
|
+
command_name=function.__name__,
|
|
172
|
+
*args,
|
|
173
|
+
**kwargs
|
|
174
|
+
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from osn_selenium.dev_tools.settings import LoggerSettings
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
__all__ = ["prepare_log_dir"]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def prepare_log_dir(logger_settings: LoggerSettings):
|
|
10
|
+
"""
|
|
11
|
+
Prepares the log directory based on the provided logger settings.
|
|
12
|
+
|
|
13
|
+
If `log_dir_path` is specified:
|
|
14
|
+
- Creates the directory if it doesn't exist.
|
|
15
|
+
- If `renew_log` is True and the directory exists, it is cleared (recreated).
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
logger_settings (LoggerSettings): The settings object containing log directory configuration.
|
|
19
|
+
|
|
20
|
+
Raises:
|
|
21
|
+
ValueError: If `log_dir_path` is provided but is not a valid `Path` object
|
|
22
|
+
or does not represent a directory.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
if isinstance(logger_settings.dir_path, Path) and (logger_settings.dir_path.is_dir() or not logger_settings.dir_path.exists()):
|
|
26
|
+
if not logger_settings.dir_path.exists():
|
|
27
|
+
logger_settings.dir_path.mkdir(parents=True)
|
|
28
|
+
elif logger_settings.renew_log:
|
|
29
|
+
shutil.rmtree(logger_settings.dir_path)
|
|
30
|
+
|
|
31
|
+
logger_settings.dir_path.mkdir()
|
|
32
|
+
elif logger_settings.dir_path is not None:
|
|
33
|
+
raise ValueError(
|
|
34
|
+
f"'log_dir_path' must be a pathlib.Path to directory or None, got {logger_settings.dir_path} (type: {type(logger_settings.dir_path).__name__})"
|
|
35
|
+
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import (
|
|
2
|
+
Any,
|
|
3
|
+
Callable,
|
|
4
|
+
Coroutine,
|
|
5
|
+
Literal,
|
|
6
|
+
TYPE_CHECKING,
|
|
7
|
+
Union
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"CDP_LOG_LEVELS_TYPEHINT",
|
|
13
|
+
"DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT",
|
|
14
|
+
"FINGERPRINT_LOG_LEVELS_TYPEHINT"
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from osn_selenium.dev_tools.target.base import BaseMixin as BaseTargetMixin
|
|
19
|
+
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
20
|
+
else:
|
|
21
|
+
BaseTargetMixin = Any
|
|
22
|
+
DevToolsTarget = Any
|
|
23
|
+
|
|
24
|
+
DEVTOOLS_BACKGROUND_FUNCTION_TYPEHINT = Callable[[Union[BaseTargetMixin, DevToolsTarget]], Coroutine[Any, Any, None]]
|
|
25
|
+
|
|
26
|
+
CDP_LOG_LEVELS_TYPEHINT = Literal[
|
|
27
|
+
"INFO",
|
|
28
|
+
"ERROR",
|
|
29
|
+
"DEBUG",
|
|
30
|
+
"WARNING",
|
|
31
|
+
"RequestPaused",
|
|
32
|
+
"AuthRequired",
|
|
33
|
+
"Building Kwargs"
|
|
34
|
+
]
|
|
35
|
+
FINGERPRINT_LOG_LEVELS_TYPEHINT = Literal["Detect"]
|