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
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from pydantic import (
|
|
2
|
+
BaseModel,
|
|
3
|
+
ConfigDict
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
__all__ = ["DictModel", "ExtraDictModel"]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ExtraDictModel(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Base class for Pydantic models that allows extra fields.
|
|
13
|
+
|
|
14
|
+
This configuration allows the model to accept fields that are not
|
|
15
|
+
explicitly defined in the model's schema.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
model_config = ConfigDict(
|
|
19
|
+
populate_by_name=True,
|
|
20
|
+
extra="allow",
|
|
21
|
+
use_enum_values=True,
|
|
22
|
+
str_strip_whitespace=True,
|
|
23
|
+
validate_assignment=True,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class DictModel(BaseModel):
|
|
28
|
+
"""
|
|
29
|
+
Base class for Pydantic models with a predefined configuration.
|
|
30
|
+
|
|
31
|
+
This configuration enforces strict validation rules such as forbidding extra
|
|
32
|
+
fields and stripping whitespace from string inputs.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
model_config = ConfigDict(
|
|
36
|
+
populate_by_name=True,
|
|
37
|
+
extra="forbid",
|
|
38
|
+
use_enum_values=True,
|
|
39
|
+
str_strip_whitespace=True,
|
|
40
|
+
validate_assignment=True,
|
|
41
|
+
)
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import sys
|
|
3
|
+
import pathlib
|
|
4
|
+
import importlib.util
|
|
5
|
+
import urllib.request
|
|
6
|
+
from types import ModuleType
|
|
7
|
+
from datetime import datetime, timedelta
|
|
8
|
+
from importlib.abc import MetaPathFinder
|
|
9
|
+
from importlib.machinery import ModuleSpec
|
|
10
|
+
from osn_selenium._typehints import PATH_TYPEHINT
|
|
11
|
+
from typing import (
|
|
12
|
+
Dict,
|
|
13
|
+
Mapping,
|
|
14
|
+
Optional,
|
|
15
|
+
Sequence,
|
|
16
|
+
Tuple,
|
|
17
|
+
Union
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__all__ = ["check_cdp_version_exists_on_github", "install_cdp_hook"]
|
|
22
|
+
|
|
23
|
+
_SELENIUM_CDP_PATTERN = re.compile(r"selenium\.webdriver\.common\.devtools\.v(\d+)(.*)")
|
|
24
|
+
_INTERNAL_CDP_PATTERN = re.compile(r"osn_selenium_cdp_v(\d+)(?!\.legacy)(.*)")
|
|
25
|
+
|
|
26
|
+
_GITHUB_VERSIONS_CACHE: Dict[str, Tuple[bool, datetime]] = {}
|
|
27
|
+
_CDP_PACKAGE_ERROR = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _build_cdp_package_error(version: int) -> Exception:
|
|
31
|
+
"""
|
|
32
|
+
Creates an instance of the CDPPackageError exception.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
version (int): The version of the CDP package.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Exception: An instance of the CDPPackageError.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
global _CDP_PACKAGE_ERROR
|
|
42
|
+
|
|
43
|
+
if _CDP_PACKAGE_ERROR is None:
|
|
44
|
+
from osn_selenium.exceptions.dependencies import CDPPackageError
|
|
45
|
+
_CDP_PACKAGE_ERROR = CDPPackageError
|
|
46
|
+
|
|
47
|
+
return _CDP_PACKAGE_ERROR(version=version)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _get_external_spec(fullname: str, root_path: pathlib.Path, submodule_part: str) -> Optional[ModuleSpec]:
|
|
51
|
+
"""
|
|
52
|
+
Creates a module spec for an external path.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
fullname (str): The full name of the module.
|
|
56
|
+
root_path (pathlib.Path): The root directory where the module is located.
|
|
57
|
+
submodule_part (str): The part of the name representing submodules.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Optional[ModuleSpec]: The module spec if found, otherwise None.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
if not submodule_part:
|
|
64
|
+
target_path = root_path / "__init__.py"
|
|
65
|
+
is_package = True
|
|
66
|
+
else:
|
|
67
|
+
rel_path = submodule_part.lstrip(".").replace(".", "/")
|
|
68
|
+
target_path = root_path / f"{rel_path}.py"
|
|
69
|
+
|
|
70
|
+
if not target_path.exists():
|
|
71
|
+
target_path = root_path / rel_path / "__init__.py"
|
|
72
|
+
is_package = True
|
|
73
|
+
else:
|
|
74
|
+
is_package = False
|
|
75
|
+
|
|
76
|
+
if target_path.exists():
|
|
77
|
+
spec = importlib.util.spec_from_file_location(
|
|
78
|
+
name=fullname,
|
|
79
|
+
location=str(target_path),
|
|
80
|
+
submodule_search_locations=[str(root_path)]
|
|
81
|
+
if is_package
|
|
82
|
+
else None
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
return spec
|
|
86
|
+
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class _CdpMetaPathFinder(MetaPathFinder):
|
|
91
|
+
"""
|
|
92
|
+
A custom meta path finder to redirect Selenium CDP imports.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def __init__(
|
|
96
|
+
self,
|
|
97
|
+
cdp_paths: Optional[Mapping[int, PATH_TYPEHINT]] = None,
|
|
98
|
+
ignore_package_missing: bool = True
|
|
99
|
+
) -> None:
|
|
100
|
+
"""
|
|
101
|
+
Initializes the finder with user-defined CDP paths.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
cdp_paths (Optional[Mapping[int, PATH_TYPEHINT]]): Mapping of versions to paths.
|
|
105
|
+
ignore_package_missing (bool): Whether to ignore missing package errors.
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
self._user_cdp_paths = {k: pathlib.Path(v).resolve() for k, v in (cdp_paths or {}).items()}
|
|
109
|
+
|
|
110
|
+
self._ignore_package_missing = ignore_package_missing
|
|
111
|
+
|
|
112
|
+
def _find_spec_bypassing_self(self, fullname: str, path: Optional[Sequence[str]]) -> Optional[ModuleSpec]:
|
|
113
|
+
"""
|
|
114
|
+
Attempts to find the module specification using other finders in sys.meta_path.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
fullname (str): The full name of the module.
|
|
118
|
+
path (Optional[Sequence[str]]): The search path for the module.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Optional[ModuleSpec]: The module spec if found, otherwise None.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
for finder in sys.meta_path:
|
|
125
|
+
if finder is self:
|
|
126
|
+
continue
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
if hasattr(finder, "find_spec"):
|
|
130
|
+
spec = finder.find_spec(fullname, path)
|
|
131
|
+
|
|
132
|
+
if spec:
|
|
133
|
+
return spec
|
|
134
|
+
except (Exception,):
|
|
135
|
+
continue
|
|
136
|
+
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
def find_spec(
|
|
140
|
+
self,
|
|
141
|
+
fullname: str,
|
|
142
|
+
path: Optional[Sequence[str]],
|
|
143
|
+
target: Optional[ModuleType] = None,
|
|
144
|
+
) -> Optional[ModuleSpec]:
|
|
145
|
+
"""
|
|
146
|
+
Finds the specification for the requested module if it matches the CDP pattern.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
fullname (str): The full name of the module to find.
|
|
150
|
+
path (Optional[Sequence[str]]): The search path for the module.
|
|
151
|
+
target (Optional[ModuleType]): The module object if it is being reloaded.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Optional[ModuleSpec]: The module spec if found, otherwise None.
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
selenium_match = _SELENIUM_CDP_PATTERN.match(fullname)
|
|
158
|
+
internal_match = _INTERNAL_CDP_PATTERN.match(fullname)
|
|
159
|
+
|
|
160
|
+
if not (selenium_match or internal_match):
|
|
161
|
+
return None
|
|
162
|
+
|
|
163
|
+
match = selenium_match or internal_match
|
|
164
|
+
version_part = int(match.group(1))
|
|
165
|
+
submodule_part = match.group(2)
|
|
166
|
+
|
|
167
|
+
user_cdp_path = self._user_cdp_paths.get(version_part, None)
|
|
168
|
+
if user_cdp_path is not None:
|
|
169
|
+
root = (user_cdp_path / "legacy") if selenium_match else user_cdp_path
|
|
170
|
+
return _get_external_spec(fullname=fullname, root_path=root, submodule_part=submodule_part)
|
|
171
|
+
|
|
172
|
+
spec = None
|
|
173
|
+
|
|
174
|
+
if selenium_match:
|
|
175
|
+
target_name = f"osn_selenium_cdp_v{version_part}.legacy{submodule_part}"
|
|
176
|
+
spec = importlib.util.find_spec(target_name, path)
|
|
177
|
+
|
|
178
|
+
if internal_match:
|
|
179
|
+
target_name = f"osn_selenium_cdp_v{version_part}{submodule_part}"
|
|
180
|
+
spec = self._find_spec_bypassing_self(target_name, path)
|
|
181
|
+
|
|
182
|
+
try:
|
|
183
|
+
if spec:
|
|
184
|
+
return importlib.util.spec_from_file_location(
|
|
185
|
+
name=fullname,
|
|
186
|
+
location=spec.origin,
|
|
187
|
+
submodule_search_locations=spec.submodule_search_locations,
|
|
188
|
+
)
|
|
189
|
+
except ModuleNotFoundError:
|
|
190
|
+
if self._ignore_package_missing:
|
|
191
|
+
return None
|
|
192
|
+
|
|
193
|
+
raise _build_cdp_package_error(version=version_part)
|
|
194
|
+
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def install_cdp_hook(
|
|
199
|
+
cdp_paths: Optional[Mapping[int, PATH_TYPEHINT]] = None,
|
|
200
|
+
ignore_package_missing: bool = True,
|
|
201
|
+
) -> None:
|
|
202
|
+
"""
|
|
203
|
+
Installs the CDP meta path finder into sys.meta_path.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
cdp_paths (Optional[Mapping[int, PATH_TYPEHINT]]): Mapping of versions to custom local paths.
|
|
207
|
+
ignore_package_missing (bool): Whether to ignore missing package errors.
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
for finder in sys.meta_path:
|
|
211
|
+
if isinstance(finder, _CdpMetaPathFinder):
|
|
212
|
+
finder._user_cdp_paths.update({k: pathlib.Path(v).resolve() for k, v in (cdp_paths or {}).items()})
|
|
213
|
+
finder._ignore_package_missing = ignore_package_missing
|
|
214
|
+
|
|
215
|
+
return
|
|
216
|
+
|
|
217
|
+
sys.meta_path.insert(
|
|
218
|
+
0,
|
|
219
|
+
_CdpMetaPathFinder(cdp_paths=cdp_paths, ignore_package_missing=ignore_package_missing)
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def check_cdp_version_exists_on_github(version: Union[int, str]) -> bool:
|
|
224
|
+
"""
|
|
225
|
+
Checks if a specific CDP version exists in the remote repository.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
version (Union[int, str]): The version of package.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
bool: True if the version exists, False otherwise.
|
|
232
|
+
"""
|
|
233
|
+
|
|
234
|
+
branch_name = version if isinstance(version, str) else f"v{version}"
|
|
235
|
+
|
|
236
|
+
cached_answer = _GITHUB_VERSIONS_CACHE.get(branch_name, None)
|
|
237
|
+
if cached_answer and datetime.now() - cached_answer[1] < timedelta(hours=12):
|
|
238
|
+
return cached_answer[0]
|
|
239
|
+
|
|
240
|
+
repo_url = f"https://api.github.com/repos/oddshellnick/osn-selenium-cdp/branches/{branch_name}"
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
request = urllib.request.Request(url=repo_url, headers={"User-Agent": "osn-selenium"})
|
|
244
|
+
request.get_method = lambda: "HEAD"
|
|
245
|
+
|
|
246
|
+
with urllib.request.urlopen(url=request, timeout=5.0) as response:
|
|
247
|
+
existing = response.status == 200
|
|
248
|
+
_GITHUB_VERSIONS_CACHE[branch_name] = (existing, datetime.now())
|
|
249
|
+
|
|
250
|
+
return existing
|
|
251
|
+
except (Exception,):
|
|
252
|
+
_GITHUB_VERSIONS_CACHE[branch_name] = (False, datetime.now())
|
|
253
|
+
return False
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
import functools
|
|
3
|
+
from osn_selenium.exceptions.base import ExceptionThrown
|
|
4
|
+
from osn_selenium._exception_helpers import log_exception
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
Callable,
|
|
8
|
+
ParamSpec,
|
|
9
|
+
TypeVar
|
|
10
|
+
)
|
|
11
|
+
from osn_selenium.exceptions.instance import NotExpectedTypeError
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["log_on_error"]
|
|
15
|
+
|
|
16
|
+
_METHOD_INPUT = ParamSpec("_METHOD_INPUT")
|
|
17
|
+
_METHOD_OUTPUT = TypeVar("_METHOD_OUTPUT")
|
|
18
|
+
_METHOD = TypeVar("_METHOD", bound=Callable[..., Any])
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def log_on_error(func: _METHOD) -> _METHOD:
|
|
22
|
+
"""
|
|
23
|
+
Decorator that logs any `BaseException` raised by the decorated async function.
|
|
24
|
+
|
|
25
|
+
If an exception occurs, it is logged using `log_exception`, and an `ExceptionThrown`
|
|
26
|
+
object wrapping the exception is returned instead of re-raising it.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
func (_METHOD): The asynchronous function to be wrapped.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
_METHOD: The wrapped asynchronous function.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
@functools.wraps(func)
|
|
36
|
+
def sync_wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
37
|
+
try:
|
|
38
|
+
return func(*args, **kwargs)
|
|
39
|
+
except BaseException as exception:
|
|
40
|
+
log_exception(exception)
|
|
41
|
+
return ExceptionThrown(exception)
|
|
42
|
+
|
|
43
|
+
@functools.wraps(func)
|
|
44
|
+
async def async_wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
45
|
+
try:
|
|
46
|
+
return await func(*args, **kwargs)
|
|
47
|
+
except BaseException as exception:
|
|
48
|
+
log_exception(exception)
|
|
49
|
+
return ExceptionThrown(exception)
|
|
50
|
+
|
|
51
|
+
if inspect.iscoroutinefunction(func):
|
|
52
|
+
return async_wrapper
|
|
53
|
+
|
|
54
|
+
if inspect.isfunction(func):
|
|
55
|
+
return sync_wrapper
|
|
56
|
+
|
|
57
|
+
raise NotExpectedTypeError(expected_type=["coroutine function", "function"], received_instance=func)
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import trio
|
|
3
|
+
import contextvars
|
|
4
|
+
from contextlib import asynccontextmanager
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
AsyncContextManager,
|
|
8
|
+
AsyncIterator,
|
|
9
|
+
Callable,
|
|
10
|
+
ContextManager,
|
|
11
|
+
Coroutine,
|
|
12
|
+
ParamSpec,
|
|
13
|
+
Tuple,
|
|
14
|
+
TypeVar
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ["sync_to_trio", "sync_to_trio_context"]
|
|
19
|
+
|
|
20
|
+
_METHOD_INPUT = ParamSpec("_METHOD_INPUT")
|
|
21
|
+
_METHOD_OUTPUT = TypeVar("_METHOD_OUTPUT")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def sync_to_trio_context(
|
|
25
|
+
context_manager_factory: Callable[_METHOD_INPUT, ContextManager[_METHOD_OUTPUT]],
|
|
26
|
+
lock_object: trio.Lock,
|
|
27
|
+
capacity_limiter_object: trio.CapacityLimiter,
|
|
28
|
+
lock: bool,
|
|
29
|
+
exchange_context: bool,
|
|
30
|
+
) -> Callable[_METHOD_INPUT, AsyncContextManager[_METHOD_OUTPUT]]:
|
|
31
|
+
"""
|
|
32
|
+
Converts a synchronous context manager factory to an asynchronous Trio-compatible context manager.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
context_manager_factory (Callable[_METHOD_INPUT, ContextManager[_METHOD_OUTPUT]]): Factory function returning a context manager.
|
|
36
|
+
lock_object (trio.Lock): Trio lock for synchronization.
|
|
37
|
+
capacity_limiter_object (trio.CapacityLimiter): Trio capacity limiter.
|
|
38
|
+
lock (bool): Whether to use the internal lock for synchronization.
|
|
39
|
+
exchange_context (bool): Whether to synchronize context variables between threads.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Callable[_METHOD_INPUT, AsyncContextManager[_METHOD_OUTPUT]]: An async function returning an async context manager.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
@asynccontextmanager
|
|
46
|
+
async def wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> AsyncIterator[_METHOD_OUTPUT]:
|
|
47
|
+
"""
|
|
48
|
+
Internal async context manager wrapper.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
*args (_METHOD_INPUT.args): Positional arguments for the factory.
|
|
52
|
+
**kwargs (_METHOD_INPUT.kwargs): Keyword arguments for the factory.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
AsyncIterator[_METHOD_OUTPUT]: An async iterator yielding the context resource.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
sync_context_manager = await sync_to_trio(
|
|
59
|
+
sync_function=context_manager_factory,
|
|
60
|
+
lock_object=lock_object,
|
|
61
|
+
capacity_limiter_object=capacity_limiter_object,
|
|
62
|
+
lock=lock,
|
|
63
|
+
exchange_context=exchange_context,
|
|
64
|
+
)(*args, **kwargs)
|
|
65
|
+
|
|
66
|
+
enter_ = sync_to_trio(
|
|
67
|
+
sync_function=sync_context_manager.__enter__,
|
|
68
|
+
lock_object=lock_object,
|
|
69
|
+
capacity_limiter_object=capacity_limiter_object,
|
|
70
|
+
lock=lock,
|
|
71
|
+
exchange_context=exchange_context,
|
|
72
|
+
)
|
|
73
|
+
exit_ = sync_to_trio(
|
|
74
|
+
sync_function=sync_context_manager.__exit__,
|
|
75
|
+
lock_object=lock_object,
|
|
76
|
+
capacity_limiter_object=capacity_limiter_object,
|
|
77
|
+
lock=lock,
|
|
78
|
+
exchange_context=exchange_context,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
result = await enter_()
|
|
83
|
+
|
|
84
|
+
yield result
|
|
85
|
+
except Exception as e:
|
|
86
|
+
exc_type, exc_val, exc_tb = sys.exc_info()
|
|
87
|
+
|
|
88
|
+
if not await exit_(exc_type, exc_val, exc_tb):
|
|
89
|
+
raise e
|
|
90
|
+
else:
|
|
91
|
+
await exit_(None, None, None)
|
|
92
|
+
|
|
93
|
+
return wrapper
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def sync_to_trio(
|
|
97
|
+
sync_function: Callable[_METHOD_INPUT, _METHOD_OUTPUT],
|
|
98
|
+
lock_object: trio.Lock,
|
|
99
|
+
capacity_limiter_object: trio.CapacityLimiter,
|
|
100
|
+
lock: bool,
|
|
101
|
+
exchange_context: bool,
|
|
102
|
+
) -> Callable[_METHOD_INPUT, Coroutine[Any, Any, _METHOD_OUTPUT]]:
|
|
103
|
+
"""
|
|
104
|
+
Wraps a synchronous function to run within a Trio thread pool using a lock and limiter.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
sync_function (Callable[_METHOD_INPUT, _METHOD_OUTPUT]): The synchronous function to wrap.
|
|
108
|
+
lock_object (trio.Lock): Trio lock for synchronization.
|
|
109
|
+
capacity_limiter_object (trio.CapacityLimiter): Trio capacity limiter.
|
|
110
|
+
lock (bool): Whether to use the provided lock.
|
|
111
|
+
exchange_context (bool): Whether to synchronize context variables between threads.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Callable[_METHOD_INPUT, Coroutine[Any, Any, _METHOD_OUTPUT]]: An async wrapper for the sync function.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
async def wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
118
|
+
"""
|
|
119
|
+
Internal async wrapper for the synchronous function.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
*args (_METHOD_INPUT.args): Positional arguments for the sync function.
|
|
123
|
+
**kwargs (_METHOD_INPUT.kwargs): Keyword arguments for the sync function.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
_METHOD_OUTPUT: The result of the synchronous function execution.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
def function_with_kwargs(*args_) -> Tuple[_METHOD_OUTPUT, contextvars.Context]:
|
|
130
|
+
"""
|
|
131
|
+
Helper to pass keyword arguments to trio.to_thread.run_sync.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
*args_: Positional arguments passed from the outer scope.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Tuple[_METHOD_OUTPUT, contextvars.Context]: Result of original sync function and the thread context.
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
sync_result = sync_function(*args_, **kwargs)
|
|
141
|
+
context_vars = contextvars.copy_context()
|
|
142
|
+
|
|
143
|
+
return sync_result, context_vars
|
|
144
|
+
|
|
145
|
+
if lock:
|
|
146
|
+
async with lock_object:
|
|
147
|
+
result, child_context_vars = await trio.to_thread.run_sync(function_with_kwargs, *args, limiter=capacity_limiter_object)
|
|
148
|
+
else:
|
|
149
|
+
result, child_context_vars = await trio.to_thread.run_sync(function_with_kwargs, *args, limiter=capacity_limiter_object)
|
|
150
|
+
|
|
151
|
+
if exchange_context:
|
|
152
|
+
for var, value in child_context_vars.items():
|
|
153
|
+
var.set(value)
|
|
154
|
+
|
|
155
|
+
return result
|
|
156
|
+
|
|
157
|
+
return wrapper
|
osn_selenium/_typehints.py
CHANGED
|
@@ -14,6 +14,6 @@ __all__ = [
|
|
|
14
14
|
]
|
|
15
15
|
|
|
16
16
|
DEVICES_TYPEHINT = Union[PointerInput, KeyInput, WheelInput]
|
|
17
|
-
ARCHITECTURES_TYPEHINT = Literal["sync", "trio_threads"]
|
|
17
|
+
ARCHITECTURES_TYPEHINT = Literal["sync", "trio_threads", "trio_bidi"]
|
|
18
18
|
PATH_TYPEHINT = Union[str, bytes, pathlib.Path, os.PathLike]
|
|
19
19
|
TYPES_FOR_FLATTENING_TYPEHINT = Union[str, Type]
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
__all__ = ["AbstractCDPExecutor"]
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from osn_selenium_cdp_v140.executors.abstract import AbstractCDP140Executor
|
|
9
|
+
from osn_selenium_cdp_v141.executors.abstract import AbstractCDP141Executor
|
|
10
|
+
from osn_selenium_cdp_v142.executors.abstract import AbstractCDP142Executor
|
|
11
|
+
from osn_selenium_cdp_v143.executors.abstract import AbstractCDP143Executor
|
|
12
|
+
from osn_selenium_cdp_v144.executors.abstract import AbstractCDP144Executor
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AbstractCDPExecutor(ABC):
|
|
16
|
+
"""
|
|
17
|
+
Global abstract interface for accessing different versions of CDP.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def v140(self) -> "AbstractCDP140Executor":
|
|
23
|
+
"""
|
|
24
|
+
Access CDP version 140 interface.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
...
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def v141(self) -> "AbstractCDP141Executor":
|
|
32
|
+
"""
|
|
33
|
+
Access CDP version 141 interface.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
...
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def v142(self) -> "AbstractCDP142Executor":
|
|
41
|
+
"""
|
|
42
|
+
Access CDP version 142 interface.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
@abstractmethod
|
|
49
|
+
def v143(self) -> "AbstractCDP143Executor":
|
|
50
|
+
"""
|
|
51
|
+
Access CDP version 143 interface.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
@abstractmethod
|
|
58
|
+
def v144(self) -> "AbstractCDP144Executor":
|
|
59
|
+
"""
|
|
60
|
+
Access CDP version 144 interface.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
...
|
|
@@ -2,6 +2,7 @@ from abc import abstractmethod
|
|
|
2
2
|
from selenium import webdriver
|
|
3
3
|
from typing import Optional, Union
|
|
4
4
|
from osn_selenium._typehints import PATH_TYPEHINT
|
|
5
|
+
from osn_selenium.abstract.executors.cdp import AbstractCDPExecutor
|
|
5
6
|
from osn_selenium.abstract.webdriver.core.base import (
|
|
6
7
|
AbstractCoreBaseMixin
|
|
7
8
|
)
|
|
@@ -31,6 +32,19 @@ class AbstractBlinkBaseMixin(AbstractCoreBaseMixin):
|
|
|
31
32
|
|
|
32
33
|
...
|
|
33
34
|
|
|
35
|
+
@property
|
|
36
|
+
@abstractmethod
|
|
37
|
+
def cdp(self) -> AbstractCDPExecutor:
|
|
38
|
+
"""
|
|
39
|
+
Returns the CDP (Chrome DevTools Protocol) executor.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
AbstractCDPExecutor: The CDP executor instance used for sending
|
|
43
|
+
commands directly to the browser via the DevTools protocol.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
...
|
|
47
|
+
|
|
34
48
|
@property
|
|
35
49
|
@abstractmethod
|
|
36
50
|
def debugging_ip(self) -> Optional[str]:
|
|
@@ -19,14 +19,6 @@ class AbstractBlinkLifecycleMixin(AbstractCoreLifecycleMixin):
|
|
|
19
19
|
and the associated browser process.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
@abstractmethod
|
|
23
|
-
async def close_webdriver(self) -> None:
|
|
24
|
-
"""
|
|
25
|
-
Closes the WebDriver connection and terminates the browser process.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
...
|
|
29
|
-
|
|
30
22
|
@abstractmethod
|
|
31
23
|
async def restart_webdriver(
|
|
32
24
|
self,
|
|
@@ -74,3 +66,11 @@ class AbstractBlinkLifecycleMixin(AbstractCoreLifecycleMixin):
|
|
|
74
66
|
"""
|
|
75
67
|
|
|
76
68
|
...
|
|
69
|
+
|
|
70
|
+
@abstractmethod
|
|
71
|
+
async def stop_webdriver(self) -> None:
|
|
72
|
+
"""
|
|
73
|
+
Stops the WebDriver connection and terminates the browser process.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
...
|
|
@@ -11,7 +11,6 @@ from osn_selenium._typehints import (
|
|
|
11
11
|
ARCHITECTURES_TYPEHINT
|
|
12
12
|
)
|
|
13
13
|
from selenium.webdriver.remote.errorhandler import ErrorHandler
|
|
14
|
-
from osn_selenium.abstract.executors.cdp import AbstractCDPExecutor
|
|
15
14
|
from selenium.webdriver.remote.locator_converter import LocatorConverter
|
|
16
15
|
from selenium.webdriver.remote.remote_connection import RemoteConnection
|
|
17
16
|
from osn_selenium.abstract.executors.javascript import AbstractJSExecutor
|
|
@@ -90,19 +89,6 @@ class AbstractCoreBaseMixin(ABC):
|
|
|
90
89
|
|
|
91
90
|
...
|
|
92
91
|
|
|
93
|
-
@property
|
|
94
|
-
@abstractmethod
|
|
95
|
-
def cdp(self) -> AbstractCDPExecutor:
|
|
96
|
-
"""
|
|
97
|
-
Returns the CDP (Chrome DevTools Protocol) executor.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
AbstractCDPExecutor: The CDP executor instance used for sending
|
|
101
|
-
commands directly to the browser via the DevTools protocol.
|
|
102
|
-
"""
|
|
103
|
-
|
|
104
|
-
...
|
|
105
|
-
|
|
106
92
|
@property
|
|
107
93
|
@abstractmethod
|
|
108
94
|
def command_executor(self) -> RemoteConnection:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import Optional
|
|
2
2
|
from abc import ABC, abstractmethod
|
|
3
|
+
from selenium.webdriver.common.print_page_options import PrintOptions
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
__all__ = ["AbstractCoreCaptureMixin"]
|
|
@@ -56,12 +57,12 @@ class AbstractCoreCaptureMixin(ABC):
|
|
|
56
57
|
...
|
|
57
58
|
|
|
58
59
|
@abstractmethod
|
|
59
|
-
def print_page(self, print_options: Optional[
|
|
60
|
+
def print_page(self, print_options: Optional[PrintOptions] = None) -> str:
|
|
60
61
|
"""
|
|
61
62
|
Prints the current page to a PDF.
|
|
62
63
|
|
|
63
64
|
Args:
|
|
64
|
-
print_options (Optional[
|
|
65
|
+
print_options (Optional[PrintOptions]): Options for printing the page.
|
|
65
66
|
|
|
66
67
|
Returns:
|
|
67
68
|
str: A base64-encoded string of the PDF.
|