osn-selenium 1.1.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/_decorators.py +57 -0
- osn_selenium/_trio_threads_helpers.py +157 -0
- osn_selenium/_typehints.py +1 -1
- 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/dev_tools/_decorators.py +1 -42
- osn_selenium/dev_tools/_functions.py +2 -4
- osn_selenium/dev_tools/domains/__init__.py +1 -1
- osn_selenium/dev_tools/domains/fetch.py +5 -7
- osn_selenium/dev_tools/domains_default/fetch.py +1 -1
- osn_selenium/dev_tools/logger/main.py +9 -9
- osn_selenium/dev_tools/logger/target.py +7 -7
- osn_selenium/dev_tools/manager/base.py +10 -19
- osn_selenium/dev_tools/manager/lifecycle.py +83 -74
- osn_selenium/dev_tools/manager/logging.py +1 -1
- osn_selenium/dev_tools/manager/targets.py +13 -5
- osn_selenium/dev_tools/settings.py +4 -4
- osn_selenium/dev_tools/target/base.py +18 -11
- 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 -43
- osn_selenium/dev_tools/target/logging.py +1 -1
- 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 +2 -2
- 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 +0 -5
- 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 +0 -5
- osn_selenium/flags/base.py +6 -4
- osn_selenium/flags/blink.py +2 -2
- osn_selenium/flags/chrome.py +6 -6
- osn_selenium/flags/edge.py +6 -6
- osn_selenium/instances/convert.py +44 -3
- osn_selenium/instances/protocols.py +47 -1
- osn_selenium/instances/sync/browsing_context.py +2 -2
- osn_selenium/instances/sync/script.py +7 -2
- 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/browsing_context.py +2 -2
- osn_selenium/instances/trio_threads/fedcm.py +1 -1
- osn_selenium/instances/trio_threads/network.py +1 -1
- osn_selenium/instances/trio_threads/script.py +7 -2
- 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 +2 -1
- 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/trio_threads_mixin.py +22 -68
- osn_selenium/webdrivers/_args_helpers.py +118 -5
- osn_selenium/webdrivers/_typehints.py +9 -3
- osn_selenium/webdrivers/protocols.py +81 -1
- osn_selenium/webdrivers/sync/blink/base.py +10 -0
- osn_selenium/webdrivers/sync/blink/lifecycle.py +26 -8
- osn_selenium/webdrivers/sync/chrome/lifecycle.py +23 -5
- osn_selenium/webdrivers/sync/chrome/settings.py +6 -1
- osn_selenium/webdrivers/sync/core/base.py +3 -11
- 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/lifecycle.py +23 -5
- osn_selenium/webdrivers/sync/edge/settings.py +6 -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 +7 -1
- osn_selenium/webdrivers/trio_threads/blink/base.py +14 -0
- osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +26 -8
- 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 +0 -10
- 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 +4 -16
- osn_selenium/webdrivers/trio_threads/core/capture.py +3 -2
- osn_selenium/webdrivers/trio_threads/core/file.py +3 -2
- osn_selenium/webdrivers/trio_threads/core/lifecycle.py +44 -10
- osn_selenium/webdrivers/trio_threads/core/script.py +3 -2
- 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 +4 -4
- 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/lifecycle.py +23 -5
- osn_selenium/webdrivers/trio_threads/yandex/settings.py +1 -1
- osn_selenium/webdrivers/unified/blink/base.py +5 -1
- osn_selenium/webdrivers/unified/blink/lifecycle.py +4 -2
- osn_selenium/webdrivers/unified/chrome/base.py +5 -1
- osn_selenium/webdrivers/unified/core/auth.py +4 -2
- osn_selenium/webdrivers/unified/core/base.py +16 -10
- 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 +5 -1
- osn_selenium/webdrivers/unified/yandex/base.py +5 -1
- {osn_selenium-1.1.0.dist-info → osn_selenium-1.2.0.dist-info}/METADATA +3 -2
- osn_selenium-1.2.0.dist-info/RECORD +480 -0
- 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/base_mixin.py +0 -122
- 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.1.0.dist-info/RECORD +0 -615
- /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.1.0.dist-info → osn_selenium-1.2.0.dist-info}/WHEEL +0 -0
- {osn_selenium-1.1.0.dist-info → osn_selenium-1.2.0.dist-info}/top_level.txt +0 -0
|
@@ -6,10 +6,10 @@ from typing import (
|
|
|
6
6
|
Tuple
|
|
7
7
|
)
|
|
8
8
|
from osn_selenium.dev_tools.models import TargetData
|
|
9
|
+
from osn_selenium._exception_helpers import log_exception
|
|
9
10
|
from osn_selenium.dev_tools.settings import LoggerSettings
|
|
10
11
|
from osn_selenium.exceptions.devtools import TrioEndExceptions
|
|
11
12
|
from osn_selenium.dev_tools._validators import validate_log_filter
|
|
12
|
-
from osn_selenium.dev_tools._exception_helpers import log_exception
|
|
13
13
|
from osn_selenium.dev_tools.logger.models import (
|
|
14
14
|
CDPTargetLogEntry,
|
|
15
15
|
FingerprintTargetLogEntry
|
|
@@ -30,7 +30,7 @@ class TargetLogger:
|
|
|
30
30
|
def __init__(
|
|
31
31
|
self,
|
|
32
32
|
logger_settings: LoggerSettings,
|
|
33
|
-
|
|
33
|
+
nursery: trio.Nursery,
|
|
34
34
|
target_data: TargetData,
|
|
35
35
|
cdp_receive_channel: Optional[trio.MemoryReceiveChannel[CDPTargetLogEntry]],
|
|
36
36
|
fingerprint_receive_channel: Optional[trio.MemoryReceiveChannel[FingerprintTargetLogEntry]],
|
|
@@ -40,7 +40,7 @@ class TargetLogger:
|
|
|
40
40
|
|
|
41
41
|
Args:
|
|
42
42
|
logger_settings (LoggerSettings): Configuration for logging.
|
|
43
|
-
|
|
43
|
+
nursery (trio.Nursery): The Trio nursery to spawn background tasks.
|
|
44
44
|
target_data (TargetData): The data of the browser target this logger will log for.
|
|
45
45
|
cdp_receive_channel (Optional[trio.MemoryReceiveChannel[CDPTargetLogEntry]]):
|
|
46
46
|
Channel to receive CDP logs.
|
|
@@ -52,7 +52,7 @@ class TargetLogger:
|
|
|
52
52
|
"""
|
|
53
53
|
|
|
54
54
|
self._target_data = target_data
|
|
55
|
-
self.
|
|
55
|
+
self._nursery = nursery
|
|
56
56
|
self._cdp_receive_channel = cdp_receive_channel
|
|
57
57
|
self._fingerprint_receive_channel = fingerprint_receive_channel
|
|
58
58
|
self._cdp_file_path: Optional[pathlib.Path] = None
|
|
@@ -220,12 +220,12 @@ class TargetLogger:
|
|
|
220
220
|
self._cdp_file_writing_stopped = trio.Event()
|
|
221
221
|
|
|
222
222
|
if self._cdp_file_path is not None:
|
|
223
|
-
self.
|
|
223
|
+
self._nursery.start_soon(self._write_cdp_file)
|
|
224
224
|
|
|
225
225
|
self._fingerprint_file_writing_stopped = trio.Event()
|
|
226
226
|
|
|
227
227
|
if self._fingerprint_file_path is not None:
|
|
228
|
-
self.
|
|
228
|
+
self._nursery.start_soon(self._write_fingerprint_file)
|
|
229
229
|
|
|
230
230
|
self._is_active = True
|
|
231
231
|
except* TrioEndExceptions:
|
|
@@ -269,7 +269,7 @@ def build_target_logger(
|
|
|
269
269
|
|
|
270
270
|
target_logger = TargetLogger(
|
|
271
271
|
logger_settings=logger_settings,
|
|
272
|
-
|
|
272
|
+
nursery=nursery_object,
|
|
273
273
|
target_data=target_data,
|
|
274
274
|
cdp_receive_channel=cdp_recv,
|
|
275
275
|
fingerprint_receive_channel=fp_recv,
|
|
@@ -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
|
"""
|
|
@@ -47,14 +39,14 @@ class BaseMixin:
|
|
|
47
39
|
|
|
48
40
|
def __init__(
|
|
49
41
|
self,
|
|
50
|
-
parent_webdriver:
|
|
42
|
+
parent_webdriver: ANY_TRIO_WEBDRIVER_TYPEHINT,
|
|
51
43
|
devtools_settings: Optional[DevToolsSettings] = None
|
|
52
44
|
):
|
|
53
45
|
"""
|
|
54
46
|
Initializes the DevTools manager.
|
|
55
47
|
|
|
56
48
|
Args:
|
|
57
|
-
parent_webdriver (
|
|
49
|
+
parent_webdriver (ANY_TRIO_WEBDRIVER_TYPEHINT): The WebDriver instance to which this DevTools manager is attached.
|
|
58
50
|
devtools_settings (Optional[DevToolsSettings]): Configuration settings for DevTools.
|
|
59
51
|
If None, default settings will be used.
|
|
60
52
|
"""
|
|
@@ -74,12 +66,11 @@ class BaseMixin:
|
|
|
74
66
|
for filter_ in devtools_settings.new_targets_filter
|
|
75
67
|
] if devtools_settings.new_targets_filter is not None else None
|
|
76
68
|
|
|
77
|
-
self._bidi_connection: Optional[
|
|
78
|
-
self.
|
|
69
|
+
self._bidi_connection: Optional[BidiConnection] = None
|
|
70
|
+
self._nursery: Optional[trio.Nursery] = None
|
|
71
|
+
self._exit_stack = AsyncExitStack()
|
|
79
72
|
self._devtools_package: Optional[DevToolsPackage] = None
|
|
80
73
|
self._websocket_url: Optional[str] = None
|
|
81
|
-
self._nursery: Optional[AbstractAsyncContextManager[trio.Nursery, Optional[bool]]] = None
|
|
82
|
-
self._nursery_object: Optional[trio.Nursery] = None
|
|
83
74
|
self._handling_targets: Dict[str, DevToolsTarget] = {}
|
|
84
75
|
self.targets_lock = trio.Lock()
|
|
85
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,44 +122,46 @@ 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():
|
|
@@ -169,68 +171,75 @@ class LifecycleMixin(TargetsMixin):
|
|
|
169
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:
|
|
@@ -64,14 +64,14 @@ class CDPLoggerSettings(DictModel):
|
|
|
64
64
|
log_level_filter_mode (Literal["exclude", "include"]): The mode for filtering log levels.
|
|
65
65
|
"exclude" means log levels in `log_level_filter` will be excluded.
|
|
66
66
|
"include" means only log levels in `log_level_filter` will be included.
|
|
67
|
-
Defaults to "
|
|
67
|
+
Defaults to "include".
|
|
68
68
|
log_level_filter (Optional[Union[CDPLogLevelsType, Sequence[CDPLogLevelsType]]]):
|
|
69
69
|
A single log level or a sequence of log levels to filter by.
|
|
70
70
|
Used in conjunction with `log_level_filter_mode`. Defaults to None.
|
|
71
71
|
target_type_filter_mode (Literal["exclude", "include"]): The mode for filtering target types.
|
|
72
72
|
"exclude" means target types in `target_type_filter` will be excluded.
|
|
73
73
|
"include" means only target types in `target_type_filter` will be included.
|
|
74
|
-
Defaults to "
|
|
74
|
+
Defaults to "include".
|
|
75
75
|
target_type_filter (Optional[Union[str, Sequence[str]]]):
|
|
76
76
|
A single target type string or a sequence of target type strings to filter by.
|
|
77
77
|
Used in conjunction with `target_type_filter_mode`. Defaults to None.
|
|
@@ -79,9 +79,9 @@ class CDPLoggerSettings(DictModel):
|
|
|
79
79
|
"""
|
|
80
80
|
|
|
81
81
|
buffer_size: int = 100
|
|
82
|
-
log_level_filter_mode: Literal["exclude", "include"] = "
|
|
82
|
+
log_level_filter_mode: Literal["exclude", "include"] = "include"
|
|
83
83
|
log_level_filter: Optional[Union[CDP_LOG_LEVELS_TYPEHINT, Sequence[CDP_LOG_LEVELS_TYPEHINT]]] = None
|
|
84
|
-
target_type_filter_mode: Literal["exclude", "include"] = "
|
|
84
|
+
target_type_filter_mode: Literal["exclude", "include"] = "include"
|
|
85
85
|
target_type_filter: Optional[Union[str, Sequence[str]]] = None
|
|
86
86
|
send_wait: bool = False
|
|
87
87
|
|
|
@@ -101,7 +101,7 @@ class BaseMixin:
|
|
|
101
101
|
self.websocket_url = websocket_url
|
|
102
102
|
self._new_targets_filter_list = new_targets_filter_list
|
|
103
103
|
self._new_targets_buffer_size = new_targets_buffer_size
|
|
104
|
-
self.
|
|
104
|
+
self._nursery = nursery
|
|
105
105
|
self.exit_event = exit_event
|
|
106
106
|
self._target_background_task = target_background_task
|
|
107
107
|
self._add_target_func = add_target_func
|
|
@@ -112,11 +112,14 @@ class BaseMixin:
|
|
|
112
112
|
|
|
113
113
|
self._new_targets_events_filters = validate_target_event_filter(filter_=new_targets_filter_list)
|
|
114
114
|
|
|
115
|
-
self.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
|
120
123
|
|
|
121
124
|
self._cdp_log_stats = CDPLoggerChannelStats(
|
|
122
125
|
target_id=target_data.target_id,
|
|
@@ -163,11 +166,15 @@ class BaseMixin:
|
|
|
163
166
|
value (Optional[str]): The new target type.
|
|
164
167
|
"""
|
|
165
168
|
|
|
166
|
-
self.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
+
|
|
171
178
|
self.target_data.type_ = value
|
|
172
179
|
|
|
173
180
|
@property
|
|
@@ -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:
|