osn-selenium 1.0.0__tar.gz → 1.2.0__tar.gz
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-1.0.0 → osn_selenium-1.2.0}/PKG-INFO +24 -10
- osn_selenium-1.0.0/osn_selenium.egg-info/PKG-INFO → osn_selenium-1.2.0/README.md +19 -21
- osn_selenium-1.2.0/osn_selenium/_base_models.py +41 -0
- osn_selenium-1.2.0/osn_selenium/_cdp_import.py +253 -0
- osn_selenium-1.2.0/osn_selenium/_decorators.py +57 -0
- osn_selenium-1.2.0/osn_selenium/_trio_threads_helpers.py +157 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/_typehints.py +1 -1
- osn_selenium-1.2.0/osn_selenium/abstract/executors/cdp.py +63 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/base.py +14 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/lifecycle.py +8 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/base.py +0 -14
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/capture.py +4 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/lifecycle.py +8 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/script.py +5 -4
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/window.py +11 -11
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/browsers_handler/models.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/_decorators.py +19 -51
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/_functions.py +2 -4
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/_typehints.py +5 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/_wrappers.py +0 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/domains/__init__.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/domains/abstract.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/domains/fetch.py +6 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/domains_default/fetch.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/filters.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/logger/main.py +9 -21
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/logger/models.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/logger/target.py +49 -29
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/manager/base.py +10 -42
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/manager/lifecycle.py +84 -75
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/manager/logging.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/manager/targets.py +13 -5
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/models.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/settings.py +9 -5
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/base.py +30 -34
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/discovery.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/events.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/fingerprint.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/lifecycle.py +103 -38
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/logging.py +11 -3
- osn_selenium-1.2.0/osn_selenium/exceptions/__init__.py +0 -0
- osn_selenium-1.2.0/osn_selenium/exceptions/base.py +36 -0
- osn_selenium-1.2.0/osn_selenium/exceptions/bidi_bridge.py +59 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/configuration.py +1 -8
- osn_selenium-1.2.0/osn_selenium/exceptions/dependencies.py +60 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/devtools.py +9 -39
- osn_selenium-1.2.0/osn_selenium/exceptions/experimental.py +26 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/flags.py +0 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/instance.py +1 -9
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/javascript.py +0 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/logic.py +0 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/path.py +1 -9
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/platform.py +0 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/protocol.py +0 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/webdriver.py +1 -7
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/exceptions/window.py +1 -8
- osn_selenium-1.2.0/osn_selenium/executors/sync/cdp.py +95 -0
- osn_selenium-1.2.0/osn_selenium/executors/trio_bidi/cdp.py +101 -0
- osn_selenium-1.2.0/osn_selenium/executors/trio_bidi/javascript.py +101 -0
- osn_selenium-1.2.0/osn_selenium/executors/trio_threads/cdp.py +99 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/executors/trio_threads/javascript.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/executors/unified/javascript.py +0 -4
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/base.py +7 -13
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/blink.py +2 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/chrome.py +6 -6
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/edge.py +6 -6
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/models/base.py +4 -4
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/models/blink.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/models/values.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/convert.py +44 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/protocols.py +47 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/__init__.py +6 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/browsing_context.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/script.py +7 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/shadow_root.py +30 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/web_element.py +1 -1
- osn_selenium-1.2.0/osn_selenium/instances/trio_bidi/shadow_root.py +180 -0
- osn_selenium-1.2.0/osn_selenium/instances/trio_bidi/switch_to.py +143 -0
- osn_selenium-1.2.0/osn_selenium/instances/trio_bidi/web_driver_wait.py +124 -0
- osn_selenium-1.2.0/osn_selenium/instances/trio_bidi/web_element.py +239 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/__init__.py +6 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/base.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/alert.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/browser.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/browsing_context.py +3 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/dialog.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/fedcm.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/mobile.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/network.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/permissions.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/script.py +8 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/shadow_root.py +46 -15
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/storage.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/switch_to.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/web_driver_wait.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/web_element.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/web_extension.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/browsing_context.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/script.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/web_element.py +3 -5
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/__init__.py +3 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/registry/models.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/core_rules.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/noise.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/models.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/models.py +2 -47
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_context_vars.py +12 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_error_mappings.py +123 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_error_redirects.py +194 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_file_functions.py +28 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_internal_mappings.py +10 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_models.py +199 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/_typehints.py +20 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/connection_pool.py +587 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/_constants.py +14 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/_js_snippets.py +285 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/_utils.py +4 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/__init__.py +87 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_alert.py +102 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_args_helpers.py +225 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_capture.py +71 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_cdp.py +40 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_element.py +55 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_file.py +32 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_navigation.py +147 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_script.py +85 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_shadow_root.py +65 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_switch_to.py +59 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_web_element.py +448 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/request_functions/_window.py +125 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/__init__.py +86 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_alert.py +81 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_args_helpers.py +183 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_args_validators.py +153 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_capture.py +71 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_cdp.py +26 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_element.py +58 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_file.py +30 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_navigation.py +120 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_script.py +57 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_shadow_root.py +58 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_switch_to.py +57 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_web_element.py +368 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping/response_functions/_window.py +119 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/mixin.py +186 -0
- osn_selenium-1.2.0/osn_selenium/trio_bidi/remote_connection.py +164 -0
- osn_selenium-1.0.0/osn_selenium/base_mixin.py → osn_selenium-1.2.0/osn_selenium/trio_threads_mixin.py +31 -40
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/_args_helpers.py +120 -7
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/_bridges.py +2 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/_executable_tables/models.py +1 -1
- osn_selenium-1.2.0/osn_selenium/webdrivers/_typehints.py +16 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/protocols.py +130 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/__init__.py +11 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/base.py +23 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/lifecycle.py +26 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/chrome/__init__.py +36 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/chrome/base.py +13 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/chrome/lifecycle.py +23 -5
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/chrome/settings.py +6 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/__init__.py +10 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/base.py +18 -18
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/capture.py +3 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/file.py +3 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/lifecycle.py +44 -10
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/script.py +3 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/window.py +3 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/edge/__init__.py +36 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/edge/base.py +13 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/edge/lifecycle.py +23 -5
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/edge/settings.py +6 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/yandex/__init__.py +36 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/yandex/base.py +13 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/yandex/lifecycle.py +23 -5
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/yandex/settings.py +6 -1
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/blink/__init__.py +132 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/blink/base.py +167 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/blink/lifecycle.py +89 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/blink/settings.py +63 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/chrome/__init__.py +114 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/chrome/base.py +127 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/chrome/lifecycle.py +85 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/trio_threads → osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi}/chrome/settings.py +1 -1
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/__init__.py +95 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/actions.py +70 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/base.py +200 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/capture.py +39 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/devtools.py +49 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/element.py +64 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/lifecycle.py +135 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/navigation.py +37 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/script.py +56 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/settings.py +36 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/core/window.py +134 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/edge/__init__.py +114 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/edge/base.py +123 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/edge/lifecycle.py +85 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/trio_threads → osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi}/edge/settings.py +1 -1
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/yandex/__init__.py +114 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/yandex/base.py +120 -0
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi/yandex/lifecycle.py +85 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/trio_threads → osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi}/yandex/settings.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/__init__.py +18 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/base.py +25 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/casting.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/features.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +26 -8
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/logging.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/network.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/chrome/__init__.py +34 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/chrome/base.py +14 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +23 -5
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_threads/chrome/settings.py +63 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/__init__.py +10 -14
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/actions.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/auth.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/base.py +18 -22
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/capture.py +4 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/comonents.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/devtools.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/element.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/file.py +5 -4
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/lifecycle.py +45 -11
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/navigation.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/script.py +4 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/settings.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/storage.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/timeouts.py +1 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/core/window.py +6 -6
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/edge/__init__.py +34 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/edge/base.py +14 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +23 -5
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_threads/edge/settings.py +63 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/yandex/__init__.py +34 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/yandex/base.py +14 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +23 -5
- osn_selenium-1.2.0/osn_selenium/webdrivers/trio_threads/yandex/settings.py +63 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/base.py +9 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/lifecycle.py +4 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/chrome/base.py +9 -1
- osn_selenium-1.2.0/osn_selenium/webdrivers/unified/core/__init__.py +1 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/auth.py +4 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/base.py +19 -6
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/capture.py +3 -2
- osn_selenium-1.2.0/osn_selenium/webdrivers/unified/core/components.py +37 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/devtools.py +2 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/file.py +3 -2
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/lifecycle.py +5 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/script.py +5 -3
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/storage.py +2 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/window.py +9 -8
- osn_selenium-1.2.0/osn_selenium/webdrivers/unified/edge/__init__.py +1 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/edge/base.py +9 -1
- osn_selenium-1.2.0/osn_selenium/webdrivers/unified/yandex/__init__.py +1 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/yandex/base.py +9 -1
- osn_selenium-1.0.0/README.md → osn_selenium-1.2.0/osn_selenium.egg-info/PKG-INFO +35 -1
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium.egg-info/SOURCES.txt +91 -220
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium.egg-info/top_level.txt +1 -0
- osn_selenium-1.2.0/pyproject.toml +31 -0
- osn_selenium-1.0.0/MANIFEST.in +0 -4
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/__init__.py +0 -435
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/accessibility.py +0 -62
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/animation.py +0 -47
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/audits.py +0 -39
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/autofill.py +0 -34
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/background_service.py +0 -22
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +0 -95
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/browser.py +0 -122
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/cache_storage.py +0 -49
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/cast.py +0 -31
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/console.py +0 -18
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/css.py +0 -197
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/debugger.py +0 -198
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/device_access.py +0 -22
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/device_orientation.py +0 -14
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/dom.py +0 -305
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/dom_debugger.py +0 -57
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/dom_snapshot.py +0 -42
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/dom_storage.py +0 -31
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/emulation.py +0 -259
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/event_breakpoints.py +0 -18
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/extensions.py +0 -31
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/fed_cm.py +0 -35
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/fetch.py +0 -76
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/file_system.py +0 -11
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/headless_experimental.py +0 -30
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/heap_profiler.py +0 -73
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/indexed_db.py +0 -99
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/input.py +0 -158
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/inspector.py +0 -14
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/io.py +0 -24
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/layer_tree.py +0 -61
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/log.py +0 -27
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/media.py +0 -14
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/memory.py +0 -61
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/network.py +0 -252
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/overlay.py +0 -166
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/page.py +0 -347
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/performance.py +0 -28
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/performance_timeline.py +0 -11
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/preload.py +0 -14
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/profiler.py +0 -54
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/pwa.py +0 -46
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/runtime.py +0 -176
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/schema.py +0 -11
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/security.py +0 -26
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/service_worker.py +0 -54
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/storage.py +0 -175
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/system_info.py +0 -24
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/target.py +0 -125
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/tethering.py +0 -14
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/tracing.py +0 -48
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/web_audio.py +0 -19
- osn_selenium-1.0.0/osn_selenium/abstract/executors/cdp/web_authn.py +0 -76
- osn_selenium-1.0.0/osn_selenium/exceptions/base.py +0 -9
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/__init__.py +0 -550
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/accessibility.py +0 -74
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/animation.py +0 -50
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/audits.py +0 -48
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/autofill.py +0 -39
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/background_service.py +0 -30
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/bluetooth_emulation.py +0 -101
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/browser.py +0 -131
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/cache_storage.py +0 -66
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/cast.py +0 -38
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/console.py +0 -24
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/css.py +0 -187
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/debugger.py +0 -206
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/device_access.py +0 -27
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/device_orientation.py +0 -24
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/dom.py +0 -310
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/dom_debugger.py +0 -56
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/dom_snapshot.py +0 -58
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/dom_storage.py +0 -38
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/emulation.py +0 -270
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/event_breakpoints.py +0 -27
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/extensions.py +0 -39
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/fed_cm.py +0 -45
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/fetch.py +0 -96
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/file_system.py +0 -18
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/headless_experimental.py +0 -44
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/heap_profiler.py +0 -89
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/indexed_db.py +0 -142
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/input.py +0 -233
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/inspector.py +0 -21
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/io.py +0 -33
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/layer_tree.py +0 -71
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/log.py +0 -35
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/media.py +0 -21
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/memory.py +0 -62
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/network.py +0 -287
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/overlay.py +0 -174
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/page.py +0 -365
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/performance.py +0 -33
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/performance_timeline.py +0 -26
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/preload.py +0 -21
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/profiler.py +0 -58
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/pwa.py +0 -55
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/runtime.py +0 -221
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/schema.py +0 -23
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/security.py +0 -30
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/service_worker.py +0 -56
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/storage.py +0 -151
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/system_info.py +0 -30
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/target.py +0 -147
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/tethering.py +0 -21
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/tracing.py +0 -62
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/web_audio.py +0 -24
- osn_selenium-1.0.0/osn_selenium/executors/sync/cdp/web_authn.py +0 -82
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/__init__.py +0 -771
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/accessibility.py +0 -87
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/animation.py +0 -63
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/audits.py +0 -57
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/autofill.py +0 -52
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/background_service.py +0 -40
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +0 -111
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/browser.py +0 -140
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/cache_storage.py +0 -79
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/cast.py +0 -47
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/console.py +0 -33
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/css.py +0 -196
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/debugger.py +0 -219
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/device_access.py +0 -40
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/device_orientation.py +0 -34
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/dom.py +0 -319
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/dom_debugger.py +0 -69
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +0 -71
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/dom_storage.py +0 -51
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/emulation.py +0 -283
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +0 -37
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/extensions.py +0 -52
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/fed_cm.py +0 -54
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/fetch.py +0 -105
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/file_system.py +0 -31
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/headless_experimental.py +0 -54
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/heap_profiler.py +0 -102
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/indexed_db.py +0 -155
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/input.py +0 -242
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/inspector.py +0 -34
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/io.py +0 -42
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/layer_tree.py +0 -84
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/log.py +0 -44
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/media.py +0 -30
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/memory.py +0 -71
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/network.py +0 -296
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/overlay.py +0 -183
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/page.py +0 -374
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/performance.py +0 -46
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/performance_timeline.py +0 -36
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/preload.py +0 -30
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/profiler.py +0 -71
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/pwa.py +0 -64
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/runtime.py +0 -230
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/schema.py +0 -32
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/security.py +0 -43
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/service_worker.py +0 -69
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/storage.py +0 -162
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/system_info.py +0 -43
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/target.py +0 -156
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/tethering.py +0 -34
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/tracing.py +0 -71
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/web_audio.py +0 -37
- osn_selenium-1.0.0/osn_selenium/executors/trio_threads/cdp/web_authn.py +0 -95
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/accessibility.py +0 -81
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/animation.py +0 -50
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/audits.py +0 -45
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/autofill.py +0 -41
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/background_service.py +0 -24
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/bluetooth_emulation.py +0 -132
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/browser.py +0 -143
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/cache_storage.py +0 -69
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/cast.py +0 -32
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/console.py +0 -18
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/css.py +0 -237
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/debugger.py +0 -243
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/device_access.py +0 -21
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/device_orientation.py +0 -18
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/dom.py +0 -380
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/dom_debugger.py +0 -65
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/dom_snapshot.py +0 -58
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/dom_storage.py +0 -38
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/emulation.py +0 -312
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/event_breakpoints.py +0 -24
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/extensions.py +0 -45
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/fed_cm.py +0 -51
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/fetch.py +0 -111
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/file_system.py +0 -15
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/headless_experimental.py +0 -38
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/heap_profiler.py +0 -101
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/indexed_db.py +0 -157
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/input.py +0 -254
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/inspector.py +0 -15
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/io.py +0 -29
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/layer_tree.py +0 -71
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/log.py +0 -29
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/media.py +0 -15
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/memory.py +0 -59
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/network.py +0 -323
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/overlay.py +0 -209
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/page.py +0 -410
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/performance.py +0 -27
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/performance_timeline.py +0 -17
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/preload.py +0 -15
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/profiler.py +0 -55
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/pwa.py +0 -55
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/runtime.py +0 -245
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/schema.py +0 -17
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/security.py +0 -27
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/service_worker.py +0 -62
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/storage.py +0 -178
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/system_info.py +0 -24
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/target.py +0 -165
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/tethering.py +0 -15
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/tracing.py +0 -62
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/web_audio.py +0 -18
- osn_selenium-1.0.0/osn_selenium/executors/unified/cdp/web_authn.py +0 -103
- osn_selenium-1.0.0/osn_selenium/webdrivers/_typehints.py +0 -10
- osn_selenium-1.0.0/osn_selenium/webdrivers/protocols.py +0 -50
- osn_selenium-1.0.0/osn_selenium/webdrivers/unified/core/components.py +0 -32
- osn_selenium-1.0.0/setup.py +0 -46
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/description.txt +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/dev_tools → osn_selenium-1.2.0/osn_selenium}/_exception_helpers.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/executors/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/executors/javascript.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/base.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/click.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/drag_and_drop.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/hm_keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/hm_move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/hm_scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/action_chains/utils.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/alert.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/browser.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/browsing_context.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/dialog.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/fedcm.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/mobile.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/network.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/permissions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/script.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/shadow_root.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/storage.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/switch_to.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/web_driver_wait.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/web_element.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/instances/web_extension.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/casting.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/features.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/logging.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/network.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/blink/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/chrome/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/chrome/base.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/chrome/lifecycle.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/chrome/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/actions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/auth.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/components.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/devtools.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/element.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/file.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/navigation.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/storage.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/core/timeouts.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/edge/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/edge/base.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/edge/lifecycle.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/edge/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/yandex/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/yandex/base.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/yandex/lifecycle.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/abstract/webdriver/yandex/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/browsers_handler/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/browsers_handler/_linux.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/browsers_handler/_windows.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/_system_utils.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/_validators.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/domains_default/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/logger/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/manager/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/manager/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/dev_tools/target/detach.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/exceptions → osn_selenium-1.2.0/osn_selenium/executors}/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/executors → osn_selenium-1.2.0/osn_selenium/executors/sync}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/executors/sync/javascript.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/executors/sync → osn_selenium-1.2.0/osn_selenium/executors/trio_bidi}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/executors/trio_threads/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/executors/unified/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/executors/unified/cdp → osn_selenium-1.2.0/osn_selenium/flags}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/_typehints.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/_validators.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/flags → osn_selenium-1.2.0/osn_selenium/flags/models}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/models/chrome.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/models/edge.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/models/yandex.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/flags/yandex.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/flags/models → osn_selenium-1.2.0/osn_selenium/instances}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/_typehints.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/_utils.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/instances → osn_selenium-1.2.0/osn_selenium/instances/sync}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/base.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/click.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/drag_and_drop.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/hm_keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/hm_move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/hm_scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/action_chains/utils.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/alert.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/browser.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/dialog.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/fedcm.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/mobile.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/network.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/permissions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/storage.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/switch_to.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/web_driver_wait.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/sync/web_extension.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/instances/sync → osn_selenium-1.2.0/osn_selenium/instances/trio_bidi}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/click.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/drag_and_drop.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/hm_keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/hm_move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/hm_scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/trio_threads/action_chains/utils.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/base.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/click.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/drag_and_drop.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/hm_keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/hm_move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/hm_scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/keyboard.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/move.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/scroll.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/action_chains/utils.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/alert.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/browser.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/dialog.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/fedcm.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/mobile.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/network.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/permissions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/shadow_root.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/storage.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/switch_to.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/web_driver_wait.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/instances/unified/web_extension.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/_decorators.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/_detect/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/_detect/functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/_detect/templates.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/_typehints.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/registry/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/registry/_core_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/registry/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/registry/_typehints.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/registry/_utils.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/_functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/_templates.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/_typehints.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/fingerprint/spoof/rules.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/functions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/check_element_in_viewport.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_document_scroll_size.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_element_css.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_element_rect_in_viewport.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_random_element_point_in_viewport.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_viewport_position.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_viewport_rect.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/get_viewport_size.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/open_new_tab.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/start_fingerprint_detection.js +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/javascript/scripts/stop_window_loading.js +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers → osn_selenium-1.2.0/osn_selenium/trio_bidi}/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/_executable_tables → osn_selenium-1.2.0/osn_selenium/trio_bidi/mapping}/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/sync → osn_selenium-1.2.0/osn_selenium/webdrivers}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/_decorators.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/trio_threads → osn_selenium-1.2.0/osn_selenium/webdrivers/_executable_tables}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/_executable_tables/functions.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/unified → osn_selenium-1.2.0/osn_selenium/webdrivers/sync}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/casting.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/features.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/logging.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/network.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/blink/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/actions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/auth.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/comonents.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/devtools.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/element.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/navigation.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/storage.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/sync/core/timeouts.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/unified/blink → osn_selenium-1.2.0/osn_selenium/webdrivers/trio_bidi}/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/unified/chrome → osn_selenium-1.2.0/osn_selenium/webdrivers/trio_threads}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/trio_threads/blink/settings.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/unified/core → osn_selenium-1.2.0/osn_selenium/webdrivers/unified}/__init__.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/unified/edge → osn_selenium-1.2.0/osn_selenium/webdrivers/unified/blink}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/casting.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/features.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/logging.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/network.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/blink/settings.py +0 -0
- {osn_selenium-1.0.0/osn_selenium/webdrivers/unified/yandex → osn_selenium-1.2.0/osn_selenium/webdrivers/unified/chrome}/__init__.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/chrome/lifecycle.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/chrome/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/actions.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/element.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/navigation.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/core/timeouts.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/edge/lifecycle.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/edge/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/yandex/lifecycle.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium/webdrivers/unified/yandex/settings.py +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium.egg-info/dependency_links.txt +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/osn_selenium.egg-info/requires.txt +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/requirements.txt +0 -0
- {osn_selenium-1.0.0 → osn_selenium-1.2.0}/setup.cfg +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: osn-selenium
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: An advanced, asynchronous wrapper for Selenium designed for fine-grained browser control. It leverages `trio` for async operations, provides human-like action chains for more natural automation, and offers deep integration with the Chrome DevTools Protocol (CDP) for advanced features like network interception. The library is structured to be extensible, with built-in support for Blink-based browsers like Chrome, Edge, and Yandex.
|
|
5
|
-
Author: oddshellnick
|
|
6
|
-
|
|
5
|
+
Author-email: oddshellnick <oddshellnick.programming@gmail.com>
|
|
6
|
+
Project-URL: Homepage, https://github.com/oddshellnick/osn-selenium
|
|
7
|
+
Project-URL: Issues, https://github.com/oddshellnick/osn-selenium/issues
|
|
8
|
+
Requires-Python: >=3.12
|
|
7
9
|
Description-Content-Type: text/markdown
|
|
8
10
|
Requires-Dist: trio<1.0.0,>=0.32.0
|
|
9
11
|
Requires-Dist: selenium<5.0.0,>=4.40.0
|
|
@@ -11,17 +13,13 @@ Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
|
11
13
|
Requires-Dist: trio-websocket<1.0.0,>=0.12.0
|
|
12
14
|
Requires-Dist: pywin32>=310; sys_platform == "win32"
|
|
13
15
|
Requires-Dist: osn-system-utils<0.1.0,>=0.0.4
|
|
14
|
-
Dynamic: author
|
|
15
|
-
Dynamic: author-email
|
|
16
|
-
Dynamic: description
|
|
17
|
-
Dynamic: description-content-type
|
|
18
|
-
Dynamic: requires-dist
|
|
19
|
-
Dynamic: summary
|
|
20
16
|
|
|
21
17
|
# osn-selenium: Advanced Selenium Wrapper with Async Support and Fingerprinting Protection
|
|
22
18
|
|
|
23
19
|
osn-selenium is a robust wrapper around Selenium WebDriver designed for automation of Blink-based browsers (Chrome, Edge, Yandex). It extends standard Selenium capabilities by providing native asynchronous support via Trio, deep integration with the Chrome DevTools Protocol (CDP), sophisticated browser fingerprint spoofing, and human-like user interaction simulation.
|
|
24
20
|
|
|
21
|
+
For more detailed information, please visit the [wiki page](https://github.com/oddshellnick/osn-selenium/wiki).
|
|
22
|
+
|
|
25
23
|
## Technologies
|
|
26
24
|
|
|
27
25
|
| Name | Badge | Description |
|
|
@@ -67,12 +65,23 @@ osn-selenium is a robust wrapper around Selenium WebDriver designed for automati
|
|
|
67
65
|
pip install osn-selenium
|
|
68
66
|
```
|
|
69
67
|
|
|
68
|
+
**With pip (beta versions):**
|
|
69
|
+
```bash
|
|
70
|
+
pip install -i https://test.pypi.org/simple/ osn_system_utils
|
|
71
|
+
```
|
|
72
|
+
|
|
70
73
|
* **With git:**
|
|
71
74
|
```bash
|
|
72
75
|
pip install git+https://github.com/oddshellnick/osn-selenium.git
|
|
73
76
|
```
|
|
74
77
|
*(Ensure you have git installed)*
|
|
75
78
|
|
|
79
|
+
* **With git (beta versions):**
|
|
80
|
+
```bash
|
|
81
|
+
pip install git+https://github.com/oddshellnick/osn-selenium.git@dev
|
|
82
|
+
```
|
|
83
|
+
*(Ensure you have git installed)*
|
|
84
|
+
|
|
76
85
|
2. **Install the required Python packages using pip:**
|
|
77
86
|
|
|
78
87
|
```bash
|
|
@@ -224,10 +233,15 @@ Utilities for executing JS and managing browser fingerprints.
|
|
|
224
233
|
|
|
225
234
|
## Notes
|
|
226
235
|
|
|
236
|
+
* **CDP Versioning and External Packages:**
|
|
237
|
+
This library supports a modular CDP (Chrome DevTools Protocol) architecture. Since standard Selenium distributions often deprecate or remove older protocol versions, we maintain a dedicated repository for all versions at [osn-selenium-cdp](https://github.com/oddshellnick/osn-selenium-cdp).
|
|
238
|
+
* **Manual Installation:** You can install specific CDP support by targeting the corresponding branch (e.g., `pip install git+https://github.com/oddshellnick/osn-selenium-cdp.git@v131`).
|
|
239
|
+
* **Structure Requirement:** If you choose to add or create CDP version packages manually, they **must strictly follow the directory structure** used in the `osn-selenium-cdp` repository. This ensures that the internal `MetaPathFinder` hook can correctly intercept and redirect imports from `selenium.webdriver.common.devtools`. Deviating from this structure will result in `CDPPackageError` or `ImportError`.
|
|
227
240
|
* **Concurrency Constraints in `trio_threads`:**
|
|
228
241
|
The `trio_threads` implementation is built using a unified `trio.Lock`. This means that every driver function and every associated instance (including `ActionChains`, `WebElement`, `Alert`, etc.) can execute only one operation at a time. Do not attempt to parallelize multiple operations (coroutines) within a single browser instance, as they will be queued sequentially. The primary purpose of this asynchronous implementation is to enable the simultaneous management of **multiple browser instances** within a single event loop, rather than concurrent interactions with one browser.
|
|
229
242
|
* **CDP Domains and Background Tasks:**
|
|
230
243
|
When configuring the domains for network interception, it is highly recommended to provide a `target_background_task` in your `DevToolsSettings`. This is especially critical for websites that dynamically create numerous targets (such as iframes or workers). Without a proper background task to handle these events, the browser's execution flow might hang or fail to process requests for nested targets properly.
|
|
244
|
+
* **Experimental `trio_bidi` Architecture:** A new experimental architecture, `trio_bidi`, has been introduced. While it currently does not cover 100% of browser capabilities, it supports all core functionalities, including page navigation and element interactions, through native BiDi communication.
|
|
231
245
|
|
|
232
246
|
## Future Notes
|
|
233
247
|
|
|
@@ -236,4 +250,4 @@ Utilities for executing JS and managing browser fingerprints.
|
|
|
236
250
|
* **macOS Support:** Extending browser auto-detection and lifecycle management for macOS environments.
|
|
237
251
|
* **High-Level CDP Handlers:** Expanding the `dev_tools.domains` module to include simplified event-driven logic for `Network`, `Page`, and `Runtime` domains, similar to the current `Fetch` implementation.
|
|
238
252
|
* **Enhanced Human-Like Actions:** Adding more complex Bezier-based mouse movement patterns and advanced typing jitter to further decrease automation footprints.
|
|
239
|
-
* **
|
|
253
|
+
* **Full BiDi Coverage:** Implementing comprehensive Selenium feature coverage using BiDi mappings to eventually replace the need for synchronous thread pools in async mode.
|
|
@@ -1,27 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: osn-selenium
|
|
3
|
-
Version: 1.0.0
|
|
4
|
-
Summary: An advanced, asynchronous wrapper for Selenium designed for fine-grained browser control. It leverages `trio` for async operations, provides human-like action chains for more natural automation, and offers deep integration with the Chrome DevTools Protocol (CDP) for advanced features like network interception. The library is structured to be extensible, with built-in support for Blink-based browsers like Chrome, Edge, and Yandex.
|
|
5
|
-
Author: oddshellnick
|
|
6
|
-
Author-email: oddshellnick.programming@gmail.com
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
Requires-Dist: trio<1.0.0,>=0.32.0
|
|
9
|
-
Requires-Dist: selenium<5.0.0,>=4.40.0
|
|
10
|
-
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
|
11
|
-
Requires-Dist: trio-websocket<1.0.0,>=0.12.0
|
|
12
|
-
Requires-Dist: pywin32>=310; sys_platform == "win32"
|
|
13
|
-
Requires-Dist: osn-system-utils<0.1.0,>=0.0.4
|
|
14
|
-
Dynamic: author
|
|
15
|
-
Dynamic: author-email
|
|
16
|
-
Dynamic: description
|
|
17
|
-
Dynamic: description-content-type
|
|
18
|
-
Dynamic: requires-dist
|
|
19
|
-
Dynamic: summary
|
|
20
|
-
|
|
21
1
|
# osn-selenium: Advanced Selenium Wrapper with Async Support and Fingerprinting Protection
|
|
22
2
|
|
|
23
3
|
osn-selenium is a robust wrapper around Selenium WebDriver designed for automation of Blink-based browsers (Chrome, Edge, Yandex). It extends standard Selenium capabilities by providing native asynchronous support via Trio, deep integration with the Chrome DevTools Protocol (CDP), sophisticated browser fingerprint spoofing, and human-like user interaction simulation.
|
|
24
4
|
|
|
5
|
+
For more detailed information, please visit the [wiki page](https://github.com/oddshellnick/osn-selenium/wiki).
|
|
6
|
+
|
|
25
7
|
## Technologies
|
|
26
8
|
|
|
27
9
|
| Name | Badge | Description |
|
|
@@ -67,12 +49,23 @@ osn-selenium is a robust wrapper around Selenium WebDriver designed for automati
|
|
|
67
49
|
pip install osn-selenium
|
|
68
50
|
```
|
|
69
51
|
|
|
52
|
+
**With pip (beta versions):**
|
|
53
|
+
```bash
|
|
54
|
+
pip install -i https://test.pypi.org/simple/ osn_system_utils
|
|
55
|
+
```
|
|
56
|
+
|
|
70
57
|
* **With git:**
|
|
71
58
|
```bash
|
|
72
59
|
pip install git+https://github.com/oddshellnick/osn-selenium.git
|
|
73
60
|
```
|
|
74
61
|
*(Ensure you have git installed)*
|
|
75
62
|
|
|
63
|
+
* **With git (beta versions):**
|
|
64
|
+
```bash
|
|
65
|
+
pip install git+https://github.com/oddshellnick/osn-selenium.git@dev
|
|
66
|
+
```
|
|
67
|
+
*(Ensure you have git installed)*
|
|
68
|
+
|
|
76
69
|
2. **Install the required Python packages using pip:**
|
|
77
70
|
|
|
78
71
|
```bash
|
|
@@ -224,10 +217,15 @@ Utilities for executing JS and managing browser fingerprints.
|
|
|
224
217
|
|
|
225
218
|
## Notes
|
|
226
219
|
|
|
220
|
+
* **CDP Versioning and External Packages:**
|
|
221
|
+
This library supports a modular CDP (Chrome DevTools Protocol) architecture. Since standard Selenium distributions often deprecate or remove older protocol versions, we maintain a dedicated repository for all versions at [osn-selenium-cdp](https://github.com/oddshellnick/osn-selenium-cdp).
|
|
222
|
+
* **Manual Installation:** You can install specific CDP support by targeting the corresponding branch (e.g., `pip install git+https://github.com/oddshellnick/osn-selenium-cdp.git@v131`).
|
|
223
|
+
* **Structure Requirement:** If you choose to add or create CDP version packages manually, they **must strictly follow the directory structure** used in the `osn-selenium-cdp` repository. This ensures that the internal `MetaPathFinder` hook can correctly intercept and redirect imports from `selenium.webdriver.common.devtools`. Deviating from this structure will result in `CDPPackageError` or `ImportError`.
|
|
227
224
|
* **Concurrency Constraints in `trio_threads`:**
|
|
228
225
|
The `trio_threads` implementation is built using a unified `trio.Lock`. This means that every driver function and every associated instance (including `ActionChains`, `WebElement`, `Alert`, etc.) can execute only one operation at a time. Do not attempt to parallelize multiple operations (coroutines) within a single browser instance, as they will be queued sequentially. The primary purpose of this asynchronous implementation is to enable the simultaneous management of **multiple browser instances** within a single event loop, rather than concurrent interactions with one browser.
|
|
229
226
|
* **CDP Domains and Background Tasks:**
|
|
230
227
|
When configuring the domains for network interception, it is highly recommended to provide a `target_background_task` in your `DevToolsSettings`. This is especially critical for websites that dynamically create numerous targets (such as iframes or workers). Without a proper background task to handle these events, the browser's execution flow might hang or fail to process requests for nested targets properly.
|
|
228
|
+
* **Experimental `trio_bidi` Architecture:** A new experimental architecture, `trio_bidi`, has been introduced. While it currently does not cover 100% of browser capabilities, it supports all core functionalities, including page navigation and element interactions, through native BiDi communication.
|
|
231
229
|
|
|
232
230
|
## Future Notes
|
|
233
231
|
|
|
@@ -236,4 +234,4 @@ Utilities for executing JS and managing browser fingerprints.
|
|
|
236
234
|
* **macOS Support:** Extending browser auto-detection and lifecycle management for macOS environments.
|
|
237
235
|
* **High-Level CDP Handlers:** Expanding the `dev_tools.domains` module to include simplified event-driven logic for `Network`, `Page`, and `Runtime` domains, similar to the current `Fetch` implementation.
|
|
238
236
|
* **Enhanced Human-Like Actions:** Adding more complex Bezier-based mouse movement patterns and advanced typing jitter to further decrease automation footprints.
|
|
239
|
-
* **
|
|
237
|
+
* **Full BiDi Coverage:** Implementing comprehensive Selenium feature coverage using BiDi mappings to eventually replace the need for synchronous thread pools in async mode.
|
|
@@ -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
|
|
@@ -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]
|