osn-selenium 1.0.0__py3-none-any.whl → 1.2.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/_decorators.py +57 -0
- osn_selenium/_trio_threads_helpers.py +157 -0
- osn_selenium/_typehints.py +1 -1
- osn_selenium/abstract/executors/cdp.py +63 -0
- osn_selenium/abstract/webdriver/blink/base.py +14 -0
- osn_selenium/abstract/webdriver/blink/lifecycle.py +8 -8
- osn_selenium/abstract/webdriver/core/base.py +0 -14
- osn_selenium/abstract/webdriver/core/capture.py +4 -3
- osn_selenium/abstract/webdriver/core/lifecycle.py +8 -8
- osn_selenium/abstract/webdriver/core/script.py +5 -4
- osn_selenium/abstract/webdriver/core/window.py +11 -11
- osn_selenium/browsers_handler/models.py +1 -1
- osn_selenium/dev_tools/_decorators.py +19 -51
- osn_selenium/dev_tools/_functions.py +2 -4
- osn_selenium/dev_tools/_typehints.py +5 -2
- osn_selenium/dev_tools/_wrappers.py +0 -3
- osn_selenium/dev_tools/domains/__init__.py +2 -2
- osn_selenium/dev_tools/domains/abstract.py +1 -1
- osn_selenium/dev_tools/domains/fetch.py +6 -8
- osn_selenium/dev_tools/domains_default/fetch.py +2 -2
- osn_selenium/dev_tools/filters.py +1 -1
- osn_selenium/dev_tools/logger/main.py +9 -21
- osn_selenium/dev_tools/logger/models.py +1 -1
- osn_selenium/dev_tools/logger/target.py +49 -29
- osn_selenium/dev_tools/manager/base.py +10 -42
- osn_selenium/dev_tools/manager/lifecycle.py +84 -75
- osn_selenium/dev_tools/manager/logging.py +1 -1
- osn_selenium/dev_tools/manager/targets.py +13 -5
- osn_selenium/dev_tools/models.py +1 -1
- osn_selenium/dev_tools/settings.py +9 -5
- osn_selenium/dev_tools/target/base.py +30 -34
- osn_selenium/dev_tools/target/discovery.py +1 -1
- osn_selenium/dev_tools/target/events.py +2 -2
- osn_selenium/dev_tools/target/fingerprint.py +1 -1
- osn_selenium/dev_tools/target/lifecycle.py +103 -38
- osn_selenium/dev_tools/target/logging.py +11 -3
- osn_selenium/exceptions/__init__.py +0 -1
- osn_selenium/exceptions/base.py +28 -1
- osn_selenium/exceptions/bidi_bridge.py +59 -0
- osn_selenium/exceptions/configuration.py +1 -8
- osn_selenium/exceptions/dependencies.py +60 -0
- osn_selenium/exceptions/devtools.py +9 -39
- osn_selenium/exceptions/experimental.py +26 -0
- osn_selenium/exceptions/flags.py +0 -2
- osn_selenium/exceptions/instance.py +1 -9
- osn_selenium/exceptions/javascript.py +0 -2
- osn_selenium/exceptions/logic.py +0 -2
- osn_selenium/exceptions/path.py +1 -9
- osn_selenium/exceptions/platform.py +0 -2
- osn_selenium/exceptions/protocol.py +0 -3
- osn_selenium/exceptions/webdriver.py +1 -7
- osn_selenium/exceptions/window.py +1 -8
- osn_selenium/executors/sync/cdp.py +95 -0
- osn_selenium/executors/trio_bidi/cdp.py +101 -0
- osn_selenium/executors/trio_bidi/javascript.py +101 -0
- osn_selenium/executors/trio_threads/cdp.py +99 -0
- osn_selenium/executors/trio_threads/javascript.py +1 -1
- osn_selenium/executors/unified/javascript.py +0 -4
- osn_selenium/flags/base.py +7 -13
- osn_selenium/flags/blink.py +2 -8
- osn_selenium/flags/chrome.py +6 -6
- osn_selenium/flags/edge.py +6 -6
- osn_selenium/flags/models/base.py +4 -4
- osn_selenium/flags/models/blink.py +1 -1
- osn_selenium/flags/models/values.py +1 -1
- osn_selenium/instances/convert.py +44 -3
- osn_selenium/instances/protocols.py +47 -1
- osn_selenium/instances/sync/action_chains/__init__.py +6 -0
- osn_selenium/instances/sync/browsing_context.py +2 -2
- osn_selenium/instances/sync/script.py +7 -2
- osn_selenium/instances/sync/shadow_root.py +30 -8
- osn_selenium/instances/sync/web_element.py +1 -1
- osn_selenium/instances/trio_bidi/__init__.py +1 -0
- osn_selenium/instances/trio_bidi/shadow_root.py +180 -0
- osn_selenium/instances/trio_bidi/switch_to.py +143 -0
- osn_selenium/instances/trio_bidi/web_driver_wait.py +124 -0
- osn_selenium/instances/trio_bidi/web_element.py +239 -0
- osn_selenium/instances/trio_threads/action_chains/__init__.py +6 -0
- osn_selenium/instances/trio_threads/action_chains/base.py +1 -1
- osn_selenium/instances/trio_threads/alert.py +1 -1
- osn_selenium/instances/trio_threads/browser.py +1 -1
- osn_selenium/instances/trio_threads/browsing_context.py +3 -3
- osn_selenium/instances/trio_threads/dialog.py +1 -1
- osn_selenium/instances/trio_threads/fedcm.py +1 -1
- osn_selenium/instances/trio_threads/mobile.py +1 -1
- osn_selenium/instances/trio_threads/network.py +1 -1
- osn_selenium/instances/trio_threads/permissions.py +1 -1
- osn_selenium/instances/trio_threads/script.py +8 -3
- osn_selenium/instances/trio_threads/shadow_root.py +46 -15
- osn_selenium/instances/trio_threads/storage.py +1 -1
- osn_selenium/instances/trio_threads/switch_to.py +1 -1
- osn_selenium/instances/trio_threads/web_driver_wait.py +1 -1
- osn_selenium/instances/trio_threads/web_element.py +1 -1
- osn_selenium/instances/trio_threads/web_extension.py +1 -1
- osn_selenium/instances/unified/browsing_context.py +2 -2
- osn_selenium/instances/unified/script.py +2 -2
- osn_selenium/instances/unified/web_element.py +3 -5
- osn_selenium/javascript/fingerprint/__init__.py +3 -2
- osn_selenium/javascript/fingerprint/registry/models.py +1 -1
- osn_selenium/javascript/fingerprint/spoof/core_rules.py +1 -1
- osn_selenium/javascript/fingerprint/spoof/noise.py +1 -1
- osn_selenium/javascript/models.py +1 -1
- osn_selenium/models.py +2 -47
- osn_selenium/trio_bidi/__init__.py +1 -0
- osn_selenium/trio_bidi/_context_vars.py +12 -0
- osn_selenium/trio_bidi/_error_mappings.py +123 -0
- osn_selenium/trio_bidi/_error_redirects.py +194 -0
- osn_selenium/trio_bidi/_file_functions.py +28 -0
- osn_selenium/trio_bidi/_internal_mappings.py +10 -0
- osn_selenium/trio_bidi/_models.py +199 -0
- osn_selenium/trio_bidi/_typehints.py +20 -0
- osn_selenium/trio_bidi/connection_pool.py +587 -0
- osn_selenium/trio_bidi/mapping/__init__.py +1 -0
- osn_selenium/trio_bidi/mapping/_constants.py +14 -0
- osn_selenium/trio_bidi/mapping/_js_snippets.py +285 -0
- osn_selenium/trio_bidi/mapping/_utils.py +4 -0
- osn_selenium/trio_bidi/mapping/request_functions/__init__.py +87 -0
- osn_selenium/trio_bidi/mapping/request_functions/_alert.py +102 -0
- osn_selenium/trio_bidi/mapping/request_functions/_args_helpers.py +225 -0
- osn_selenium/trio_bidi/mapping/request_functions/_capture.py +71 -0
- osn_selenium/trio_bidi/mapping/request_functions/_cdp.py +40 -0
- osn_selenium/trio_bidi/mapping/request_functions/_element.py +55 -0
- osn_selenium/trio_bidi/mapping/request_functions/_file.py +32 -0
- osn_selenium/trio_bidi/mapping/request_functions/_navigation.py +147 -0
- osn_selenium/trio_bidi/mapping/request_functions/_script.py +85 -0
- osn_selenium/trio_bidi/mapping/request_functions/_shadow_root.py +65 -0
- osn_selenium/trio_bidi/mapping/request_functions/_switch_to.py +59 -0
- osn_selenium/trio_bidi/mapping/request_functions/_web_element.py +448 -0
- osn_selenium/trio_bidi/mapping/request_functions/_window.py +125 -0
- osn_selenium/trio_bidi/mapping/response_functions/__init__.py +86 -0
- osn_selenium/trio_bidi/mapping/response_functions/_alert.py +81 -0
- osn_selenium/trio_bidi/mapping/response_functions/_args_helpers.py +183 -0
- osn_selenium/trio_bidi/mapping/response_functions/_args_validators.py +153 -0
- osn_selenium/trio_bidi/mapping/response_functions/_capture.py +71 -0
- osn_selenium/trio_bidi/mapping/response_functions/_cdp.py +26 -0
- osn_selenium/trio_bidi/mapping/response_functions/_element.py +58 -0
- osn_selenium/trio_bidi/mapping/response_functions/_file.py +30 -0
- osn_selenium/trio_bidi/mapping/response_functions/_navigation.py +120 -0
- osn_selenium/trio_bidi/mapping/response_functions/_script.py +57 -0
- osn_selenium/trio_bidi/mapping/response_functions/_shadow_root.py +58 -0
- osn_selenium/trio_bidi/mapping/response_functions/_switch_to.py +57 -0
- osn_selenium/trio_bidi/mapping/response_functions/_web_element.py +368 -0
- osn_selenium/trio_bidi/mapping/response_functions/_window.py +119 -0
- osn_selenium/trio_bidi/mixin.py +186 -0
- osn_selenium/trio_bidi/remote_connection.py +164 -0
- osn_selenium/{base_mixin.py → trio_threads_mixin.py} +31 -40
- osn_selenium/webdrivers/_args_helpers.py +120 -7
- osn_selenium/webdrivers/_bridges.py +2 -2
- osn_selenium/webdrivers/_executable_tables/models.py +1 -1
- osn_selenium/webdrivers/_typehints.py +9 -3
- osn_selenium/webdrivers/protocols.py +81 -1
- osn_selenium/webdrivers/sync/blink/__init__.py +11 -1
- osn_selenium/webdrivers/sync/blink/base.py +23 -1
- osn_selenium/webdrivers/sync/blink/lifecycle.py +26 -8
- osn_selenium/webdrivers/sync/chrome/__init__.py +36 -1
- osn_selenium/webdrivers/sync/chrome/base.py +13 -1
- osn_selenium/webdrivers/sync/chrome/lifecycle.py +23 -5
- osn_selenium/webdrivers/sync/chrome/settings.py +6 -1
- osn_selenium/webdrivers/sync/core/__init__.py +10 -1
- osn_selenium/webdrivers/sync/core/base.py +18 -18
- osn_selenium/webdrivers/sync/core/capture.py +3 -2
- osn_selenium/webdrivers/sync/core/file.py +3 -2
- osn_selenium/webdrivers/sync/core/lifecycle.py +44 -10
- osn_selenium/webdrivers/sync/core/script.py +3 -2
- osn_selenium/webdrivers/sync/core/window.py +3 -3
- osn_selenium/webdrivers/sync/edge/__init__.py +36 -1
- osn_selenium/webdrivers/sync/edge/base.py +13 -1
- osn_selenium/webdrivers/sync/edge/lifecycle.py +23 -5
- osn_selenium/webdrivers/sync/edge/settings.py +6 -1
- osn_selenium/webdrivers/sync/yandex/__init__.py +36 -1
- osn_selenium/webdrivers/sync/yandex/base.py +13 -1
- osn_selenium/webdrivers/sync/yandex/lifecycle.py +23 -5
- osn_selenium/webdrivers/sync/yandex/settings.py +6 -1
- osn_selenium/webdrivers/trio_bidi/__init__.py +1 -0
- osn_selenium/webdrivers/trio_bidi/blink/__init__.py +132 -0
- osn_selenium/webdrivers/trio_bidi/blink/base.py +167 -0
- osn_selenium/webdrivers/trio_bidi/blink/lifecycle.py +89 -0
- osn_selenium/webdrivers/trio_bidi/blink/settings.py +63 -0
- osn_selenium/webdrivers/trio_bidi/chrome/__init__.py +114 -0
- osn_selenium/webdrivers/trio_bidi/chrome/base.py +127 -0
- osn_selenium/webdrivers/trio_bidi/chrome/lifecycle.py +85 -0
- osn_selenium/webdrivers/trio_bidi/chrome/settings.py +63 -0
- osn_selenium/webdrivers/trio_bidi/core/__init__.py +95 -0
- osn_selenium/webdrivers/trio_bidi/core/actions.py +70 -0
- osn_selenium/webdrivers/trio_bidi/core/base.py +200 -0
- osn_selenium/webdrivers/trio_bidi/core/capture.py +39 -0
- osn_selenium/webdrivers/trio_bidi/core/devtools.py +49 -0
- osn_selenium/webdrivers/trio_bidi/core/element.py +64 -0
- osn_selenium/webdrivers/trio_bidi/core/lifecycle.py +135 -0
- osn_selenium/webdrivers/trio_bidi/core/navigation.py +37 -0
- osn_selenium/webdrivers/trio_bidi/core/script.py +56 -0
- osn_selenium/webdrivers/trio_bidi/core/settings.py +36 -0
- osn_selenium/webdrivers/trio_bidi/core/window.py +134 -0
- osn_selenium/webdrivers/trio_bidi/edge/__init__.py +114 -0
- osn_selenium/webdrivers/trio_bidi/edge/base.py +123 -0
- osn_selenium/webdrivers/trio_bidi/edge/lifecycle.py +85 -0
- osn_selenium/webdrivers/trio_bidi/edge/settings.py +63 -0
- osn_selenium/webdrivers/trio_bidi/yandex/__init__.py +114 -0
- osn_selenium/webdrivers/trio_bidi/yandex/base.py +120 -0
- osn_selenium/webdrivers/trio_bidi/yandex/lifecycle.py +85 -0
- osn_selenium/webdrivers/trio_bidi/yandex/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/blink/__init__.py +18 -2
- osn_selenium/webdrivers/trio_threads/blink/base.py +25 -1
- osn_selenium/webdrivers/trio_threads/blink/casting.py +1 -1
- osn_selenium/webdrivers/trio_threads/blink/features.py +1 -1
- osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +26 -8
- osn_selenium/webdrivers/trio_threads/blink/logging.py +1 -1
- osn_selenium/webdrivers/trio_threads/blink/network.py +1 -1
- osn_selenium/webdrivers/trio_threads/chrome/__init__.py +34 -1
- osn_selenium/webdrivers/trio_threads/chrome/base.py +14 -2
- osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +23 -5
- osn_selenium/webdrivers/trio_threads/chrome/settings.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/__init__.py +10 -14
- osn_selenium/webdrivers/trio_threads/core/actions.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/auth.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/base.py +18 -22
- osn_selenium/webdrivers/trio_threads/core/capture.py +4 -3
- osn_selenium/webdrivers/trio_threads/core/comonents.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/devtools.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/element.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/file.py +5 -4
- osn_selenium/webdrivers/trio_threads/core/lifecycle.py +45 -11
- osn_selenium/webdrivers/trio_threads/core/navigation.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/script.py +4 -3
- osn_selenium/webdrivers/trio_threads/core/settings.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/storage.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/timeouts.py +1 -1
- osn_selenium/webdrivers/trio_threads/core/window.py +6 -6
- osn_selenium/webdrivers/trio_threads/edge/__init__.py +34 -1
- osn_selenium/webdrivers/trio_threads/edge/base.py +14 -2
- osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +23 -5
- osn_selenium/webdrivers/trio_threads/edge/settings.py +1 -1
- osn_selenium/webdrivers/trio_threads/yandex/__init__.py +34 -1
- osn_selenium/webdrivers/trio_threads/yandex/base.py +14 -2
- osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +23 -5
- osn_selenium/webdrivers/trio_threads/yandex/settings.py +1 -1
- osn_selenium/webdrivers/unified/blink/base.py +9 -1
- osn_selenium/webdrivers/unified/blink/lifecycle.py +4 -2
- osn_selenium/webdrivers/unified/chrome/base.py +9 -1
- osn_selenium/webdrivers/unified/core/auth.py +4 -2
- osn_selenium/webdrivers/unified/core/base.py +19 -6
- osn_selenium/webdrivers/unified/core/capture.py +3 -2
- osn_selenium/webdrivers/unified/core/components.py +12 -7
- osn_selenium/webdrivers/unified/core/devtools.py +2 -1
- osn_selenium/webdrivers/unified/core/file.py +3 -2
- osn_selenium/webdrivers/unified/core/lifecycle.py +5 -3
- osn_selenium/webdrivers/unified/core/script.py +5 -3
- osn_selenium/webdrivers/unified/core/storage.py +2 -1
- osn_selenium/webdrivers/unified/core/window.py +9 -8
- osn_selenium/webdrivers/unified/edge/base.py +9 -1
- osn_selenium/webdrivers/unified/yandex/base.py +9 -1
- {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/METADATA +24 -10
- osn_selenium-1.2.0.dist-info/RECORD +480 -0
- {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/WHEEL +1 -1
- osn_selenium/abstract/executors/cdp/__init__.py +0 -435
- osn_selenium/abstract/executors/cdp/accessibility.py +0 -62
- osn_selenium/abstract/executors/cdp/animation.py +0 -47
- osn_selenium/abstract/executors/cdp/audits.py +0 -39
- osn_selenium/abstract/executors/cdp/autofill.py +0 -34
- osn_selenium/abstract/executors/cdp/background_service.py +0 -22
- osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +0 -95
- osn_selenium/abstract/executors/cdp/browser.py +0 -122
- osn_selenium/abstract/executors/cdp/cache_storage.py +0 -49
- osn_selenium/abstract/executors/cdp/cast.py +0 -31
- osn_selenium/abstract/executors/cdp/console.py +0 -18
- osn_selenium/abstract/executors/cdp/css.py +0 -197
- osn_selenium/abstract/executors/cdp/debugger.py +0 -198
- osn_selenium/abstract/executors/cdp/device_access.py +0 -22
- osn_selenium/abstract/executors/cdp/device_orientation.py +0 -14
- osn_selenium/abstract/executors/cdp/dom.py +0 -305
- osn_selenium/abstract/executors/cdp/dom_debugger.py +0 -57
- osn_selenium/abstract/executors/cdp/dom_snapshot.py +0 -42
- osn_selenium/abstract/executors/cdp/dom_storage.py +0 -31
- osn_selenium/abstract/executors/cdp/emulation.py +0 -259
- osn_selenium/abstract/executors/cdp/event_breakpoints.py +0 -18
- osn_selenium/abstract/executors/cdp/extensions.py +0 -31
- osn_selenium/abstract/executors/cdp/fed_cm.py +0 -35
- osn_selenium/abstract/executors/cdp/fetch.py +0 -76
- osn_selenium/abstract/executors/cdp/file_system.py +0 -11
- osn_selenium/abstract/executors/cdp/headless_experimental.py +0 -30
- osn_selenium/abstract/executors/cdp/heap_profiler.py +0 -73
- osn_selenium/abstract/executors/cdp/indexed_db.py +0 -99
- osn_selenium/abstract/executors/cdp/input.py +0 -158
- osn_selenium/abstract/executors/cdp/inspector.py +0 -14
- osn_selenium/abstract/executors/cdp/io.py +0 -24
- osn_selenium/abstract/executors/cdp/layer_tree.py +0 -61
- osn_selenium/abstract/executors/cdp/log.py +0 -27
- osn_selenium/abstract/executors/cdp/media.py +0 -14
- osn_selenium/abstract/executors/cdp/memory.py +0 -61
- osn_selenium/abstract/executors/cdp/network.py +0 -252
- osn_selenium/abstract/executors/cdp/overlay.py +0 -166
- osn_selenium/abstract/executors/cdp/page.py +0 -347
- osn_selenium/abstract/executors/cdp/performance.py +0 -28
- osn_selenium/abstract/executors/cdp/performance_timeline.py +0 -11
- osn_selenium/abstract/executors/cdp/preload.py +0 -14
- osn_selenium/abstract/executors/cdp/profiler.py +0 -54
- osn_selenium/abstract/executors/cdp/pwa.py +0 -46
- osn_selenium/abstract/executors/cdp/runtime.py +0 -176
- osn_selenium/abstract/executors/cdp/schema.py +0 -11
- osn_selenium/abstract/executors/cdp/security.py +0 -26
- osn_selenium/abstract/executors/cdp/service_worker.py +0 -54
- osn_selenium/abstract/executors/cdp/storage.py +0 -175
- osn_selenium/abstract/executors/cdp/system_info.py +0 -24
- osn_selenium/abstract/executors/cdp/target.py +0 -125
- osn_selenium/abstract/executors/cdp/tethering.py +0 -14
- osn_selenium/abstract/executors/cdp/tracing.py +0 -48
- osn_selenium/abstract/executors/cdp/web_audio.py +0 -19
- osn_selenium/abstract/executors/cdp/web_authn.py +0 -76
- osn_selenium/executors/sync/cdp/__init__.py +0 -550
- osn_selenium/executors/sync/cdp/accessibility.py +0 -74
- osn_selenium/executors/sync/cdp/animation.py +0 -50
- osn_selenium/executors/sync/cdp/audits.py +0 -48
- osn_selenium/executors/sync/cdp/autofill.py +0 -39
- osn_selenium/executors/sync/cdp/background_service.py +0 -30
- osn_selenium/executors/sync/cdp/bluetooth_emulation.py +0 -101
- osn_selenium/executors/sync/cdp/browser.py +0 -131
- osn_selenium/executors/sync/cdp/cache_storage.py +0 -66
- osn_selenium/executors/sync/cdp/cast.py +0 -38
- osn_selenium/executors/sync/cdp/console.py +0 -24
- osn_selenium/executors/sync/cdp/css.py +0 -187
- osn_selenium/executors/sync/cdp/debugger.py +0 -206
- osn_selenium/executors/sync/cdp/device_access.py +0 -27
- osn_selenium/executors/sync/cdp/device_orientation.py +0 -24
- osn_selenium/executors/sync/cdp/dom.py +0 -310
- osn_selenium/executors/sync/cdp/dom_debugger.py +0 -56
- osn_selenium/executors/sync/cdp/dom_snapshot.py +0 -58
- osn_selenium/executors/sync/cdp/dom_storage.py +0 -38
- osn_selenium/executors/sync/cdp/emulation.py +0 -270
- osn_selenium/executors/sync/cdp/event_breakpoints.py +0 -27
- osn_selenium/executors/sync/cdp/extensions.py +0 -39
- osn_selenium/executors/sync/cdp/fed_cm.py +0 -45
- osn_selenium/executors/sync/cdp/fetch.py +0 -96
- osn_selenium/executors/sync/cdp/file_system.py +0 -18
- osn_selenium/executors/sync/cdp/headless_experimental.py +0 -44
- osn_selenium/executors/sync/cdp/heap_profiler.py +0 -89
- osn_selenium/executors/sync/cdp/indexed_db.py +0 -142
- osn_selenium/executors/sync/cdp/input.py +0 -233
- osn_selenium/executors/sync/cdp/inspector.py +0 -21
- osn_selenium/executors/sync/cdp/io.py +0 -33
- osn_selenium/executors/sync/cdp/layer_tree.py +0 -71
- osn_selenium/executors/sync/cdp/log.py +0 -35
- osn_selenium/executors/sync/cdp/media.py +0 -21
- osn_selenium/executors/sync/cdp/memory.py +0 -62
- osn_selenium/executors/sync/cdp/network.py +0 -287
- osn_selenium/executors/sync/cdp/overlay.py +0 -174
- osn_selenium/executors/sync/cdp/page.py +0 -365
- osn_selenium/executors/sync/cdp/performance.py +0 -33
- osn_selenium/executors/sync/cdp/performance_timeline.py +0 -26
- osn_selenium/executors/sync/cdp/preload.py +0 -21
- osn_selenium/executors/sync/cdp/profiler.py +0 -58
- osn_selenium/executors/sync/cdp/pwa.py +0 -55
- osn_selenium/executors/sync/cdp/runtime.py +0 -221
- osn_selenium/executors/sync/cdp/schema.py +0 -23
- osn_selenium/executors/sync/cdp/security.py +0 -30
- osn_selenium/executors/sync/cdp/service_worker.py +0 -56
- osn_selenium/executors/sync/cdp/storage.py +0 -151
- osn_selenium/executors/sync/cdp/system_info.py +0 -30
- osn_selenium/executors/sync/cdp/target.py +0 -147
- osn_selenium/executors/sync/cdp/tethering.py +0 -21
- osn_selenium/executors/sync/cdp/tracing.py +0 -62
- osn_selenium/executors/sync/cdp/web_audio.py +0 -24
- osn_selenium/executors/sync/cdp/web_authn.py +0 -82
- osn_selenium/executors/trio_threads/cdp/__init__.py +0 -771
- osn_selenium/executors/trio_threads/cdp/accessibility.py +0 -87
- osn_selenium/executors/trio_threads/cdp/animation.py +0 -63
- osn_selenium/executors/trio_threads/cdp/audits.py +0 -57
- osn_selenium/executors/trio_threads/cdp/autofill.py +0 -52
- osn_selenium/executors/trio_threads/cdp/background_service.py +0 -40
- osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +0 -111
- osn_selenium/executors/trio_threads/cdp/browser.py +0 -140
- osn_selenium/executors/trio_threads/cdp/cache_storage.py +0 -79
- osn_selenium/executors/trio_threads/cdp/cast.py +0 -47
- osn_selenium/executors/trio_threads/cdp/console.py +0 -33
- osn_selenium/executors/trio_threads/cdp/css.py +0 -196
- osn_selenium/executors/trio_threads/cdp/debugger.py +0 -219
- osn_selenium/executors/trio_threads/cdp/device_access.py +0 -40
- osn_selenium/executors/trio_threads/cdp/device_orientation.py +0 -34
- osn_selenium/executors/trio_threads/cdp/dom.py +0 -319
- osn_selenium/executors/trio_threads/cdp/dom_debugger.py +0 -69
- osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +0 -71
- osn_selenium/executors/trio_threads/cdp/dom_storage.py +0 -51
- osn_selenium/executors/trio_threads/cdp/emulation.py +0 -283
- osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +0 -37
- osn_selenium/executors/trio_threads/cdp/extensions.py +0 -52
- osn_selenium/executors/trio_threads/cdp/fed_cm.py +0 -54
- osn_selenium/executors/trio_threads/cdp/fetch.py +0 -105
- osn_selenium/executors/trio_threads/cdp/file_system.py +0 -31
- osn_selenium/executors/trio_threads/cdp/headless_experimental.py +0 -54
- osn_selenium/executors/trio_threads/cdp/heap_profiler.py +0 -102
- osn_selenium/executors/trio_threads/cdp/indexed_db.py +0 -155
- osn_selenium/executors/trio_threads/cdp/input.py +0 -242
- osn_selenium/executors/trio_threads/cdp/inspector.py +0 -34
- osn_selenium/executors/trio_threads/cdp/io.py +0 -42
- osn_selenium/executors/trio_threads/cdp/layer_tree.py +0 -84
- osn_selenium/executors/trio_threads/cdp/log.py +0 -44
- osn_selenium/executors/trio_threads/cdp/media.py +0 -30
- osn_selenium/executors/trio_threads/cdp/memory.py +0 -71
- osn_selenium/executors/trio_threads/cdp/network.py +0 -296
- osn_selenium/executors/trio_threads/cdp/overlay.py +0 -183
- osn_selenium/executors/trio_threads/cdp/page.py +0 -374
- osn_selenium/executors/trio_threads/cdp/performance.py +0 -46
- osn_selenium/executors/trio_threads/cdp/performance_timeline.py +0 -36
- osn_selenium/executors/trio_threads/cdp/preload.py +0 -30
- osn_selenium/executors/trio_threads/cdp/profiler.py +0 -71
- osn_selenium/executors/trio_threads/cdp/pwa.py +0 -64
- osn_selenium/executors/trio_threads/cdp/runtime.py +0 -230
- osn_selenium/executors/trio_threads/cdp/schema.py +0 -32
- osn_selenium/executors/trio_threads/cdp/security.py +0 -43
- osn_selenium/executors/trio_threads/cdp/service_worker.py +0 -69
- osn_selenium/executors/trio_threads/cdp/storage.py +0 -162
- osn_selenium/executors/trio_threads/cdp/system_info.py +0 -43
- osn_selenium/executors/trio_threads/cdp/target.py +0 -156
- osn_selenium/executors/trio_threads/cdp/tethering.py +0 -34
- osn_selenium/executors/trio_threads/cdp/tracing.py +0 -71
- osn_selenium/executors/trio_threads/cdp/web_audio.py +0 -37
- osn_selenium/executors/trio_threads/cdp/web_authn.py +0 -95
- osn_selenium/executors/unified/cdp/accessibility.py +0 -81
- osn_selenium/executors/unified/cdp/animation.py +0 -50
- osn_selenium/executors/unified/cdp/audits.py +0 -45
- osn_selenium/executors/unified/cdp/autofill.py +0 -41
- osn_selenium/executors/unified/cdp/background_service.py +0 -24
- osn_selenium/executors/unified/cdp/bluetooth_emulation.py +0 -132
- osn_selenium/executors/unified/cdp/browser.py +0 -143
- osn_selenium/executors/unified/cdp/cache_storage.py +0 -69
- osn_selenium/executors/unified/cdp/cast.py +0 -32
- osn_selenium/executors/unified/cdp/console.py +0 -18
- osn_selenium/executors/unified/cdp/css.py +0 -237
- osn_selenium/executors/unified/cdp/debugger.py +0 -243
- osn_selenium/executors/unified/cdp/device_access.py +0 -21
- osn_selenium/executors/unified/cdp/device_orientation.py +0 -18
- osn_selenium/executors/unified/cdp/dom.py +0 -380
- osn_selenium/executors/unified/cdp/dom_debugger.py +0 -65
- osn_selenium/executors/unified/cdp/dom_snapshot.py +0 -58
- osn_selenium/executors/unified/cdp/dom_storage.py +0 -38
- osn_selenium/executors/unified/cdp/emulation.py +0 -312
- osn_selenium/executors/unified/cdp/event_breakpoints.py +0 -24
- osn_selenium/executors/unified/cdp/extensions.py +0 -45
- osn_selenium/executors/unified/cdp/fed_cm.py +0 -51
- osn_selenium/executors/unified/cdp/fetch.py +0 -111
- osn_selenium/executors/unified/cdp/file_system.py +0 -15
- osn_selenium/executors/unified/cdp/headless_experimental.py +0 -38
- osn_selenium/executors/unified/cdp/heap_profiler.py +0 -101
- osn_selenium/executors/unified/cdp/indexed_db.py +0 -157
- osn_selenium/executors/unified/cdp/input.py +0 -254
- osn_selenium/executors/unified/cdp/inspector.py +0 -15
- osn_selenium/executors/unified/cdp/io.py +0 -29
- osn_selenium/executors/unified/cdp/layer_tree.py +0 -71
- osn_selenium/executors/unified/cdp/log.py +0 -29
- osn_selenium/executors/unified/cdp/media.py +0 -15
- osn_selenium/executors/unified/cdp/memory.py +0 -59
- osn_selenium/executors/unified/cdp/network.py +0 -323
- osn_selenium/executors/unified/cdp/overlay.py +0 -209
- osn_selenium/executors/unified/cdp/page.py +0 -410
- osn_selenium/executors/unified/cdp/performance.py +0 -27
- osn_selenium/executors/unified/cdp/performance_timeline.py +0 -17
- osn_selenium/executors/unified/cdp/preload.py +0 -15
- osn_selenium/executors/unified/cdp/profiler.py +0 -55
- osn_selenium/executors/unified/cdp/pwa.py +0 -55
- osn_selenium/executors/unified/cdp/runtime.py +0 -245
- osn_selenium/executors/unified/cdp/schema.py +0 -17
- osn_selenium/executors/unified/cdp/security.py +0 -27
- osn_selenium/executors/unified/cdp/service_worker.py +0 -62
- osn_selenium/executors/unified/cdp/storage.py +0 -178
- osn_selenium/executors/unified/cdp/system_info.py +0 -24
- osn_selenium/executors/unified/cdp/target.py +0 -165
- osn_selenium/executors/unified/cdp/tethering.py +0 -15
- osn_selenium/executors/unified/cdp/tracing.py +0 -62
- osn_selenium/executors/unified/cdp/web_audio.py +0 -18
- osn_selenium/executors/unified/cdp/web_authn.py +0 -103
- osn_selenium-1.0.0.dist-info/RECORD +0 -608
- /osn_selenium/{dev_tools/_exception_helpers.py → _exception_helpers.py} +0 -0
- /osn_selenium/executors/{unified/cdp → trio_bidi}/__init__.py +0 -0
- {osn_selenium-1.0.0.dist-info → osn_selenium-1.2.0.dist-info}/top_level.txt +0 -0
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
import trio
|
|
2
|
-
from
|
|
3
|
-
|
|
4
|
-
)
|
|
2
|
+
from typing import Dict, Optional
|
|
3
|
+
from contextlib import AsyncExitStack
|
|
5
4
|
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
6
5
|
from osn_selenium.dev_tools.logger.main import MainLogger
|
|
7
|
-
from osn_selenium.dev_tools.domains import DomainsSettings
|
|
8
6
|
from osn_selenium.dev_tools._wrappers import DevToolsPackage
|
|
9
7
|
from osn_selenium.dev_tools.settings import DevToolsSettings
|
|
10
|
-
from typing import (
|
|
11
|
-
Any,
|
|
12
|
-
Dict,
|
|
13
|
-
Optional,
|
|
14
|
-
TYPE_CHECKING
|
|
15
|
-
)
|
|
16
8
|
from osn_selenium.dev_tools._system_utils import prepare_log_dir
|
|
17
9
|
from selenium.webdriver.remote.bidi_connection import BidiConnection
|
|
10
|
+
from osn_selenium.webdrivers._typehints import (
|
|
11
|
+
ANY_TRIO_WEBDRIVER_TYPEHINT
|
|
12
|
+
)
|
|
18
13
|
from osn_selenium.dev_tools.logger.models import (
|
|
19
14
|
CDPLogLevelStats,
|
|
20
15
|
CDPMainLogEntry,
|
|
@@ -27,9 +22,6 @@ from osn_selenium.dev_tools.logger.models import (
|
|
|
27
22
|
|
|
28
23
|
__all__ = ["BaseMixin"]
|
|
29
24
|
|
|
30
|
-
if TYPE_CHECKING:
|
|
31
|
-
from osn_selenium.webdrivers.trio_threads.core import CoreWebDriver
|
|
32
|
-
|
|
33
25
|
|
|
34
26
|
class BaseMixin:
|
|
35
27
|
"""
|
|
@@ -41,43 +33,20 @@ class BaseMixin:
|
|
|
41
33
|
by using an asynchronous context manager.
|
|
42
34
|
|
|
43
35
|
Attributes:
|
|
44
|
-
_webdriver (CoreWebDriver): The parent WebDriver instance associated with this DevTools instance.
|
|
45
|
-
_new_targets_filter (Optional[List[Dict[str, Any]]]): Processed filters for new targets.
|
|
46
|
-
_new_targets_buffer_size (int): Buffer size for new target events.
|
|
47
|
-
_target_background_task (Optional[devtools_background_func_type]): Optional background task for targets.
|
|
48
|
-
_logger_settings (LoggerSettings): Logging configuration for the entire DevTools manager.
|
|
49
|
-
_bidi_connection (Optional[AbstractAsyncContextManager[BidiConnection, Any]]): Asynchronous context manager for the BiDi connection.
|
|
50
|
-
_bidi_connection_object (Optional[BidiConnection]): The BiDi connection object when active.
|
|
51
|
-
_nursery (Optional[AbstractAsyncContextManager[trio.Nursery, object]]): Asynchronous context manager for the Trio nursery.
|
|
52
|
-
_nursery_object (Optional[trio.Nursery]): The Trio nursery object when active, managing concurrent tasks.
|
|
53
|
-
_domains_settings (DomainsSettings): Settings for configuring DevTools domain handlers.
|
|
54
|
-
_handling_targets (Dict[str, DevToolsTarget]): Dictionary of target IDs currently being handled by event listeners.
|
|
55
36
|
targets_lock (trio.Lock): A lock used for synchronizing access to shared resources, like the List of handled targets.
|
|
56
37
|
exit_event (Optional[trio.Event]): Trio Event to signal exiting of DevTools event handling.
|
|
57
|
-
_is_active (bool): Flag indicating if the DevTools event handler is currently active.
|
|
58
|
-
_is_closing (bool): Flag indicating if the DevTools manager is in the process of closing.
|
|
59
|
-
_num_cdp_logs (int): Total count of all CDP log entries across all targets.
|
|
60
|
-
_num_fingerprint_logs (int): Total count of all Fingerprint log entries across all targets.
|
|
61
|
-
_cdp_targets_types_stats (Dict[str, CDPTargetTypeStats]): Statistics for each target type.
|
|
62
|
-
_cdp_log_level_stats (Dict[str, CDPLogLevelStats]): Overall statistics for each log level.
|
|
63
|
-
_main_logger_cdp_send_channel (Optional[trio.MemorySendChannel[CDPMainLogEntry]]): Send channel for the main logger.
|
|
64
|
-
_fingerprint_categories_stats (Dict[str, FingerprintAPIStats]): Statistics for each API category.
|
|
65
|
-
_fingerprint_log_level_stats (Dict[str, FingerprintLogLevelStats]): Overall statistics for each log level.
|
|
66
|
-
_main_logger_fingerprint_send_channel (Optional[trio.MemorySendChannel[FingerprintMainLogEntry]]): Send channel for the main logger.
|
|
67
|
-
_main_logger (Optional[MainLogger]): The main logger instance.
|
|
68
|
-
_fingerprint_injection_script (Optional[str]): Injection script for fingerprinting.
|
|
69
38
|
"""
|
|
70
39
|
|
|
71
40
|
def __init__(
|
|
72
41
|
self,
|
|
73
|
-
parent_webdriver:
|
|
42
|
+
parent_webdriver: ANY_TRIO_WEBDRIVER_TYPEHINT,
|
|
74
43
|
devtools_settings: Optional[DevToolsSettings] = None
|
|
75
44
|
):
|
|
76
45
|
"""
|
|
77
46
|
Initializes the DevTools manager.
|
|
78
47
|
|
|
79
48
|
Args:
|
|
80
|
-
parent_webdriver (
|
|
49
|
+
parent_webdriver (ANY_TRIO_WEBDRIVER_TYPEHINT): The WebDriver instance to which this DevTools manager is attached.
|
|
81
50
|
devtools_settings (Optional[DevToolsSettings]): Configuration settings for DevTools.
|
|
82
51
|
If None, default settings will be used.
|
|
83
52
|
"""
|
|
@@ -97,12 +66,11 @@ class BaseMixin:
|
|
|
97
66
|
for filter_ in devtools_settings.new_targets_filter
|
|
98
67
|
] if devtools_settings.new_targets_filter is not None else None
|
|
99
68
|
|
|
100
|
-
self._bidi_connection: Optional[
|
|
101
|
-
self.
|
|
69
|
+
self._bidi_connection: Optional[BidiConnection] = None
|
|
70
|
+
self._nursery: Optional[trio.Nursery] = None
|
|
71
|
+
self._exit_stack = AsyncExitStack()
|
|
102
72
|
self._devtools_package: Optional[DevToolsPackage] = None
|
|
103
73
|
self._websocket_url: Optional[str] = None
|
|
104
|
-
self._nursery: Optional[AbstractAsyncContextManager[trio.Nursery, Optional[bool]]] = None
|
|
105
|
-
self._nursery_object: Optional[trio.Nursery] = None
|
|
106
74
|
self._handling_targets: Dict[str, DevToolsTarget] = {}
|
|
107
75
|
self.targets_lock = trio.Lock()
|
|
108
76
|
self.exit_event: Optional[trio.Event] = None
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import trio
|
|
2
2
|
from types import TracebackType
|
|
3
3
|
from typing import Optional, Type
|
|
4
|
-
from osn_selenium.
|
|
4
|
+
from osn_selenium._decorators import log_on_error
|
|
5
|
+
from osn_selenium._exception_helpers import log_exception
|
|
5
6
|
from osn_selenium.dev_tools._wrappers import DevToolsPackage
|
|
6
7
|
from osn_selenium.dev_tools.manager.targets import TargetsMixin
|
|
7
8
|
from osn_selenium.dev_tools.logger.main import build_main_logger
|
|
8
|
-
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
9
9
|
from osn_selenium.exceptions.devtools import (
|
|
10
10
|
BidiConnectionNotEstablishedError,
|
|
11
11
|
CDPEndExceptions,
|
|
12
|
-
CantEnterDevToolsContextError
|
|
12
|
+
CantEnterDevToolsContextError,
|
|
13
|
+
TrioEndExceptions
|
|
13
14
|
)
|
|
14
15
|
|
|
15
16
|
|
|
@@ -41,9 +42,11 @@ class LifecycleMixin(TargetsMixin):
|
|
|
41
42
|
|
|
42
43
|
if driver is None:
|
|
43
44
|
self._websocket_url = None
|
|
45
|
+
return
|
|
44
46
|
|
|
45
47
|
if driver.caps.get("se:cdp"):
|
|
46
48
|
self._websocket_url = driver.caps.get("se:cdp")
|
|
49
|
+
return
|
|
47
50
|
|
|
48
51
|
self._websocket_url = driver._get_cdp_details()[1]
|
|
49
52
|
except CDPEndExceptions as error:
|
|
@@ -64,8 +67,8 @@ class LifecycleMixin(TargetsMixin):
|
|
|
64
67
|
"""
|
|
65
68
|
|
|
66
69
|
try:
|
|
67
|
-
if self.
|
|
68
|
-
self._devtools_package = DevToolsPackage(package=self.
|
|
70
|
+
if self._bidi_connection is not None:
|
|
71
|
+
self._devtools_package = DevToolsPackage(package=self._bidi_connection.devtools)
|
|
69
72
|
else:
|
|
70
73
|
raise BidiConnectionNotEstablishedError()
|
|
71
74
|
except CDPEndExceptions as error:
|
|
@@ -74,9 +77,9 @@ class LifecycleMixin(TargetsMixin):
|
|
|
74
77
|
log_exception(error)
|
|
75
78
|
raise error
|
|
76
79
|
|
|
77
|
-
async def
|
|
80
|
+
async def start(self) -> None:
|
|
78
81
|
"""
|
|
79
|
-
Initializes and
|
|
82
|
+
Initializes and starts the DevTools manager.
|
|
80
83
|
|
|
81
84
|
This method sets up the BiDi connection, starts the Trio nursery, retrieves
|
|
82
85
|
necessary CDP packages and URLs, initializes the main logger, and adds the
|
|
@@ -89,21 +92,18 @@ class LifecycleMixin(TargetsMixin):
|
|
|
89
92
|
if self._webdriver.driver is None:
|
|
90
93
|
raise CantEnterDevToolsContextError(reason="Driver is not initialized")
|
|
91
94
|
|
|
92
|
-
self.
|
|
93
|
-
self.
|
|
94
|
-
|
|
95
|
-
self._nursery = trio.open_nursery()
|
|
96
|
-
self._nursery_object = await self._nursery.__aenter__()
|
|
95
|
+
self._nursery = await self._exit_stack.enter_async_context(trio.open_nursery())
|
|
96
|
+
self._bidi_connection = await self._exit_stack.enter_async_context(self._webdriver.bidi_connection())
|
|
97
97
|
|
|
98
98
|
self._get_devtools_package()
|
|
99
99
|
self._get_websocket_url()
|
|
100
100
|
|
|
101
|
-
self._main_logger_cdp_send_channel, self._main_logger_fingerprint_send_channel, self._main_logger = build_main_logger(self.
|
|
101
|
+
self._main_logger_cdp_send_channel, self._main_logger_fingerprint_send_channel, self._main_logger = build_main_logger(nursery=self._nursery, logger_settings=self._logger_settings)
|
|
102
102
|
await self._main_logger.run()
|
|
103
103
|
|
|
104
104
|
self.exit_event = trio.Event()
|
|
105
105
|
|
|
106
|
-
self._fingerprint_injection_script = await self._webdriver.sync_to_trio(sync_function=self._fingerprint_settings.generate_js)()
|
|
106
|
+
self._fingerprint_injection_script = await self._webdriver.sync_to_trio(sync_function=self._fingerprint_settings.generate_js)() if self._fingerprint_settings is not None else None
|
|
107
107
|
main_target = (await self._get_all_targets())[0]
|
|
108
108
|
|
|
109
109
|
await self._add_target(target_event=main_target, is_main_target=True)
|
|
@@ -122,115 +122,124 @@ class LifecycleMixin(TargetsMixin):
|
|
|
122
122
|
BaseException: If any other unexpected error occurs during context entry.
|
|
123
123
|
"""
|
|
124
124
|
|
|
125
|
-
await self.
|
|
125
|
+
await self.start()
|
|
126
126
|
|
|
127
|
-
async def stop(
|
|
128
|
-
self,
|
|
129
|
-
exc_type: Optional[Type[BaseException]],
|
|
130
|
-
exc_val: Optional[BaseException],
|
|
131
|
-
exc_tb: Optional[TracebackType],
|
|
132
|
-
) -> None:
|
|
127
|
+
async def stop(self) -> None:
|
|
133
128
|
"""
|
|
134
129
|
Stops the DevTools manager and cleans up resources.
|
|
135
130
|
|
|
136
131
|
This method signals all targets to stop, closes the main logger, cancels the nursery,
|
|
137
132
|
and closes the BiDi connection.
|
|
138
|
-
|
|
139
|
-
Args:
|
|
140
|
-
exc_type (Optional[Type[BaseException]]): The exception type if stopping due to an error.
|
|
141
|
-
exc_val (Optional[BaseException]): The exception value if stopping due to an error.
|
|
142
|
-
exc_tb (Optional[TracebackType]): The traceback if stopping due to an error.
|
|
143
133
|
"""
|
|
144
134
|
|
|
145
135
|
@log_on_error
|
|
146
|
-
async def _stop_main_logger():
|
|
136
|
+
async def _stop_main_logger() -> None:
|
|
147
137
|
"""Stops the main logger and closes its channels."""
|
|
148
138
|
|
|
149
139
|
if self._main_logger_cdp_send_channel is not None:
|
|
150
|
-
|
|
140
|
+
try:
|
|
141
|
+
await self._main_logger_cdp_send_channel.aclose()
|
|
142
|
+
except TrioEndExceptions:
|
|
143
|
+
pass
|
|
144
|
+
|
|
151
145
|
self._main_logger_cdp_send_channel = None
|
|
152
146
|
|
|
153
147
|
if self._main_logger_fingerprint_send_channel is not None:
|
|
154
|
-
|
|
148
|
+
try:
|
|
149
|
+
await self._main_logger_fingerprint_send_channel.aclose()
|
|
150
|
+
except TrioEndExceptions:
|
|
151
|
+
pass
|
|
152
|
+
|
|
155
153
|
self._main_logger_fingerprint_send_channel = None
|
|
156
154
|
|
|
157
155
|
if self._main_logger is not None:
|
|
158
|
-
|
|
156
|
+
try:
|
|
157
|
+
await self._main_logger.close()
|
|
158
|
+
except TrioEndExceptions:
|
|
159
|
+
pass
|
|
160
|
+
|
|
159
161
|
self._main_logger = None
|
|
160
162
|
|
|
161
163
|
@log_on_error
|
|
162
|
-
async def _stop_all_targets():
|
|
164
|
+
async def _stop_all_targets() -> None:
|
|
163
165
|
"""Signals all active targets to stop and waits for their completion."""
|
|
164
166
|
|
|
165
167
|
for target in self._handling_targets.copy().values():
|
|
166
168
|
try:
|
|
167
169
|
await target.stop()
|
|
168
170
|
await target.stopped_event.wait()
|
|
169
|
-
except (BaseException):
|
|
171
|
+
except (BaseException,):
|
|
170
172
|
pass
|
|
171
173
|
|
|
172
|
-
self._handling_targets
|
|
174
|
+
self._handling_targets.clear()
|
|
173
175
|
|
|
174
176
|
@log_on_error
|
|
175
|
-
async def
|
|
176
|
-
"""
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
self._nursery_object.cancel_scope.cancel()
|
|
180
|
-
self._nursery_object = None
|
|
177
|
+
async def _close_async_stack() -> None:
|
|
178
|
+
"""
|
|
179
|
+
Closes the asynchronous resource stack.
|
|
180
|
+
"""
|
|
181
181
|
|
|
182
182
|
if self._nursery is not None:
|
|
183
|
-
|
|
183
|
+
try:
|
|
184
|
+
self._nursery.cancel_scope.cancel()
|
|
185
|
+
except TrioEndExceptions:
|
|
186
|
+
pass
|
|
187
|
+
|
|
184
188
|
self._nursery = None
|
|
185
|
-
|
|
186
|
-
@log_on_error
|
|
187
|
-
async def _close_bidi_connection():
|
|
188
|
-
"""Asynchronously exits the BiDi connection context manager."""
|
|
189
189
|
|
|
190
190
|
if self._bidi_connection is not None:
|
|
191
|
-
await self._bidi_connection.__aexit__(exc_type, exc_val, exc_tb)
|
|
192
191
|
self._bidi_connection = None
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
192
|
+
|
|
193
|
+
try:
|
|
194
|
+
await self._exit_stack.aclose()
|
|
195
|
+
except TrioEndExceptions:
|
|
196
|
+
pass
|
|
197
|
+
except AssertionError:
|
|
198
|
+
pass # TODO solve exit issue
|
|
199
|
+
|
|
200
|
+
if not self._is_active:
|
|
201
|
+
return
|
|
202
|
+
|
|
203
|
+
self._is_closing = True
|
|
204
|
+
self.exit_event.set()
|
|
205
|
+
|
|
206
|
+
await _stop_all_targets()
|
|
207
|
+
await _stop_main_logger()
|
|
208
|
+
await _close_async_stack()
|
|
209
|
+
|
|
210
|
+
self.exit_event = None
|
|
211
|
+
self._devtools_package = None
|
|
212
|
+
self._websocket_url = None
|
|
213
|
+
self._num_cdp_logs = 0
|
|
214
|
+
self._num_fingerprint_logs = 0
|
|
215
|
+
self._cdp_targets_types_stats.clear()
|
|
216
|
+
self._cdp_log_level_stats.clear()
|
|
217
|
+
self._fingerprint_categories_stats.clear()
|
|
218
|
+
self._fingerprint_log_level_stats.clear()
|
|
219
|
+
self._is_active = False
|
|
220
|
+
self._is_closing = False
|
|
215
221
|
|
|
216
222
|
async def __aexit__(
|
|
217
223
|
self,
|
|
218
224
|
exc_type: Optional[Type[BaseException]],
|
|
219
225
|
exc_val: Optional[BaseException],
|
|
220
226
|
exc_tb: Optional[TracebackType],
|
|
221
|
-
):
|
|
227
|
+
) -> bool:
|
|
222
228
|
"""
|
|
223
229
|
Asynchronously exits the DevTools event handling context.
|
|
224
230
|
|
|
225
|
-
This method is called when exiting an `async with` block with a DevTools instance.
|
|
226
|
-
It ensures that all event listeners are cancelled, the Trio nursery is closed,
|
|
227
|
-
and the BiDi connection is properly shut down. Cleanup attempts are made even if
|
|
228
|
-
an exception occurred within the `async with` block.
|
|
229
|
-
|
|
230
231
|
Args:
|
|
231
|
-
exc_type (Optional[Type[BaseException]]): The exception type, if any
|
|
232
|
+
exc_type (Optional[Type[BaseException]]): The exception type, if any.
|
|
232
233
|
exc_val (Optional[BaseException]): The exception value, if any.
|
|
233
234
|
exc_tb (Optional[TracebackType]): The exception traceback, if any.
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
bool: True if an exception was suppressed, False otherwise.
|
|
234
238
|
"""
|
|
235
239
|
|
|
236
|
-
await self.stop(
|
|
240
|
+
await self.stop()
|
|
241
|
+
|
|
242
|
+
if exc_type is not None and exc_val is not None and exc_tb is not None:
|
|
243
|
+
return True
|
|
244
|
+
|
|
245
|
+
return False
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import trio
|
|
2
2
|
from osn_selenium.dev_tools.manager.base import BaseMixin
|
|
3
|
+
from osn_selenium._exception_helpers import log_exception
|
|
3
4
|
from osn_selenium.exceptions.devtools import CDPEndExceptions
|
|
4
|
-
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
5
5
|
from osn_selenium.dev_tools.logger.models import (
|
|
6
6
|
CDPLogLevelStats,
|
|
7
7
|
CDPMainLogEntry,
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
from typing import Any, List, Optional
|
|
2
|
+
|
|
3
|
+
import trio
|
|
4
|
+
|
|
2
5
|
from osn_selenium.dev_tools.models import TargetData
|
|
3
6
|
from osn_selenium.dev_tools.target import DevToolsTarget
|
|
7
|
+
from osn_selenium._exception_helpers import log_exception
|
|
4
8
|
from osn_selenium.dev_tools.manager.logging import LoggingMixin
|
|
5
|
-
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
6
9
|
from osn_selenium.dev_tools.logger.models import CDPTargetTypeStats
|
|
7
10
|
from osn_selenium.exceptions.devtools import (
|
|
8
11
|
BidiConnectionNotEstablishedError,
|
|
@@ -106,7 +109,7 @@ class TargetsMixin(LoggingMixin):
|
|
|
106
109
|
websocket_url=self._websocket_url,
|
|
107
110
|
new_targets_filter_list=self._new_targets_filter,
|
|
108
111
|
new_targets_buffer_size=self._new_targets_buffer_size,
|
|
109
|
-
nursery=self.
|
|
112
|
+
nursery=self._nursery,
|
|
110
113
|
exit_event=self.exit_event,
|
|
111
114
|
fingerprint_injection_script=self._fingerprint_injection_script,
|
|
112
115
|
target_background_task=self._target_background_task,
|
|
@@ -123,7 +126,12 @@ class TargetsMixin(LoggingMixin):
|
|
|
123
126
|
|
|
124
127
|
await self._add_main_cdp_log()
|
|
125
128
|
|
|
126
|
-
|
|
129
|
+
if is_main_target:
|
|
130
|
+
self._nursery.start_soon(self._handling_targets[target_id].run)
|
|
131
|
+
await self._handling_targets[target_id].started_event.wait()
|
|
132
|
+
await trio.sleep(1.0)
|
|
133
|
+
else:
|
|
134
|
+
self._nursery.start_soon(self._handling_targets[target_id].run)
|
|
127
135
|
|
|
128
136
|
return True
|
|
129
137
|
else:
|
|
@@ -156,7 +164,7 @@ class TargetsMixin(LoggingMixin):
|
|
|
156
164
|
"""
|
|
157
165
|
|
|
158
166
|
try:
|
|
159
|
-
if self.
|
|
167
|
+
if self._bidi_connection is not None:
|
|
160
168
|
targets_filter = self._devtools_package.get("target.TargetFilter")(
|
|
161
169
|
[
|
|
162
170
|
{"exclude": False, "type": "page"},
|
|
@@ -165,7 +173,7 @@ class TargetsMixin(LoggingMixin):
|
|
|
165
173
|
]
|
|
166
174
|
)
|
|
167
175
|
|
|
168
|
-
return await self.
|
|
176
|
+
return await self._bidi_connection.session.execute(self._devtools_package.get("target.get_targets")(targets_filter))
|
|
169
177
|
|
|
170
178
|
raise BidiConnectionNotEstablishedError()
|
|
171
179
|
except CDPEndExceptions as error:
|
osn_selenium/dev_tools/models.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
from pydantic import Field
|
|
3
|
-
from osn_selenium.
|
|
3
|
+
from osn_selenium._base_models import DictModel
|
|
4
4
|
from osn_selenium.dev_tools.filters import TargetFilter
|
|
5
5
|
from osn_selenium.dev_tools.domains import DomainsSettings
|
|
6
6
|
from typing import (
|
|
@@ -39,6 +39,7 @@ class FingerprintLoggerSettings(DictModel):
|
|
|
39
39
|
Defaults to "exclude".
|
|
40
40
|
category_filter (Optional[Union[str, Sequence[str]]]): Specific categories to filter.
|
|
41
41
|
Defaults to None.
|
|
42
|
+
send_wait (bool): Whether to wait for the log to be sent. Defaults to False.
|
|
42
43
|
"""
|
|
43
44
|
|
|
44
45
|
buffer_size: int = 100
|
|
@@ -51,6 +52,7 @@ class FingerprintLoggerSettings(DictModel):
|
|
|
51
52
|
] = None
|
|
52
53
|
category_filter_mode: Literal["exclude", "include"] = "exclude"
|
|
53
54
|
category_filter: Optional[Union[str, Sequence[str]]] = None
|
|
55
|
+
send_wait: bool = False
|
|
54
56
|
|
|
55
57
|
|
|
56
58
|
class CDPLoggerSettings(DictModel):
|
|
@@ -62,24 +64,26 @@ class CDPLoggerSettings(DictModel):
|
|
|
62
64
|
log_level_filter_mode (Literal["exclude", "include"]): The mode for filtering log levels.
|
|
63
65
|
"exclude" means log levels in `log_level_filter` will be excluded.
|
|
64
66
|
"include" means only log levels in `log_level_filter` will be included.
|
|
65
|
-
Defaults to "
|
|
67
|
+
Defaults to "include".
|
|
66
68
|
log_level_filter (Optional[Union[CDPLogLevelsType, Sequence[CDPLogLevelsType]]]):
|
|
67
69
|
A single log level or a sequence of log levels to filter by.
|
|
68
70
|
Used in conjunction with `log_level_filter_mode`. Defaults to None.
|
|
69
71
|
target_type_filter_mode (Literal["exclude", "include"]): The mode for filtering target types.
|
|
70
72
|
"exclude" means target types in `target_type_filter` will be excluded.
|
|
71
73
|
"include" means only target types in `target_type_filter` will be included.
|
|
72
|
-
Defaults to "
|
|
74
|
+
Defaults to "include".
|
|
73
75
|
target_type_filter (Optional[Union[str, Sequence[str]]]):
|
|
74
76
|
A single target type string or a sequence of target type strings to filter by.
|
|
75
77
|
Used in conjunction with `target_type_filter_mode`. Defaults to None.
|
|
78
|
+
send_wait (bool): Whether to wait for the log to be sent. Defaults to False.
|
|
76
79
|
"""
|
|
77
80
|
|
|
78
81
|
buffer_size: int = 100
|
|
79
|
-
log_level_filter_mode: Literal["exclude", "include"] = "
|
|
82
|
+
log_level_filter_mode: Literal["exclude", "include"] = "include"
|
|
80
83
|
log_level_filter: Optional[Union[CDP_LOG_LEVELS_TYPEHINT, Sequence[CDP_LOG_LEVELS_TYPEHINT]]] = None
|
|
81
|
-
target_type_filter_mode: Literal["exclude", "include"] = "
|
|
84
|
+
target_type_filter_mode: Literal["exclude", "include"] = "include"
|
|
82
85
|
target_type_filter: Optional[Union[str, Sequence[str]]] = None
|
|
86
|
+
send_wait: bool = False
|
|
83
87
|
|
|
84
88
|
|
|
85
89
|
class LoggerSettings(DictModel):
|
|
@@ -50,29 +50,6 @@ class BaseMixin:
|
|
|
50
50
|
about_to_stop_event (trio.Event): Event set when the target is about to stop.
|
|
51
51
|
stopped_event (trio.Event): Event set when the target handling has fully stopped.
|
|
52
52
|
background_task_ended (Optional[trio.Event]): Event set when the background task completes.
|
|
53
|
-
_is_main_target (bool): Whether this is the primary target.
|
|
54
|
-
_logger_settings ("LoggerSettings"): Configuration for logging.
|
|
55
|
-
_domains_settings (Optional["DomainsSettings"]): Configuration for enabled domains and handlers.
|
|
56
|
-
_new_targets_filter_list (Sequence[Mapping[str, Any]]): Filters for discovering new targets.
|
|
57
|
-
_new_targets_buffer_size (int): Buffer size for new target events.
|
|
58
|
-
_nursery_object (trio.Nursery): Trio nursery for background tasks.
|
|
59
|
-
_target_background_task (Optional[devtools_background_func_type]): Optional background task to run.
|
|
60
|
-
_add_target_func (Callable): Callback to add a new target.
|
|
61
|
-
_remove_target_func (Callable): Callback to remove this target.
|
|
62
|
-
_add_cdp_log_func (Callable): Callback to record a CDP log entry.
|
|
63
|
-
_add_fingerprint_log_func (Callable): Callback to record a fingerprint log entry.
|
|
64
|
-
_fingerprint_injection_script (Optional[str]): JS script to inject into the target.
|
|
65
|
-
_new_targets_events_filters (Any): Validated filters for target events.
|
|
66
|
-
_cdp_target_type_log_accepted (bool): Whether CDP logging is enabled for this target type.
|
|
67
|
-
_cdp_log_stats (CDPLoggerChannelStats): Statistics for CDP logs.
|
|
68
|
-
_fingerprint_log_stats (FingerprintLoggerChannelStats): Statistics for fingerprint logs.
|
|
69
|
-
_logger_cdp_send_channel (Optional[trio.MemorySendChannel]): Channel to send CDP logs to the logger.
|
|
70
|
-
_logger_fingerprint_send_channel (Optional[trio.MemorySendChannel]): Channel to send fingerprint logs.
|
|
71
|
-
_logger (Optional[TargetLogger]): The logger instance for this target.
|
|
72
|
-
_cdp_session (Optional[CdpSession]): The active CDP session.
|
|
73
|
-
_new_target_receive_channel (Optional[Tuple[trio.MemoryReceiveChannel, trio.Event]]): Channel for new target events.
|
|
74
|
-
_detached_receive_channel (Optional[trio.MemoryReceiveChannel]): Channel for detach events.
|
|
75
|
-
_events_receive_channels (Dict[str, Tuple[trio.MemoryReceiveChannel, trio.Event]]): Channels for domain events.
|
|
76
53
|
"""
|
|
77
54
|
|
|
78
55
|
def __init__(
|
|
@@ -124,7 +101,7 @@ class BaseMixin:
|
|
|
124
101
|
self.websocket_url = websocket_url
|
|
125
102
|
self._new_targets_filter_list = new_targets_filter_list
|
|
126
103
|
self._new_targets_buffer_size = new_targets_buffer_size
|
|
127
|
-
self.
|
|
104
|
+
self._nursery = nursery
|
|
128
105
|
self.exit_event = exit_event
|
|
129
106
|
self._target_background_task = target_background_task
|
|
130
107
|
self._add_target_func = add_target_func
|
|
@@ -135,11 +112,14 @@ class BaseMixin:
|
|
|
135
112
|
|
|
136
113
|
self._new_targets_events_filters = validate_target_event_filter(filter_=new_targets_filter_list)
|
|
137
114
|
|
|
138
|
-
self.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
115
|
+
if self._logger_settings.cdp_settings is not None:
|
|
116
|
+
self._cdp_target_type_log_accepted = validate_type_filter(
|
|
117
|
+
type_=self.type_,
|
|
118
|
+
filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
|
|
119
|
+
filter_instances=self._logger_settings.cdp_settings.target_type_filter
|
|
120
|
+
)
|
|
121
|
+
else:
|
|
122
|
+
self._cdp_target_type_log_accepted = False
|
|
143
123
|
|
|
144
124
|
self._cdp_log_stats = CDPLoggerChannelStats(
|
|
145
125
|
target_id=target_data.target_id,
|
|
@@ -164,6 +144,7 @@ class BaseMixin:
|
|
|
164
144
|
self._new_target_receive_channel: Optional[Tuple[trio.MemoryReceiveChannel, trio.Event]] = None
|
|
165
145
|
self._detached_receive_channel: Optional[trio.MemoryReceiveChannel] = None
|
|
166
146
|
self._events_receive_channels: Dict[str, Tuple[trio.MemoryReceiveChannel, trio.Event]] = {}
|
|
147
|
+
self._cancel_scopes: Dict[str, trio.CancelScope] = {}
|
|
167
148
|
|
|
168
149
|
@property
|
|
169
150
|
def type_(self) -> Optional[str]:
|
|
@@ -185,11 +166,15 @@ class BaseMixin:
|
|
|
185
166
|
value (Optional[str]): The new target type.
|
|
186
167
|
"""
|
|
187
168
|
|
|
188
|
-
self.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
169
|
+
if self._logger_settings.cdp_settings is not None:
|
|
170
|
+
self._cdp_target_type_log_accepted = validate_type_filter(
|
|
171
|
+
type_=value,
|
|
172
|
+
filter_mode=self._logger_settings.cdp_settings.target_type_filter_mode,
|
|
173
|
+
filter_instances=self._logger_settings.cdp_settings.target_type_filter
|
|
174
|
+
)
|
|
175
|
+
else:
|
|
176
|
+
self._cdp_target_type_log_accepted = False
|
|
177
|
+
|
|
193
178
|
self.target_data.type_ = value
|
|
194
179
|
|
|
195
180
|
@property
|
|
@@ -258,6 +243,17 @@ class BaseMixin:
|
|
|
258
243
|
|
|
259
244
|
self.target_data.can_access_opener = value
|
|
260
245
|
|
|
246
|
+
@property
|
|
247
|
+
def cancel_scopes(self) -> Dict[str, trio.CancelScope]:
|
|
248
|
+
"""
|
|
249
|
+
Provides access to the dictionary of cancellation scopes.
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
Dict[str, trio.CancelScope]: The cancel scopes dictionary.
|
|
253
|
+
"""
|
|
254
|
+
|
|
255
|
+
return self._cancel_scopes
|
|
256
|
+
|
|
261
257
|
@property
|
|
262
258
|
def cdp_log_stats(self) -> CDPLoggerChannelStats:
|
|
263
259
|
"""
|
|
@@ -65,7 +65,7 @@ class DiscoveryMixin(LoggingMixin):
|
|
|
65
65
|
flatten=True
|
|
66
66
|
)
|
|
67
67
|
|
|
68
|
-
self.
|
|
68
|
+
self._nursery.start_soon(self._add_target_func, event)
|
|
69
69
|
except* CDPEndExceptions:
|
|
70
70
|
keep_alive = False
|
|
71
71
|
except* BaseException as error:
|
|
@@ -59,7 +59,7 @@ class EventHandlersMixin(LoggingMixin):
|
|
|
59
59
|
while keep_alive:
|
|
60
60
|
try:
|
|
61
61
|
event = await receiver_channel.receive()
|
|
62
|
-
self.
|
|
62
|
+
self._nursery.start_soon(handler, self, event_config, event)
|
|
63
63
|
except* CDPEndExceptions:
|
|
64
64
|
keep_alive = False
|
|
65
65
|
except* BaseException as error:
|
|
@@ -99,7 +99,7 @@ class EventHandlersMixin(LoggingMixin):
|
|
|
99
99
|
event_handler_ready_event = trio.Event()
|
|
100
100
|
events_handlers_ready_events.append(event_handler_ready_event)
|
|
101
101
|
|
|
102
|
-
self.
|
|
102
|
+
self._nursery.start_soon(
|
|
103
103
|
self._run_event_handler,
|
|
104
104
|
event_handler_ready_event,
|
|
105
105
|
getattr(domain_config.handlers, event_name)
|
|
@@ -118,7 +118,7 @@ class FingerprintMixin(LoggingMixin):
|
|
|
118
118
|
run_immediately=True,
|
|
119
119
|
)
|
|
120
120
|
|
|
121
|
-
self.
|
|
121
|
+
self._nursery.start_soon(self._run_fingerprint_detect_listener, ready_event)
|
|
122
122
|
except* CDPEndExceptions as error:
|
|
123
123
|
raise error
|
|
124
124
|
except* BaseException as error:
|