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
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import trio
|
|
2
|
+
from osn_selenium.javascript.models import JS_Scripts
|
|
3
|
+
from osn_selenium.trio_bidi.mixin import TrioBiDiMixin
|
|
4
|
+
from typing import (
|
|
5
|
+
Any,
|
|
6
|
+
Callable,
|
|
7
|
+
Dict,
|
|
8
|
+
Optional,
|
|
9
|
+
Union
|
|
10
|
+
)
|
|
11
|
+
from osn_selenium.javascript.fingerprint import FingerprintSettings
|
|
12
|
+
from osn_selenium.instances.trio_threads.web_element import WebElement
|
|
13
|
+
from osn_selenium.executors.unified.javascript import UnifiedJSExecutor
|
|
14
|
+
from osn_selenium.models import (
|
|
15
|
+
Point,
|
|
16
|
+
Position,
|
|
17
|
+
Rectangle,
|
|
18
|
+
Size
|
|
19
|
+
)
|
|
20
|
+
from osn_selenium.abstract.executors.javascript import AbstractJSExecutor
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
__all__ = ["JSExecutor"]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class JSExecutor(UnifiedJSExecutor, TrioBiDiMixin, AbstractJSExecutor):
|
|
27
|
+
"""
|
|
28
|
+
An asynchronous JavaScript executor that integrates Trio's BiDi mixin.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
execute_function: Callable[[str, Any], Any],
|
|
34
|
+
lock: trio.Lock,
|
|
35
|
+
limiter: trio.CapacityLimiter,
|
|
36
|
+
trio_token: Optional[trio.lowlevel.TrioToken],
|
|
37
|
+
bidi_buffer_size: Union[int, float],
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Initialize the JSExecutor with Trio synchronization primitives and execution logic.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
execute_function (Callable[[str, Any], Any]): The function used to run JavaScript code.
|
|
44
|
+
lock (trio.Lock): Trio lock for synchronizing access.
|
|
45
|
+
limiter (trio.CapacityLimiter): Trio limiter for controlling concurrency.
|
|
46
|
+
trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
|
|
47
|
+
bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
UnifiedJSExecutor.__init__(self, execute_function=execute_function)
|
|
51
|
+
|
|
52
|
+
TrioBiDiMixin.__init__(
|
|
53
|
+
self,
|
|
54
|
+
lock=lock,
|
|
55
|
+
limiter=limiter,
|
|
56
|
+
token=trio_token,
|
|
57
|
+
buffer_size=bidi_buffer_size
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
async def check_element_in_viewport(self, element: WebElement) -> bool:
|
|
61
|
+
return await self.sync_to_trio(sync_function=self._check_element_in_viewport_impl)(element=element)
|
|
62
|
+
|
|
63
|
+
async def execute(self, script: str, *args: Any) -> Any:
|
|
64
|
+
return await self.sync_to_trio(sync_function=self._execute_impl)(script, *args)
|
|
65
|
+
|
|
66
|
+
async def get_document_scroll_size(self) -> Size:
|
|
67
|
+
return await self.sync_to_trio(sync_function=self._get_document_scroll_size_impl)()
|
|
68
|
+
|
|
69
|
+
async def get_element_css_style(self, element: WebElement) -> Dict[str, str]:
|
|
70
|
+
return await self.sync_to_trio(sync_function=self._get_element_css_style_impl)(element=element)
|
|
71
|
+
|
|
72
|
+
async def get_element_rect_in_viewport(self, element: WebElement) -> Optional[Rectangle]:
|
|
73
|
+
return await self.sync_to_trio(sync_function=self._get_element_rect_in_viewport_impl)(element=element)
|
|
74
|
+
|
|
75
|
+
async def get_random_element_point(self, element: WebElement) -> Optional[Point]:
|
|
76
|
+
return await self.sync_to_trio(sync_function=self._get_random_element_point_impl)(element=element)
|
|
77
|
+
|
|
78
|
+
async def get_random_element_point_in_viewport(self, element: WebElement, step: int = 1) -> Optional[Position]:
|
|
79
|
+
return await self.sync_to_trio(sync_function=self._get_random_element_point_in_viewport_impl)(element=element, step=step)
|
|
80
|
+
|
|
81
|
+
async def get_viewport_position(self) -> Position:
|
|
82
|
+
return await self.sync_to_trio(sync_function=self._get_viewport_position_impl)()
|
|
83
|
+
|
|
84
|
+
async def get_viewport_rect(self) -> Rectangle:
|
|
85
|
+
return await self.sync_to_trio(sync_function=self._get_viewport_rect_impl)()
|
|
86
|
+
|
|
87
|
+
async def get_viewport_size(self) -> Size:
|
|
88
|
+
return await self.sync_to_trio(sync_function=self._get_viewport_size_impl)()
|
|
89
|
+
|
|
90
|
+
async def open_new_tab(self, link: str = "") -> None:
|
|
91
|
+
await self.sync_to_trio(sync_function=self._open_new_tab_impl)(link=link)
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def scripts(self) -> JS_Scripts:
|
|
95
|
+
return self._scripts_impl
|
|
96
|
+
|
|
97
|
+
async def start_fingerprint_detection(self, fingerprint_settings: FingerprintSettings) -> None:
|
|
98
|
+
await self.sync_to_trio(sync_function=self._start_fingerprint_detection_impl)(fingerprint_settings=fingerprint_settings)
|
|
99
|
+
|
|
100
|
+
async def stop_window_loading(self) -> None:
|
|
101
|
+
await self.sync_to_trio(sync_function=self._stop_window_loading_impl)()
|
|
@@ -27,11 +27,6 @@ class CDPExecutor(AbstractCDPExecutor):
|
|
|
27
27
|
self._execute_function = execute_function
|
|
28
28
|
self._lock = lock
|
|
29
29
|
self._limiter = limiter
|
|
30
|
-
self._v140 = None
|
|
31
|
-
self._v141 = None
|
|
32
|
-
self._v142 = None
|
|
33
|
-
self._v143 = None
|
|
34
|
-
self._v144 = None
|
|
35
30
|
|
|
36
31
|
def get(self, version: int) -> Any:
|
|
37
32
|
"""
|
osn_selenium/flags/base.py
CHANGED
|
@@ -151,7 +151,7 @@ class BrowserFlagsManager:
|
|
|
151
151
|
def clear_attributes(self):
|
|
152
152
|
"""Clears all configured browser attributes."""
|
|
153
153
|
|
|
154
|
-
self._attributes
|
|
154
|
+
self._attributes.clear()
|
|
155
155
|
|
|
156
156
|
def remove_attribute(self, attribute_name: str):
|
|
157
157
|
"""
|
|
@@ -236,7 +236,7 @@ class BrowserFlagsManager:
|
|
|
236
236
|
def clear_experimental_options(self):
|
|
237
237
|
"""Clears all configured experimental options."""
|
|
238
238
|
|
|
239
|
-
self._experimental_options
|
|
239
|
+
self._experimental_options.clear()
|
|
240
240
|
|
|
241
241
|
def remove_experimental_option(self, experimental_option_name: str):
|
|
242
242
|
"""
|
|
@@ -338,7 +338,7 @@ class BrowserFlagsManager:
|
|
|
338
338
|
def clear_arguments(self):
|
|
339
339
|
"""Clears all configured browser arguments."""
|
|
340
340
|
|
|
341
|
-
self._arguments
|
|
341
|
+
self._arguments.clear()
|
|
342
342
|
|
|
343
343
|
def remove_argument(self, argument_name: str):
|
|
344
344
|
"""
|
|
@@ -463,7 +463,9 @@ class BrowserFlagsManager:
|
|
|
463
463
|
|
|
464
464
|
for type_name, type_functions in self._flags_types.items():
|
|
465
465
|
options = type_functions.build_options_function(options)
|
|
466
|
-
|
|
466
|
+
|
|
467
|
+
options.set_capability("webSocketUrl", True)
|
|
468
|
+
|
|
467
469
|
return options
|
|
468
470
|
|
|
469
471
|
def remove_option(self, option: FlagDefinition):
|
osn_selenium/flags/blink.py
CHANGED
|
@@ -770,8 +770,8 @@ class BlinkFlagsManager(BrowserFlagsManager):
|
|
|
770
770
|
def clear_blink_features(self):
|
|
771
771
|
"""Clears all configured Blink features."""
|
|
772
772
|
|
|
773
|
-
self._enable_blink_features
|
|
774
|
-
self._disable_blink_features
|
|
773
|
+
self._enable_blink_features.clear()
|
|
774
|
+
self._disable_blink_features.clear()
|
|
775
775
|
|
|
776
776
|
def remove_blink_feature(self, blink_feature_name: str):
|
|
777
777
|
"""
|
osn_selenium/flags/chrome.py
CHANGED
|
@@ -42,21 +42,21 @@ class ChromeFlagsManager(BlinkFlagsManager):
|
|
|
42
42
|
debugging port, user agent, proxy, and BiDi protocol.
|
|
43
43
|
"""
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
chrome_flags_types = {}
|
|
46
46
|
|
|
47
47
|
if flags_types is not None:
|
|
48
|
-
|
|
48
|
+
chrome_flags_types.update(flags_types)
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
chrome_flags_definitions = {}
|
|
51
51
|
|
|
52
52
|
if flags_definitions is not None:
|
|
53
|
-
|
|
53
|
+
chrome_flags_definitions.update(flags_definitions)
|
|
54
54
|
|
|
55
55
|
super().__init__(
|
|
56
56
|
browser_exe=browser_exe,
|
|
57
57
|
start_page_url=start_page_url,
|
|
58
|
-
flags_types=
|
|
59
|
-
flags_definitions=
|
|
58
|
+
flags_types=chrome_flags_types,
|
|
59
|
+
flags_definitions=chrome_flags_definitions,
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
def _build_options_arguments(self, options: Options) -> Options:
|
osn_selenium/flags/edge.py
CHANGED
|
@@ -42,21 +42,21 @@ class EdgeFlagsManager(BlinkFlagsManager):
|
|
|
42
42
|
debugging port, user agent, proxy, and BiDi protocol.
|
|
43
43
|
"""
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
edge_flags_types = {}
|
|
46
46
|
|
|
47
47
|
if flags_types is not None:
|
|
48
|
-
|
|
48
|
+
edge_flags_types.update(flags_types)
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
edge_flags_definitions = {}
|
|
51
51
|
|
|
52
52
|
if flags_definitions is not None:
|
|
53
|
-
|
|
53
|
+
edge_flags_definitions.update(flags_definitions)
|
|
54
54
|
|
|
55
55
|
super().__init__(
|
|
56
56
|
browser_exe=browser_exe,
|
|
57
57
|
start_page_url=start_page_url,
|
|
58
|
-
flags_types=
|
|
59
|
-
flags_definitions=
|
|
58
|
+
flags_types=edge_flags_types,
|
|
59
|
+
flags_definitions=edge_flags_definitions,
|
|
60
60
|
)
|
|
61
61
|
|
|
62
62
|
def _build_options_arguments(self, options: Options) -> Options:
|
|
@@ -52,13 +52,14 @@ from selenium.webdriver.common.bidi.permissions import (
|
|
|
52
52
|
from selenium.webdriver.common.bidi.webextension import (
|
|
53
53
|
WebExtension as legacyWebExtension
|
|
54
54
|
)
|
|
55
|
+
from selenium.webdriver.common.bidi.browsing_context import (
|
|
56
|
+
BrowsingContext as legacyBrowsingContext
|
|
57
|
+
)
|
|
55
58
|
from osn_selenium.instances.protocols import (
|
|
56
59
|
SyncInstanceWrapper,
|
|
60
|
+
TrioBiDiInstanceWrapper,
|
|
57
61
|
TrioThreadInstanceWrapper
|
|
58
62
|
)
|
|
59
|
-
from selenium.webdriver.common.bidi.browsing_context import (
|
|
60
|
-
BrowsingContext as legacyBrowsingContext
|
|
61
|
-
)
|
|
62
63
|
from osn_selenium.instances._typehints import (
|
|
63
64
|
ACTION_CHAINS_TYPEHINT,
|
|
64
65
|
ALERT_TYPEHINT,
|
|
@@ -85,11 +86,13 @@ __all__ = [
|
|
|
85
86
|
"get_legacy_frame_reference",
|
|
86
87
|
"get_legacy_instance",
|
|
87
88
|
"get_sync_instance_wrapper",
|
|
89
|
+
"get_trio_bidi_instance_wrapper",
|
|
88
90
|
"get_trio_thread_instance_wrapper"
|
|
89
91
|
]
|
|
90
92
|
|
|
91
93
|
_SYNC_WRAPPER_TYPE = TypeVar("_SYNC_WRAPPER_TYPE", bound=SyncInstanceWrapper)
|
|
92
94
|
_TRIO_THREAD_WRAPPER_TYPE = TypeVar("_TRIO_THREAD_WRAPPER_TYPE", bound=TrioThreadInstanceWrapper)
|
|
95
|
+
_TRIO_BIDI_WRAPPER_TYPE = TypeVar("_TRIO_BIDI_WRAPPER_TYPE", bound=TrioBiDiInstanceWrapper)
|
|
93
96
|
|
|
94
97
|
|
|
95
98
|
@overload
|
|
@@ -243,6 +246,44 @@ def get_trio_thread_instance_wrapper(
|
|
|
243
246
|
return wrapper_class.from_legacy(legacy_object=legacy_object, lock=lock, limiter=limiter)
|
|
244
247
|
|
|
245
248
|
|
|
249
|
+
def get_trio_bidi_instance_wrapper(
|
|
250
|
+
wrapper_class: Type[_TRIO_BIDI_WRAPPER_TYPE],
|
|
251
|
+
legacy_object: Any,
|
|
252
|
+
lock: trio.Lock,
|
|
253
|
+
limiter: trio.CapacityLimiter,
|
|
254
|
+
trio_token: Optional[trio.lowlevel.TrioToken],
|
|
255
|
+
bidi_buffer_size: Union[int, float],
|
|
256
|
+
) -> _TRIO_BIDI_WRAPPER_TYPE:
|
|
257
|
+
"""
|
|
258
|
+
Creates a Trio-compatible BiDi instance wrapper for a legacy Selenium object.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
wrapper_class (Type[_TRIO_BIDI_WRAPPER_TYPE]): The class used to wrap the legacy object.
|
|
262
|
+
legacy_object (Any): The legacy Selenium object to be wrapped.
|
|
263
|
+
lock (trio.Lock): The lock for Trio synchronization.
|
|
264
|
+
limiter (trio.CapacityLimiter): The capacity limiter for Trio.
|
|
265
|
+
trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
|
|
266
|
+
bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
_TRIO_BIDI_WRAPPER_TYPE: An instance of the wrapper class.
|
|
270
|
+
|
|
271
|
+
Raises:
|
|
272
|
+
TypeIsNotWrapper: If the provided wrapper_class does not implement TrioBiDiInstanceWrapper.
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
if not isinstance(wrapper_class, TrioBiDiInstanceWrapper):
|
|
276
|
+
raise ProtocolComplianceError(instance=wrapper_class, expected_protocols=TrioBiDiInstanceWrapper)
|
|
277
|
+
|
|
278
|
+
return wrapper_class.from_legacy(
|
|
279
|
+
legacy_object=legacy_object,
|
|
280
|
+
lock=lock,
|
|
281
|
+
limiter=limiter,
|
|
282
|
+
trio_token=trio_token,
|
|
283
|
+
bidi_buffer_size=bidi_buffer_size
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
|
|
246
287
|
def get_sync_instance_wrapper(wrapper_class: Type[_SYNC_WRAPPER_TYPE], legacy_object: Any) -> _SYNC_WRAPPER_TYPE:
|
|
247
288
|
"""
|
|
248
289
|
Creates a synchronous instance wrapper for a legacy Selenium object.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import trio
|
|
2
2
|
from typing import (
|
|
3
|
+
Optional,
|
|
3
4
|
Protocol,
|
|
4
5
|
Self,
|
|
5
6
|
TypeVar,
|
|
7
|
+
Union,
|
|
6
8
|
runtime_checkable
|
|
7
9
|
)
|
|
8
10
|
|
|
@@ -10,6 +12,7 @@ from typing import (
|
|
|
10
12
|
__all__ = [
|
|
11
13
|
"AnyInstanceWrapper",
|
|
12
14
|
"SyncInstanceWrapper",
|
|
15
|
+
"TrioBiDiInstanceWrapper",
|
|
13
16
|
"TrioThreadInstanceWrapper"
|
|
14
17
|
]
|
|
15
18
|
|
|
@@ -27,7 +30,7 @@ class TrioThreadInstanceWrapper(Protocol):
|
|
|
27
30
|
cls,
|
|
28
31
|
legacy_object: _LEGACY_OBJECT,
|
|
29
32
|
lock: trio.Lock,
|
|
30
|
-
limiter: trio.CapacityLimiter
|
|
33
|
+
limiter: trio.CapacityLimiter,
|
|
31
34
|
) -> Self:
|
|
32
35
|
"""
|
|
33
36
|
Creates an instance of the wrapper from a legacy object.
|
|
@@ -55,6 +58,49 @@ class TrioThreadInstanceWrapper(Protocol):
|
|
|
55
58
|
...
|
|
56
59
|
|
|
57
60
|
|
|
61
|
+
@runtime_checkable
|
|
62
|
+
class TrioBiDiInstanceWrapper(Protocol):
|
|
63
|
+
"""
|
|
64
|
+
Protocol for instances that wrap legacy objects and operate within Trio threads.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_legacy(
|
|
69
|
+
cls,
|
|
70
|
+
legacy_object: _LEGACY_OBJECT,
|
|
71
|
+
lock: trio.Lock,
|
|
72
|
+
limiter: trio.CapacityLimiter,
|
|
73
|
+
trio_token: Optional[trio.lowlevel.TrioToken],
|
|
74
|
+
bidi_buffer_size: Union[int, float],
|
|
75
|
+
) -> Self:
|
|
76
|
+
"""
|
|
77
|
+
Creates an instance of the wrapper from a legacy object.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
legacy_object (_LEGACY_OBJECT): The legacy Selenium object to wrap.
|
|
81
|
+
lock (trio.Lock): Trio lock for synchronization.
|
|
82
|
+
limiter (trio.CapacityLimiter): Trio capacity limiter.
|
|
83
|
+
trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
|
|
84
|
+
bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Self: An instance of the wrapper.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
...
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def legacy(self) -> _LEGACY_OBJECT:
|
|
94
|
+
"""
|
|
95
|
+
Returns the underlying legacy Selenium object.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
_LEGACY_OBJECT: The legacy Selenium instance.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
...
|
|
102
|
+
|
|
103
|
+
|
|
58
104
|
@runtime_checkable
|
|
59
105
|
class SyncInstanceWrapper(Protocol):
|
|
60
106
|
"""
|
|
@@ -47,8 +47,8 @@ class BrowsingContext(UnifiedBrowsingContext, AbstractBrowsingContext):
|
|
|
47
47
|
|
|
48
48
|
UnifiedBrowsingContext.__init__(self, selenium_browsing_context=selenium_browsing_context)
|
|
49
49
|
|
|
50
|
-
def activate(self, context: str) ->
|
|
51
|
-
|
|
50
|
+
def activate(self, context: str) -> None:
|
|
51
|
+
self._activate_impl(context=context)
|
|
52
52
|
|
|
53
53
|
def add_event_handler(
|
|
54
54
|
self,
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import (
|
|
2
|
+
Any,
|
|
3
|
+
Callable,
|
|
4
|
+
Dict,
|
|
5
|
+
Self
|
|
6
|
+
)
|
|
2
7
|
from osn_selenium.instances._typehints import SCRIPT_TYPEHINT
|
|
3
8
|
from osn_selenium.instances.convert import get_legacy_instance
|
|
4
9
|
from osn_selenium.instances.unified.script import UnifiedScript
|
|
@@ -38,7 +43,7 @@ class Script(UnifiedScript, AbstractScript):
|
|
|
38
43
|
def add_javascript_error_handler(self, handler: Callable[[Any], None]) -> int:
|
|
39
44
|
return self._add_javascript_error_handler_impl(handler=handler)
|
|
40
45
|
|
|
41
|
-
def execute(self, script: str, *args: Any) -> Any:
|
|
46
|
+
def execute(self, script: str, *args: Any) -> Dict[str, Any]:
|
|
42
47
|
return self._execute_impl(script, *args)
|
|
43
48
|
|
|
44
49
|
@classmethod
|
|
@@ -126,7 +126,7 @@ class WebElement(UnifiedWebElement, AbstractWebElement):
|
|
|
126
126
|
|
|
127
127
|
return self.from_legacy(legacy_object=web_element)
|
|
128
128
|
|
|
129
|
-
def rect(self) -> Dict:
|
|
129
|
+
def rect(self) -> Dict[str, int]:
|
|
130
130
|
return self._rect_impl()
|
|
131
131
|
|
|
132
132
|
def screenshot(self, filename: str) -> bool:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import math
|
|
2
|
+
import trio
|
|
3
|
+
from selenium.webdriver.common.by import By
|
|
4
|
+
from osn_selenium.trio_bidi.mixin import TrioBiDiMixin
|
|
5
|
+
from osn_selenium.instances._typehints import SHADOW_ROOT_TYPEHINT
|
|
6
|
+
from osn_selenium.exceptions.instance import (
|
|
7
|
+
CannotConvertTypeError
|
|
8
|
+
)
|
|
9
|
+
from osn_selenium.instances.unified.shadow_root import UnifiedShadowRoot
|
|
10
|
+
from osn_selenium.abstract.instances.shadow_root import AbstractShadowRoot
|
|
11
|
+
from typing import (
|
|
12
|
+
List,
|
|
13
|
+
Optional,
|
|
14
|
+
Self,
|
|
15
|
+
TYPE_CHECKING,
|
|
16
|
+
Type,
|
|
17
|
+
Union
|
|
18
|
+
)
|
|
19
|
+
from selenium.webdriver.remote.shadowroot import (
|
|
20
|
+
ShadowRoot as legacyShadowRoot
|
|
21
|
+
)
|
|
22
|
+
from selenium.webdriver.remote.webelement import (
|
|
23
|
+
WebElement as legacyWebElement
|
|
24
|
+
)
|
|
25
|
+
from osn_selenium.instances.convert import (
|
|
26
|
+
get_legacy_instance,
|
|
27
|
+
get_trio_bidi_instance_wrapper
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
__all__ = ["ShadowRoot"]
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from osn_selenium.instances.trio_bidi.web_element import WebElement
|
|
35
|
+
|
|
36
|
+
_WEB_ELEMENT_TYPE: Optional[Type["WebElement"]] = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _build_web_element(
|
|
40
|
+
legacy_element: legacyWebElement,
|
|
41
|
+
lock: trio.Lock,
|
|
42
|
+
limiter: trio.CapacityLimiter,
|
|
43
|
+
trio_token: Optional[trio.lowlevel.TrioToken] = None,
|
|
44
|
+
bidi_buffer_size: Union[int, float] = math.inf,
|
|
45
|
+
):
|
|
46
|
+
"""
|
|
47
|
+
Builds a wrapped WebElement from a legacy element.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
legacy_element (legacyWebElement): The legacy Selenium WebElement instance.
|
|
51
|
+
lock (trio.Lock): A Trio lock for managing concurrent access.
|
|
52
|
+
limiter (trio.CapacityLimiter): A Trio capacity limiter for rate limiting.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
WebElement: The wrapped WebElement instance.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
global _WEB_ELEMENT_TYPE
|
|
59
|
+
|
|
60
|
+
if _WEB_ELEMENT_TYPE is None:
|
|
61
|
+
from osn_selenium.instances.trio_bidi.web_element import WebElement
|
|
62
|
+
_WEB_ELEMENT_TYPE = WebElement
|
|
63
|
+
|
|
64
|
+
return get_trio_bidi_instance_wrapper(
|
|
65
|
+
wrapper_class=_WEB_ELEMENT_TYPE,
|
|
66
|
+
legacy_object=legacy_element,
|
|
67
|
+
lock=lock,
|
|
68
|
+
limiter=limiter,
|
|
69
|
+
trio_token=trio_token,
|
|
70
|
+
bidi_buffer_size=bidi_buffer_size,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ShadowRoot(UnifiedShadowRoot, TrioBiDiMixin, AbstractShadowRoot):
|
|
75
|
+
"""
|
|
76
|
+
Wrapper for the legacy Selenium ShadowRoot instance.
|
|
77
|
+
|
|
78
|
+
Represents the root of a Shadow DOM tree, allowing element search
|
|
79
|
+
within the encapsulated shadow scope.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
def __init__(
|
|
83
|
+
self,
|
|
84
|
+
selenium_shadow_root: legacyShadowRoot,
|
|
85
|
+
lock: trio.Lock,
|
|
86
|
+
limiter: trio.CapacityLimiter,
|
|
87
|
+
trio_token: Optional[trio.lowlevel.TrioToken] = None,
|
|
88
|
+
bidi_buffer_size: Union[int, float] = math.inf,
|
|
89
|
+
) -> None:
|
|
90
|
+
"""
|
|
91
|
+
Initializes the ShadowRoot wrapper.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
selenium_shadow_root (legacyShadowRoot): The legacy Selenium ShadowRoot instance to wrap.
|
|
95
|
+
lock (trio.Lock): A Trio lock for managing concurrent access.
|
|
96
|
+
limiter (trio.CapacityLimiter): A Trio capacity limiter for rate limiting.
|
|
97
|
+
trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
|
|
98
|
+
bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
UnifiedShadowRoot.__init__(self, selenium_shadow_root=selenium_shadow_root)
|
|
102
|
+
|
|
103
|
+
TrioBiDiMixin.__init__(
|
|
104
|
+
self,
|
|
105
|
+
lock=lock,
|
|
106
|
+
limiter=limiter,
|
|
107
|
+
token=trio_token,
|
|
108
|
+
buffer_size=bidi_buffer_size
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
async def find_element(self, by: str = By.ID, value: Optional[str] = None) -> "WebElement":
|
|
112
|
+
legacy_element = await self.sync_to_trio(sync_function=self._find_element_impl)(by=by, value=value)
|
|
113
|
+
|
|
114
|
+
return _build_web_element(
|
|
115
|
+
legacy_element=legacy_element,
|
|
116
|
+
lock=self._lock,
|
|
117
|
+
limiter=self._capacity_limiter,
|
|
118
|
+
trio_token=self._trio_token,
|
|
119
|
+
bidi_buffer_size=self._trio_bidi_buffer_size,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
async def find_elements(self, by: str = By.ID, value: Optional[str] = None) -> List["WebElement"]:
|
|
123
|
+
legacy_elements = await self.sync_to_trio(sync_function=self._find_elements_impl)(by=by, value=value)
|
|
124
|
+
|
|
125
|
+
return [
|
|
126
|
+
_build_web_element(
|
|
127
|
+
legacy_element=legacy_element,
|
|
128
|
+
lock=self._lock,
|
|
129
|
+
limiter=self._capacity_limiter,
|
|
130
|
+
trio_token=self._trio_token,
|
|
131
|
+
bidi_buffer_size=self._trio_bidi_buffer_size,
|
|
132
|
+
)
|
|
133
|
+
for legacy_element in legacy_elements
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
@classmethod
|
|
137
|
+
def from_legacy(
|
|
138
|
+
cls,
|
|
139
|
+
legacy_object: SHADOW_ROOT_TYPEHINT,
|
|
140
|
+
lock: trio.Lock,
|
|
141
|
+
limiter: trio.CapacityLimiter,
|
|
142
|
+
trio_token: Optional[trio.lowlevel.TrioToken] = None,
|
|
143
|
+
bidi_buffer_size: Union[int, float] = math.inf,
|
|
144
|
+
) -> Self:
|
|
145
|
+
"""
|
|
146
|
+
Creates an instance from a legacy Selenium ShadowRoot object.
|
|
147
|
+
|
|
148
|
+
This factory method is used to wrap an existing Selenium ShadowRoot
|
|
149
|
+
instance into the new interface.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
legacy_object (SHADOW_ROOT_TYPEHINT): The legacy Selenium ShadowRoot instance or its wrapper.
|
|
153
|
+
lock (trio.Lock): A Trio lock for managing concurrent access.
|
|
154
|
+
limiter (trio.CapacityLimiter): A Trio capacity limiter for rate limiting.
|
|
155
|
+
trio_token (Optional[trio.lowlevel.TrioToken]): The Trio token for the current event loop.
|
|
156
|
+
bidi_buffer_size (Union[int, float]): Buffer size for the BiDi task channel.
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
Self: A new instance of a class implementing ShadowRoot.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
legacy_shadow_root_obj = get_legacy_instance(instance=legacy_object)
|
|
163
|
+
|
|
164
|
+
if not isinstance(legacy_shadow_root_obj, legacyShadowRoot):
|
|
165
|
+
raise CannotConvertTypeError(from_=legacyShadowRoot, to_=legacy_object)
|
|
166
|
+
|
|
167
|
+
return cls(
|
|
168
|
+
selenium_shadow_root=legacy_shadow_root_obj,
|
|
169
|
+
lock=lock,
|
|
170
|
+
limiter=limiter,
|
|
171
|
+
trio_token=trio_token,
|
|
172
|
+
bidi_buffer_size=bidi_buffer_size,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
async def id(self) -> str:
|
|
176
|
+
return await self.sync_to_trio(sync_function=self._id_impl)()
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def legacy(self) -> legacyShadowRoot:
|
|
180
|
+
return self._legacy_impl
|