osn-selenium 0.0.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- osn_selenium/_base_models.py +41 -0
- osn_selenium/_cdp_import.py +253 -0
- osn_selenium/_functions.py +84 -0
- osn_selenium/_typehints.py +19 -0
- osn_selenium/abstract/executors/cdp/__init__.py +435 -0
- osn_selenium/abstract/executors/cdp/accessibility.py +62 -0
- osn_selenium/abstract/executors/cdp/animation.py +47 -0
- osn_selenium/abstract/executors/cdp/audits.py +39 -0
- osn_selenium/abstract/executors/cdp/autofill.py +34 -0
- osn_selenium/abstract/executors/cdp/background_service.py +22 -0
- osn_selenium/abstract/executors/cdp/bluetooth_emulation.py +95 -0
- osn_selenium/abstract/executors/cdp/browser.py +122 -0
- osn_selenium/abstract/executors/cdp/cache_storage.py +49 -0
- osn_selenium/abstract/executors/cdp/cast.py +31 -0
- osn_selenium/abstract/executors/cdp/console.py +18 -0
- osn_selenium/abstract/executors/cdp/css.py +197 -0
- osn_selenium/abstract/executors/cdp/debugger.py +198 -0
- osn_selenium/abstract/executors/cdp/device_access.py +22 -0
- osn_selenium/abstract/executors/cdp/device_orientation.py +14 -0
- osn_selenium/abstract/executors/cdp/dom.py +305 -0
- osn_selenium/abstract/executors/cdp/dom_debugger.py +57 -0
- osn_selenium/abstract/executors/cdp/dom_snapshot.py +42 -0
- osn_selenium/abstract/executors/cdp/dom_storage.py +31 -0
- osn_selenium/abstract/executors/cdp/emulation.py +259 -0
- osn_selenium/abstract/executors/cdp/event_breakpoints.py +18 -0
- osn_selenium/abstract/executors/cdp/extensions.py +31 -0
- osn_selenium/abstract/executors/cdp/fed_cm.py +35 -0
- osn_selenium/abstract/executors/cdp/fetch.py +76 -0
- osn_selenium/abstract/executors/cdp/file_system.py +11 -0
- osn_selenium/abstract/executors/cdp/headless_experimental.py +30 -0
- osn_selenium/abstract/executors/cdp/heap_profiler.py +73 -0
- osn_selenium/abstract/executors/cdp/indexed_db.py +99 -0
- osn_selenium/abstract/executors/cdp/input.py +158 -0
- osn_selenium/abstract/executors/cdp/inspector.py +14 -0
- osn_selenium/abstract/executors/cdp/io.py +24 -0
- osn_selenium/abstract/executors/cdp/layer_tree.py +61 -0
- osn_selenium/abstract/executors/cdp/log.py +27 -0
- osn_selenium/abstract/executors/cdp/media.py +14 -0
- osn_selenium/abstract/executors/cdp/memory.py +61 -0
- osn_selenium/abstract/executors/cdp/network.py +252 -0
- osn_selenium/abstract/executors/cdp/overlay.py +166 -0
- osn_selenium/abstract/executors/cdp/page.py +347 -0
- osn_selenium/abstract/executors/cdp/performance.py +28 -0
- osn_selenium/abstract/executors/cdp/performance_timeline.py +11 -0
- osn_selenium/abstract/executors/cdp/preload.py +14 -0
- osn_selenium/abstract/executors/cdp/profiler.py +54 -0
- osn_selenium/abstract/executors/cdp/pwa.py +46 -0
- osn_selenium/abstract/executors/cdp/runtime.py +176 -0
- osn_selenium/abstract/executors/cdp/schema.py +11 -0
- osn_selenium/abstract/executors/cdp/security.py +26 -0
- osn_selenium/abstract/executors/cdp/service_worker.py +54 -0
- osn_selenium/abstract/executors/cdp/storage.py +175 -0
- osn_selenium/abstract/executors/cdp/system_info.py +24 -0
- osn_selenium/abstract/executors/cdp/target.py +125 -0
- osn_selenium/abstract/executors/cdp/tethering.py +14 -0
- osn_selenium/abstract/executors/cdp/tracing.py +48 -0
- osn_selenium/abstract/executors/cdp/web_audio.py +19 -0
- osn_selenium/abstract/executors/cdp/web_authn.py +76 -0
- osn_selenium/abstract/executors/cdp.py +63 -0
- osn_selenium/abstract/executors/javascript.py +203 -0
- osn_selenium/abstract/instances/action_chains/__init__.py +12 -0
- osn_selenium/abstract/instances/action_chains/base.py +25 -0
- osn_selenium/abstract/instances/action_chains/click.py +93 -0
- osn_selenium/abstract/instances/action_chains/drag_and_drop.py +46 -0
- osn_selenium/abstract/instances/action_chains/hm_keyboard.py +44 -0
- osn_selenium/abstract/instances/action_chains/hm_move.py +104 -0
- osn_selenium/abstract/instances/action_chains/hm_scroll.py +75 -0
- osn_selenium/abstract/instances/action_chains/keyboard.py +79 -0
- osn_selenium/abstract/instances/action_chains/move.py +60 -0
- osn_selenium/abstract/instances/action_chains/scroll.py +61 -0
- osn_selenium/abstract/instances/action_chains/utils.py +44 -0
- osn_selenium/abstract/instances/alert.py +67 -0
- osn_selenium/abstract/instances/browser.py +76 -0
- osn_selenium/abstract/instances/browsing_context.py +310 -0
- osn_selenium/abstract/instances/dialog.py +107 -0
- osn_selenium/abstract/instances/fedcm.py +133 -0
- osn_selenium/abstract/instances/mobile.py +79 -0
- osn_selenium/abstract/instances/network.py +100 -0
- osn_selenium/abstract/instances/permissions.py +52 -0
- osn_selenium/abstract/instances/script.py +109 -0
- osn_selenium/abstract/instances/shadow_root.py +81 -0
- osn_selenium/abstract/instances/storage.py +98 -0
- osn_selenium/abstract/instances/switch_to.py +104 -0
- osn_selenium/abstract/instances/web_driver_wait.py +57 -0
- osn_selenium/abstract/instances/web_element.py +395 -0
- osn_selenium/abstract/instances/web_extension.py +70 -0
- osn_selenium/abstract/webdriver/blink/__init__.py +18 -0
- osn_selenium/abstract/webdriver/blink/base.py +80 -0
- osn_selenium/abstract/webdriver/blink/casting.py +82 -0
- osn_selenium/abstract/webdriver/blink/features.py +51 -0
- osn_selenium/abstract/webdriver/blink/lifecycle.py +76 -0
- osn_selenium/abstract/webdriver/blink/logging.py +40 -0
- osn_selenium/abstract/webdriver/blink/network.py +45 -0
- osn_selenium/abstract/webdriver/blink/settings.py +68 -0
- osn_selenium/abstract/webdriver/chrome/__init__.py +18 -0
- osn_selenium/abstract/webdriver/chrome/base.py +36 -0
- osn_selenium/abstract/webdriver/chrome/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/chrome/settings.py +110 -0
- osn_selenium/abstract/webdriver/core/__init__.py +16 -0
- osn_selenium/abstract/webdriver/core/actions.py +58 -0
- osn_selenium/abstract/webdriver/core/auth.py +145 -0
- osn_selenium/abstract/webdriver/core/base.py +298 -0
- osn_selenium/abstract/webdriver/core/capture.py +84 -0
- osn_selenium/abstract/webdriver/core/components.py +82 -0
- osn_selenium/abstract/webdriver/core/devtools.py +69 -0
- osn_selenium/abstract/webdriver/core/element.py +55 -0
- osn_selenium/abstract/webdriver/core/file.py +82 -0
- osn_selenium/abstract/webdriver/core/lifecycle.py +103 -0
- osn_selenium/abstract/webdriver/core/navigation.py +65 -0
- osn_selenium/abstract/webdriver/core/script.py +88 -0
- osn_selenium/abstract/webdriver/core/settings.py +43 -0
- osn_selenium/abstract/webdriver/core/storage.py +81 -0
- osn_selenium/abstract/webdriver/core/timeouts.py +101 -0
- osn_selenium/abstract/webdriver/core/window.py +237 -0
- osn_selenium/abstract/webdriver/edge/__init__.py +18 -0
- osn_selenium/abstract/webdriver/edge/base.py +36 -0
- osn_selenium/abstract/webdriver/edge/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/edge/settings.py +110 -0
- osn_selenium/abstract/webdriver/yandex/__init__.py +18 -0
- osn_selenium/abstract/webdriver/yandex/base.py +18 -0
- osn_selenium/abstract/webdriver/yandex/lifecycle.py +92 -0
- osn_selenium/abstract/webdriver/yandex/settings.py +110 -0
- osn_selenium/base_mixin.py +122 -0
- osn_selenium/browsers_handler/__init__.py +47 -17
- osn_selenium/browsers_handler/_linux.py +226 -0
- osn_selenium/browsers_handler/_windows.py +21 -14
- osn_selenium/browsers_handler/{types.py → models.py} +5 -2
- osn_selenium/dev_tools/_decorators.py +149 -0
- osn_selenium/dev_tools/_exception_helpers.py +116 -0
- osn_selenium/dev_tools/_functions.py +174 -0
- osn_selenium/dev_tools/_system_utils.py +35 -0
- osn_selenium/dev_tools/_typehints.py +35 -0
- osn_selenium/dev_tools/_validators.py +227 -0
- osn_selenium/dev_tools/_wrappers.py +92 -0
- osn_selenium/dev_tools/domains/__init__.py +7 -40
- osn_selenium/dev_tools/domains/abstract.py +98 -254
- osn_selenium/dev_tools/domains/fetch.py +229 -906
- osn_selenium/dev_tools/domains_default/fetch.py +40 -28
- osn_selenium/dev_tools/filters.py +40 -0
- osn_selenium/dev_tools/logger/main.py +214 -0
- osn_selenium/dev_tools/logger/models.py +232 -0
- osn_selenium/dev_tools/logger/target.py +278 -0
- osn_selenium/dev_tools/manager/__init__.py +16 -0
- osn_selenium/dev_tools/manager/base.py +124 -0
- osn_selenium/dev_tools/manager/lifecycle.py +236 -0
- osn_selenium/dev_tools/manager/logging.py +153 -0
- osn_selenium/dev_tools/manager/settings.py +89 -0
- osn_selenium/dev_tools/manager/targets.py +175 -0
- osn_selenium/dev_tools/models.py +49 -0
- osn_selenium/dev_tools/settings.py +139 -0
- osn_selenium/dev_tools/target/__init__.py +16 -0
- osn_selenium/dev_tools/target/base.py +427 -0
- osn_selenium/dev_tools/target/detach.py +54 -0
- osn_selenium/dev_tools/target/discovery.py +112 -0
- osn_selenium/dev_tools/target/events.py +120 -0
- osn_selenium/dev_tools/target/fingerprint.py +126 -0
- osn_selenium/dev_tools/target/lifecycle.py +184 -0
- osn_selenium/dev_tools/target/logging.py +163 -0
- osn_selenium/exceptions/__init__.py +1 -0
- osn_selenium/exceptions/base.py +9 -0
- osn_selenium/exceptions/configuration.py +84 -0
- osn_selenium/exceptions/dependencies.py +60 -0
- osn_selenium/exceptions/devtools.py +114 -0
- osn_selenium/exceptions/flags.py +45 -0
- osn_selenium/exceptions/instance.py +92 -0
- osn_selenium/exceptions/javascript.py +31 -0
- osn_selenium/exceptions/logic.py +31 -0
- osn_selenium/exceptions/path.py +77 -0
- osn_selenium/exceptions/platform.py +33 -0
- osn_selenium/exceptions/protocol.py +86 -0
- osn_selenium/exceptions/webdriver.py +44 -0
- osn_selenium/exceptions/window.py +63 -0
- osn_selenium/executors/__init__.py +1 -0
- osn_selenium/executors/sync/__init__.py +1 -0
- osn_selenium/executors/sync/cdp/__init__.py +550 -0
- osn_selenium/executors/sync/cdp/accessibility.py +74 -0
- osn_selenium/executors/sync/cdp/animation.py +50 -0
- osn_selenium/executors/sync/cdp/audits.py +48 -0
- osn_selenium/executors/sync/cdp/autofill.py +39 -0
- osn_selenium/executors/sync/cdp/background_service.py +30 -0
- osn_selenium/executors/sync/cdp/bluetooth_emulation.py +101 -0
- osn_selenium/executors/sync/cdp/browser.py +131 -0
- osn_selenium/executors/sync/cdp/cache_storage.py +66 -0
- osn_selenium/executors/sync/cdp/cast.py +38 -0
- osn_selenium/executors/sync/cdp/console.py +24 -0
- osn_selenium/executors/sync/cdp/css.py +187 -0
- osn_selenium/executors/sync/cdp/debugger.py +206 -0
- osn_selenium/executors/sync/cdp/device_access.py +27 -0
- osn_selenium/executors/sync/cdp/device_orientation.py +24 -0
- osn_selenium/executors/sync/cdp/dom.py +310 -0
- osn_selenium/executors/sync/cdp/dom_debugger.py +56 -0
- osn_selenium/executors/sync/cdp/dom_snapshot.py +58 -0
- osn_selenium/executors/sync/cdp/dom_storage.py +38 -0
- osn_selenium/executors/sync/cdp/emulation.py +270 -0
- osn_selenium/executors/sync/cdp/event_breakpoints.py +27 -0
- osn_selenium/executors/sync/cdp/extensions.py +39 -0
- osn_selenium/executors/sync/cdp/fed_cm.py +45 -0
- osn_selenium/executors/sync/cdp/fetch.py +96 -0
- osn_selenium/executors/sync/cdp/file_system.py +18 -0
- osn_selenium/executors/sync/cdp/headless_experimental.py +44 -0
- osn_selenium/executors/sync/cdp/heap_profiler.py +89 -0
- osn_selenium/executors/sync/cdp/indexed_db.py +142 -0
- osn_selenium/executors/sync/cdp/input.py +233 -0
- osn_selenium/executors/sync/cdp/inspector.py +21 -0
- osn_selenium/executors/sync/cdp/io.py +33 -0
- osn_selenium/executors/sync/cdp/layer_tree.py +71 -0
- osn_selenium/executors/sync/cdp/log.py +35 -0
- osn_selenium/executors/sync/cdp/media.py +21 -0
- osn_selenium/executors/sync/cdp/memory.py +62 -0
- osn_selenium/executors/sync/cdp/network.py +287 -0
- osn_selenium/executors/sync/cdp/overlay.py +174 -0
- osn_selenium/executors/sync/cdp/page.py +365 -0
- osn_selenium/executors/sync/cdp/performance.py +33 -0
- osn_selenium/executors/sync/cdp/performance_timeline.py +26 -0
- osn_selenium/executors/sync/cdp/preload.py +21 -0
- osn_selenium/executors/sync/cdp/profiler.py +58 -0
- osn_selenium/executors/sync/cdp/pwa.py +55 -0
- osn_selenium/executors/sync/cdp/runtime.py +221 -0
- osn_selenium/executors/sync/cdp/schema.py +23 -0
- osn_selenium/executors/sync/cdp/security.py +30 -0
- osn_selenium/executors/sync/cdp/service_worker.py +56 -0
- osn_selenium/executors/sync/cdp/storage.py +151 -0
- osn_selenium/executors/sync/cdp/system_info.py +30 -0
- osn_selenium/executors/sync/cdp/target.py +147 -0
- osn_selenium/executors/sync/cdp/tethering.py +21 -0
- osn_selenium/executors/sync/cdp/tracing.py +62 -0
- osn_selenium/executors/sync/cdp/web_audio.py +24 -0
- osn_selenium/executors/sync/cdp/web_authn.py +82 -0
- osn_selenium/executors/sync/cdp.py +100 -0
- osn_selenium/executors/sync/javascript.py +79 -0
- osn_selenium/executors/trio_threads/__init__.py +1 -0
- osn_selenium/executors/trio_threads/cdp/__init__.py +771 -0
- osn_selenium/executors/trio_threads/cdp/accessibility.py +87 -0
- osn_selenium/executors/trio_threads/cdp/animation.py +63 -0
- osn_selenium/executors/trio_threads/cdp/audits.py +57 -0
- osn_selenium/executors/trio_threads/cdp/autofill.py +52 -0
- osn_selenium/executors/trio_threads/cdp/background_service.py +40 -0
- osn_selenium/executors/trio_threads/cdp/bluetooth_emulation.py +111 -0
- osn_selenium/executors/trio_threads/cdp/browser.py +140 -0
- osn_selenium/executors/trio_threads/cdp/cache_storage.py +79 -0
- osn_selenium/executors/trio_threads/cdp/cast.py +47 -0
- osn_selenium/executors/trio_threads/cdp/console.py +33 -0
- osn_selenium/executors/trio_threads/cdp/css.py +196 -0
- osn_selenium/executors/trio_threads/cdp/debugger.py +219 -0
- osn_selenium/executors/trio_threads/cdp/device_access.py +40 -0
- osn_selenium/executors/trio_threads/cdp/device_orientation.py +34 -0
- osn_selenium/executors/trio_threads/cdp/dom.py +319 -0
- osn_selenium/executors/trio_threads/cdp/dom_debugger.py +69 -0
- osn_selenium/executors/trio_threads/cdp/dom_snapshot.py +71 -0
- osn_selenium/executors/trio_threads/cdp/dom_storage.py +51 -0
- osn_selenium/executors/trio_threads/cdp/emulation.py +283 -0
- osn_selenium/executors/trio_threads/cdp/event_breakpoints.py +37 -0
- osn_selenium/executors/trio_threads/cdp/extensions.py +52 -0
- osn_selenium/executors/trio_threads/cdp/fed_cm.py +54 -0
- osn_selenium/executors/trio_threads/cdp/fetch.py +105 -0
- osn_selenium/executors/trio_threads/cdp/file_system.py +31 -0
- osn_selenium/executors/trio_threads/cdp/headless_experimental.py +54 -0
- osn_selenium/executors/trio_threads/cdp/heap_profiler.py +102 -0
- osn_selenium/executors/trio_threads/cdp/indexed_db.py +155 -0
- osn_selenium/executors/trio_threads/cdp/input.py +242 -0
- osn_selenium/executors/trio_threads/cdp/inspector.py +34 -0
- osn_selenium/executors/trio_threads/cdp/io.py +42 -0
- osn_selenium/executors/trio_threads/cdp/layer_tree.py +84 -0
- osn_selenium/executors/trio_threads/cdp/log.py +44 -0
- osn_selenium/executors/trio_threads/cdp/media.py +30 -0
- osn_selenium/executors/trio_threads/cdp/memory.py +71 -0
- osn_selenium/executors/trio_threads/cdp/network.py +296 -0
- osn_selenium/executors/trio_threads/cdp/overlay.py +183 -0
- osn_selenium/executors/trio_threads/cdp/page.py +374 -0
- osn_selenium/executors/trio_threads/cdp/performance.py +46 -0
- osn_selenium/executors/trio_threads/cdp/performance_timeline.py +36 -0
- osn_selenium/executors/trio_threads/cdp/preload.py +30 -0
- osn_selenium/executors/trio_threads/cdp/profiler.py +71 -0
- osn_selenium/executors/trio_threads/cdp/pwa.py +64 -0
- osn_selenium/executors/trio_threads/cdp/runtime.py +230 -0
- osn_selenium/executors/trio_threads/cdp/schema.py +32 -0
- osn_selenium/executors/trio_threads/cdp/security.py +43 -0
- osn_selenium/executors/trio_threads/cdp/service_worker.py +69 -0
- osn_selenium/executors/trio_threads/cdp/storage.py +162 -0
- osn_selenium/executors/trio_threads/cdp/system_info.py +43 -0
- osn_selenium/executors/trio_threads/cdp/target.py +156 -0
- osn_selenium/executors/trio_threads/cdp/tethering.py +34 -0
- osn_selenium/executors/trio_threads/cdp/tracing.py +71 -0
- osn_selenium/executors/trio_threads/cdp/web_audio.py +37 -0
- osn_selenium/executors/trio_threads/cdp/web_authn.py +95 -0
- osn_selenium/executors/trio_threads/cdp.py +104 -0
- osn_selenium/executors/trio_threads/javascript.py +90 -0
- osn_selenium/executors/unified/__init__.py +1 -0
- osn_selenium/executors/unified/cdp/__init__.py +1 -0
- osn_selenium/executors/unified/cdp/accessibility.py +81 -0
- osn_selenium/executors/unified/cdp/animation.py +50 -0
- osn_selenium/executors/unified/cdp/audits.py +45 -0
- osn_selenium/executors/unified/cdp/autofill.py +41 -0
- osn_selenium/executors/unified/cdp/background_service.py +24 -0
- osn_selenium/executors/unified/cdp/bluetooth_emulation.py +132 -0
- osn_selenium/executors/unified/cdp/browser.py +143 -0
- osn_selenium/executors/unified/cdp/cache_storage.py +69 -0
- osn_selenium/executors/unified/cdp/cast.py +32 -0
- osn_selenium/executors/unified/cdp/console.py +18 -0
- osn_selenium/executors/unified/cdp/css.py +237 -0
- osn_selenium/executors/unified/cdp/debugger.py +243 -0
- osn_selenium/executors/unified/cdp/device_access.py +21 -0
- osn_selenium/executors/unified/cdp/device_orientation.py +18 -0
- osn_selenium/executors/unified/cdp/dom.py +380 -0
- osn_selenium/executors/unified/cdp/dom_debugger.py +65 -0
- osn_selenium/executors/unified/cdp/dom_snapshot.py +58 -0
- osn_selenium/executors/unified/cdp/dom_storage.py +38 -0
- osn_selenium/executors/unified/cdp/emulation.py +312 -0
- osn_selenium/executors/unified/cdp/event_breakpoints.py +24 -0
- osn_selenium/executors/unified/cdp/extensions.py +45 -0
- osn_selenium/executors/unified/cdp/fed_cm.py +51 -0
- osn_selenium/executors/unified/cdp/fetch.py +111 -0
- osn_selenium/executors/unified/cdp/file_system.py +15 -0
- osn_selenium/executors/unified/cdp/headless_experimental.py +38 -0
- osn_selenium/executors/unified/cdp/heap_profiler.py +101 -0
- osn_selenium/executors/unified/cdp/indexed_db.py +157 -0
- osn_selenium/executors/unified/cdp/input.py +254 -0
- osn_selenium/executors/unified/cdp/inspector.py +15 -0
- osn_selenium/executors/unified/cdp/io.py +29 -0
- osn_selenium/executors/unified/cdp/layer_tree.py +71 -0
- osn_selenium/executors/unified/cdp/log.py +29 -0
- osn_selenium/executors/unified/cdp/media.py +15 -0
- osn_selenium/executors/unified/cdp/memory.py +59 -0
- osn_selenium/executors/unified/cdp/network.py +323 -0
- osn_selenium/executors/unified/cdp/overlay.py +209 -0
- osn_selenium/executors/unified/cdp/page.py +410 -0
- osn_selenium/executors/unified/cdp/performance.py +27 -0
- osn_selenium/executors/unified/cdp/performance_timeline.py +17 -0
- osn_selenium/executors/unified/cdp/preload.py +15 -0
- osn_selenium/executors/unified/cdp/profiler.py +55 -0
- osn_selenium/executors/unified/cdp/pwa.py +55 -0
- osn_selenium/executors/unified/cdp/runtime.py +245 -0
- osn_selenium/executors/unified/cdp/schema.py +17 -0
- osn_selenium/executors/unified/cdp/security.py +27 -0
- osn_selenium/executors/unified/cdp/service_worker.py +62 -0
- osn_selenium/executors/unified/cdp/storage.py +178 -0
- osn_selenium/executors/unified/cdp/system_info.py +24 -0
- osn_selenium/executors/unified/cdp/target.py +165 -0
- osn_selenium/executors/unified/cdp/tethering.py +15 -0
- osn_selenium/executors/unified/cdp/tracing.py +62 -0
- osn_selenium/executors/unified/cdp/web_audio.py +18 -0
- osn_selenium/executors/unified/cdp/web_authn.py +103 -0
- osn_selenium/executors/unified/javascript.py +104 -0
- osn_selenium/flags/__init__.py +1 -0
- osn_selenium/flags/_functions.py +45 -0
- osn_selenium/flags/_typehints.py +34 -0
- osn_selenium/flags/_validators.py +101 -0
- osn_selenium/{webdrivers/BaseDriver/flags.py → flags/base.py} +159 -245
- osn_selenium/{webdrivers/Blink/flags.py → flags/blink.py} +130 -374
- osn_selenium/flags/chrome.py +259 -0
- osn_selenium/flags/edge.py +259 -0
- osn_selenium/flags/models/__init__.py +1 -0
- osn_selenium/flags/models/base.py +130 -0
- osn_selenium/flags/models/blink.py +263 -0
- osn_selenium/{webdrivers/Chrome/flags.py → flags/models/chrome.py} +25 -75
- osn_selenium/{webdrivers/Edge/flags.py → flags/models/edge.py} +25 -75
- osn_selenium/flags/models/values.py +44 -0
- osn_selenium/{webdrivers/Yandex/flags.py → flags/models/yandex.py} +26 -76
- osn_selenium/flags/yandex.py +259 -0
- osn_selenium/instances/__init__.py +1 -0
- osn_selenium/instances/_functions.py +242 -0
- osn_selenium/instances/_typehints.py +148 -0
- osn_selenium/instances/_utils.py +143 -0
- osn_selenium/instances/convert.py +287 -0
- osn_selenium/instances/protocols.py +105 -0
- osn_selenium/instances/sync/__init__.py +1 -0
- osn_selenium/instances/sync/action_chains/__init__.py +32 -0
- osn_selenium/instances/sync/action_chains/base.py +74 -0
- osn_selenium/instances/sync/action_chains/click.py +61 -0
- osn_selenium/instances/sync/action_chains/drag_and_drop.py +45 -0
- osn_selenium/instances/sync/action_chains/hm_keyboard.py +37 -0
- osn_selenium/instances/sync/action_chains/hm_move.py +81 -0
- osn_selenium/instances/sync/action_chains/hm_scroll.py +60 -0
- osn_selenium/instances/sync/action_chains/keyboard.py +55 -0
- osn_selenium/instances/sync/action_chains/move.py +46 -0
- osn_selenium/instances/sync/action_chains/scroll.py +43 -0
- osn_selenium/instances/sync/action_chains/utils.py +30 -0
- osn_selenium/instances/sync/alert.py +69 -0
- osn_selenium/instances/sync/browser.py +72 -0
- osn_selenium/instances/sync/browsing_context.py +193 -0
- osn_selenium/instances/sync/dialog.py +81 -0
- osn_selenium/instances/sync/fedcm.py +92 -0
- osn_selenium/instances/sync/mobile.py +75 -0
- osn_selenium/instances/sync/network.py +90 -0
- osn_selenium/instances/sync/permissions.py +80 -0
- osn_selenium/instances/sync/script.py +77 -0
- osn_selenium/instances/sync/shadow_root.py +113 -0
- osn_selenium/instances/sync/storage.py +91 -0
- osn_selenium/instances/sync/switch_to.py +92 -0
- osn_selenium/instances/sync/web_driver_wait.py +83 -0
- osn_selenium/instances/sync/web_element.py +179 -0
- osn_selenium/instances/sync/web_extension.py +77 -0
- osn_selenium/instances/trio_threads/__init__.py +1 -0
- osn_selenium/instances/trio_threads/action_chains/__init__.py +32 -0
- osn_selenium/instances/trio_threads/action_chains/base.py +88 -0
- osn_selenium/instances/trio_threads/action_chains/click.py +71 -0
- osn_selenium/instances/trio_threads/action_chains/drag_and_drop.py +49 -0
- osn_selenium/instances/trio_threads/action_chains/hm_keyboard.py +41 -0
- osn_selenium/instances/trio_threads/action_chains/hm_move.py +91 -0
- osn_selenium/instances/trio_threads/action_chains/hm_scroll.py +66 -0
- osn_selenium/instances/trio_threads/action_chains/keyboard.py +63 -0
- osn_selenium/instances/trio_threads/action_chains/move.py +52 -0
- osn_selenium/instances/trio_threads/action_chains/scroll.py +49 -0
- osn_selenium/instances/trio_threads/action_chains/utils.py +32 -0
- osn_selenium/instances/trio_threads/alert.py +87 -0
- osn_selenium/instances/trio_threads/browser.py +90 -0
- osn_selenium/instances/trio_threads/browsing_context.py +216 -0
- osn_selenium/instances/trio_threads/dialog.py +99 -0
- osn_selenium/instances/trio_threads/fedcm.py +110 -0
- osn_selenium/instances/trio_threads/mobile.py +93 -0
- osn_selenium/instances/trio_threads/network.py +108 -0
- osn_selenium/instances/trio_threads/permissions.py +102 -0
- osn_selenium/instances/trio_threads/script.py +95 -0
- osn_selenium/instances/trio_threads/shadow_root.py +154 -0
- osn_selenium/instances/trio_threads/storage.py +109 -0
- osn_selenium/instances/trio_threads/switch_to.py +124 -0
- osn_selenium/instances/trio_threads/web_driver_wait.py +101 -0
- osn_selenium/instances/trio_threads/web_element.py +217 -0
- osn_selenium/instances/trio_threads/web_extension.py +99 -0
- osn_selenium/instances/unified/__init__.py +1 -0
- osn_selenium/instances/unified/action_chains/__init__.py +22 -0
- osn_selenium/instances/unified/action_chains/base.py +31 -0
- osn_selenium/instances/unified/action_chains/click.py +27 -0
- osn_selenium/instances/unified/action_chains/drag_and_drop.py +24 -0
- osn_selenium/instances/unified/action_chains/hm_keyboard.py +30 -0
- osn_selenium/instances/unified/action_chains/hm_move.py +66 -0
- osn_selenium/instances/unified/action_chains/hm_scroll.py +79 -0
- osn_selenium/instances/unified/action_chains/keyboard.py +24 -0
- osn_selenium/instances/unified/action_chains/move.py +24 -0
- osn_selenium/instances/unified/action_chains/scroll.py +21 -0
- osn_selenium/instances/unified/action_chains/utils.py +19 -0
- osn_selenium/instances/unified/alert.py +29 -0
- osn_selenium/instances/unified/browser.py +33 -0
- osn_selenium/instances/unified/browsing_context.py +151 -0
- osn_selenium/instances/unified/dialog.py +42 -0
- osn_selenium/instances/unified/fedcm.py +48 -0
- osn_selenium/instances/unified/mobile.py +36 -0
- osn_selenium/instances/unified/network.py +50 -0
- osn_selenium/instances/unified/permissions.py +43 -0
- osn_selenium/instances/unified/script.py +38 -0
- osn_selenium/instances/unified/shadow_root.py +46 -0
- osn_selenium/instances/unified/storage.py +48 -0
- osn_selenium/instances/unified/switch_to.py +49 -0
- osn_selenium/instances/unified/web_driver_wait.py +45 -0
- osn_selenium/instances/unified/web_element.py +145 -0
- osn_selenium/instances/unified/web_extension.py +38 -0
- osn_selenium/javascript/__init__.py +1 -0
- osn_selenium/javascript/_functions.py +63 -0
- osn_selenium/javascript/fingerprint/__init__.py +120 -0
- osn_selenium/javascript/fingerprint/_decorators.py +41 -0
- osn_selenium/javascript/fingerprint/_detect/__init__.py +1 -0
- osn_selenium/javascript/fingerprint/_detect/functions.py +253 -0
- osn_selenium/javascript/fingerprint/_detect/templates.py +128 -0
- osn_selenium/javascript/fingerprint/_functions.py +35 -0
- osn_selenium/javascript/fingerprint/_typehints.py +27 -0
- osn_selenium/javascript/fingerprint/registry/__init__.py +7 -0
- osn_selenium/javascript/fingerprint/registry/_core_functions.py +236 -0
- osn_selenium/javascript/fingerprint/registry/_functions.py +923 -0
- osn_selenium/javascript/fingerprint/registry/_typehints.py +6 -0
- osn_selenium/javascript/fingerprint/registry/_utils.py +6 -0
- osn_selenium/javascript/fingerprint/registry/models.py +41 -0
- osn_selenium/javascript/fingerprint/spoof/__init__.py +1 -0
- osn_selenium/javascript/fingerprint/spoof/_functions.py +172 -0
- osn_selenium/javascript/fingerprint/spoof/_templates.py +134 -0
- osn_selenium/javascript/fingerprint/spoof/_typehints.py +22 -0
- osn_selenium/javascript/fingerprint/spoof/core_rules.py +141 -0
- osn_selenium/javascript/fingerprint/spoof/noise.py +51 -0
- osn_selenium/javascript/fingerprint/spoof/rules.py +313 -0
- osn_selenium/javascript/functions.py +44 -0
- osn_selenium/javascript/models.py +35 -0
- osn_selenium/javascript/scripts/start_fingerprint_detection.js +56 -0
- osn_selenium/models.py +94 -0
- osn_selenium/trio_threads_mixin.py +159 -0
- osn_selenium/webdrivers/_args_helpers.py +181 -0
- osn_selenium/webdrivers/_bridges.py +57 -0
- osn_selenium/webdrivers/_decorators.py +83 -0
- osn_selenium/webdrivers/_executable_tables/__init__.py +1 -0
- osn_selenium/webdrivers/_executable_tables/functions.py +113 -0
- osn_selenium/webdrivers/_executable_tables/models.py +19 -0
- osn_selenium/webdrivers/_typehints.py +10 -0
- osn_selenium/webdrivers/protocols.py +50 -0
- osn_selenium/webdrivers/sync/__init__.py +1 -0
- osn_selenium/webdrivers/sync/blink/__init__.py +124 -0
- osn_selenium/webdrivers/sync/blink/base.py +140 -0
- osn_selenium/webdrivers/sync/blink/casting.py +34 -0
- osn_selenium/webdrivers/sync/blink/features.py +28 -0
- osn_selenium/webdrivers/sync/blink/lifecycle.py +66 -0
- osn_selenium/webdrivers/sync/blink/logging.py +25 -0
- osn_selenium/webdrivers/sync/blink/network.py +28 -0
- osn_selenium/webdrivers/sync/blink/settings.py +63 -0
- osn_selenium/webdrivers/sync/chrome/__init__.py +102 -0
- osn_selenium/webdrivers/sync/chrome/base.py +118 -0
- osn_selenium/webdrivers/sync/chrome/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/chrome/settings.py +58 -0
- osn_selenium/webdrivers/sync/core/__init__.py +100 -0
- osn_selenium/webdrivers/sync/core/actions.py +59 -0
- osn_selenium/webdrivers/sync/core/auth.py +77 -0
- osn_selenium/webdrivers/sync/core/base.py +175 -0
- osn_selenium/webdrivers/sync/core/capture.py +37 -0
- osn_selenium/webdrivers/sync/core/comonents.py +57 -0
- osn_selenium/webdrivers/sync/core/devtools.py +47 -0
- osn_selenium/webdrivers/sync/core/element.py +42 -0
- osn_selenium/webdrivers/sync/core/file.py +40 -0
- osn_selenium/webdrivers/sync/core/lifecycle.py +59 -0
- osn_selenium/webdrivers/sync/core/navigation.py +36 -0
- osn_selenium/webdrivers/sync/core/script.py +53 -0
- osn_selenium/webdrivers/sync/core/settings.py +35 -0
- osn_selenium/webdrivers/sync/core/storage.py +48 -0
- osn_selenium/webdrivers/sync/core/timeouts.py +59 -0
- osn_selenium/webdrivers/sync/core/window.py +99 -0
- osn_selenium/webdrivers/sync/edge/__init__.py +102 -0
- osn_selenium/webdrivers/sync/edge/base.py +114 -0
- osn_selenium/webdrivers/sync/edge/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/edge/settings.py +58 -0
- osn_selenium/webdrivers/sync/yandex/__init__.py +102 -0
- osn_selenium/webdrivers/sync/yandex/base.py +111 -0
- osn_selenium/webdrivers/sync/yandex/lifecycle.py +63 -0
- osn_selenium/webdrivers/sync/yandex/settings.py +58 -0
- osn_selenium/webdrivers/trio_threads/__init__.py +1 -0
- osn_selenium/webdrivers/trio_threads/blink/__init__.py +134 -0
- osn_selenium/webdrivers/trio_threads/blink/base.py +143 -0
- osn_selenium/webdrivers/trio_threads/blink/casting.py +35 -0
- osn_selenium/webdrivers/trio_threads/blink/features.py +29 -0
- osn_selenium/webdrivers/trio_threads/blink/lifecycle.py +66 -0
- osn_selenium/webdrivers/trio_threads/blink/logging.py +26 -0
- osn_selenium/webdrivers/trio_threads/blink/network.py +29 -0
- osn_selenium/webdrivers/trio_threads/blink/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/chrome/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/chrome/base.py +119 -0
- osn_selenium/webdrivers/trio_threads/chrome/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/chrome/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/core/__init__.py +115 -0
- osn_selenium/webdrivers/trio_threads/core/actions.py +72 -0
- osn_selenium/webdrivers/trio_threads/core/auth.py +88 -0
- osn_selenium/webdrivers/trio_threads/core/base.py +199 -0
- osn_selenium/webdrivers/trio_threads/core/capture.py +38 -0
- osn_selenium/webdrivers/trio_threads/core/comonents.py +92 -0
- osn_selenium/webdrivers/trio_threads/core/devtools.py +53 -0
- osn_selenium/webdrivers/trio_threads/core/element.py +58 -0
- osn_selenium/webdrivers/trio_threads/core/file.py +45 -0
- osn_selenium/webdrivers/trio_threads/core/lifecycle.py +60 -0
- osn_selenium/webdrivers/trio_threads/core/navigation.py +41 -0
- osn_selenium/webdrivers/trio_threads/core/script.py +59 -0
- osn_selenium/webdrivers/trio_threads/core/settings.py +36 -0
- osn_selenium/webdrivers/trio_threads/core/storage.py +54 -0
- osn_selenium/webdrivers/trio_threads/core/timeouts.py +60 -0
- osn_selenium/webdrivers/trio_threads/core/window.py +105 -0
- osn_selenium/webdrivers/trio_threads/edge/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/edge/base.py +115 -0
- osn_selenium/webdrivers/trio_threads/edge/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/edge/settings.py +63 -0
- osn_selenium/webdrivers/trio_threads/yandex/__init__.py +114 -0
- osn_selenium/webdrivers/trio_threads/yandex/base.py +112 -0
- osn_selenium/webdrivers/trio_threads/yandex/lifecycle.py +63 -0
- osn_selenium/webdrivers/trio_threads/yandex/settings.py +63 -0
- osn_selenium/webdrivers/unified/__init__.py +1 -0
- osn_selenium/webdrivers/unified/blink/__init__.py +1 -0
- osn_selenium/webdrivers/unified/blink/base.py +135 -0
- osn_selenium/webdrivers/unified/blink/casting.py +30 -0
- osn_selenium/webdrivers/unified/blink/features.py +22 -0
- osn_selenium/webdrivers/unified/blink/lifecycle.py +114 -0
- osn_selenium/webdrivers/unified/blink/logging.py +18 -0
- osn_selenium/webdrivers/unified/blink/network.py +22 -0
- osn_selenium/webdrivers/unified/blink/settings.py +86 -0
- osn_selenium/webdrivers/unified/chrome/__init__.py +1 -0
- osn_selenium/webdrivers/unified/chrome/base.py +58 -0
- osn_selenium/webdrivers/unified/chrome/lifecycle.py +88 -0
- osn_selenium/webdrivers/unified/chrome/settings.py +48 -0
- osn_selenium/webdrivers/unified/core/__init__.py +1 -0
- osn_selenium/webdrivers/unified/core/actions.py +43 -0
- osn_selenium/webdrivers/unified/core/auth.py +70 -0
- osn_selenium/webdrivers/unified/core/base.py +139 -0
- osn_selenium/webdrivers/unified/core/capture.py +32 -0
- osn_selenium/webdrivers/unified/core/components.py +32 -0
- osn_selenium/webdrivers/unified/core/devtools.py +35 -0
- osn_selenium/webdrivers/unified/core/element.py +24 -0
- osn_selenium/webdrivers/unified/core/file.py +35 -0
- osn_selenium/webdrivers/unified/core/lifecycle.py +84 -0
- osn_selenium/webdrivers/unified/core/navigation.py +31 -0
- osn_selenium/webdrivers/unified/core/script.py +32 -0
- osn_selenium/webdrivers/unified/core/settings.py +44 -0
- osn_selenium/webdrivers/unified/core/storage.py +37 -0
- osn_selenium/webdrivers/unified/core/timeouts.py +56 -0
- osn_selenium/webdrivers/unified/core/window.py +135 -0
- osn_selenium/webdrivers/unified/edge/__init__.py +1 -0
- osn_selenium/webdrivers/unified/edge/base.py +56 -0
- osn_selenium/webdrivers/unified/edge/lifecycle.py +88 -0
- osn_selenium/webdrivers/unified/edge/settings.py +48 -0
- osn_selenium/webdrivers/unified/yandex/__init__.py +1 -0
- osn_selenium/webdrivers/unified/yandex/base.py +58 -0
- osn_selenium/webdrivers/unified/yandex/lifecycle.py +58 -0
- osn_selenium/webdrivers/unified/yandex/settings.py +48 -0
- osn_selenium-1.1.0.dist-info/METADATA +252 -0
- osn_selenium-1.1.0.dist-info/RECORD +615 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/WHEEL +1 -1
- osn_selenium/captcha_workers/__init__.py +0 -26
- osn_selenium/dev_tools/_types.py +0 -22
- osn_selenium/dev_tools/errors.py +0 -89
- osn_selenium/dev_tools/logger.py +0 -558
- osn_selenium/dev_tools/manager.py +0 -1551
- osn_selenium/dev_tools/utils.py +0 -509
- osn_selenium/errors.py +0 -16
- osn_selenium/types.py +0 -118
- osn_selenium/webdrivers/BaseDriver/_utils.py +0 -37
- osn_selenium/webdrivers/BaseDriver/protocols.py +0 -2135
- osn_selenium/webdrivers/BaseDriver/trio_wrapper.py +0 -71
- osn_selenium/webdrivers/BaseDriver/webdriver.py +0 -2626
- osn_selenium/webdrivers/Blink/protocols.py +0 -330
- osn_selenium/webdrivers/Blink/webdriver.py +0 -637
- osn_selenium/webdrivers/Chrome/protocols.py +0 -228
- osn_selenium/webdrivers/Chrome/webdriver.py +0 -394
- osn_selenium/webdrivers/Edge/protocols.py +0 -228
- osn_selenium/webdrivers/Edge/webdriver.py +0 -394
- osn_selenium/webdrivers/Yandex/protocols.py +0 -211
- osn_selenium/webdrivers/Yandex/webdriver.py +0 -350
- osn_selenium/webdrivers/_functions.py +0 -504
- osn_selenium/webdrivers/types.py +0 -390
- osn_selenium-0.0.0.dist-info/METADATA +0 -710
- osn_selenium-0.0.0.dist-info/RECORD +0 -57
- /osn_selenium/{webdrivers/BaseDriver → abstract}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Blink → abstract/executors}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Chrome → abstract/instances}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Edge → abstract/webdriver}/__init__.py +0 -0
- /osn_selenium/{webdrivers/Yandex → dev_tools/logger}/__init__.py +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/check_element_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_document_scroll_size.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_css.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_element_rect_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_random_element_point_in_viewport.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_position.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_rect.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/get_viewport_size.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/open_new_tab.js +0 -0
- /osn_selenium/{webdrivers/js_scripts → javascript/scripts}/stop_window_loading.js +0 -0
- {osn_selenium-0.0.0.dist-info → osn_selenium-1.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from abc import abstractmethod
|
|
3
|
+
from osn_selenium.models import WindowRect
|
|
4
|
+
from osn_selenium._typehints import PATH_TYPEHINT
|
|
5
|
+
from osn_selenium.flags.models.yandex import YandexFlags
|
|
6
|
+
from osn_selenium.abstract.webdriver.chrome.settings import (
|
|
7
|
+
AbstractChromeSettingsMixin
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
__all__ = ["AbstractYandexSettingsMixin"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class AbstractYandexSettingsMixin(AbstractChromeSettingsMixin):
|
|
15
|
+
"""
|
|
16
|
+
Abstract mixin for managing Yandex browser settings.
|
|
17
|
+
|
|
18
|
+
Provides methods to update or reset configuration parameters such as flags,
|
|
19
|
+
executable paths, and window dimensions for the Yandex WebDriver.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def reset_settings(
|
|
24
|
+
self,
|
|
25
|
+
flags: Optional[YandexFlags] = None,
|
|
26
|
+
browser_exe: Optional[PATH_TYPEHINT] = None,
|
|
27
|
+
browser_name_in_system: Optional[str] = None,
|
|
28
|
+
use_browser_exe: Optional[bool] = None,
|
|
29
|
+
start_page_url: str = "",
|
|
30
|
+
window_rect: Optional[WindowRect] = None,
|
|
31
|
+
):
|
|
32
|
+
"""
|
|
33
|
+
Resets various configurable browser settings to their specified or default values.
|
|
34
|
+
|
|
35
|
+
This method allows for reconfiguring the WebDriver's operational parameters,
|
|
36
|
+
such as browser flags, executable path, start URL, window dimensions, and
|
|
37
|
+
concurrency limits. It is crucial that the browser session is *not* active
|
|
38
|
+
when this method is called; otherwise, a warning will be issued, and no changes
|
|
39
|
+
will be applied.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
flags (Optional[YandexFlags]): New browser flags to apply.
|
|
43
|
+
If provided, existing flags are cleared and replaced with these.
|
|
44
|
+
If `None`, all custom flags are cleared, and the browser will start with default flags.
|
|
45
|
+
browser_exe (Optional[PATH_TYPEHINT]): The explicit path to the browser executable.
|
|
46
|
+
If provided, this path will be used. If `None`, the executable path managed by the
|
|
47
|
+
flags manager will be cleared, and then potentially re-detected based on
|
|
48
|
+
`use_browser_exe` and `browser_name_in_system`.
|
|
49
|
+
browser_name_in_system (Optional[str]): The common name of the browser (e.g., "Yandex").
|
|
50
|
+
Used in conjunction with `use_browser_exe` to automatically detect the browser executable path.
|
|
51
|
+
This parameter only takes effect if `use_browser_exe` is explicitly `True` or `False`.
|
|
52
|
+
If `None`, no automatic detection based on name will occur through this method call.
|
|
53
|
+
use_browser_exe (Optional[bool]): Controls the automatic detection of the browser executable.
|
|
54
|
+
If `True` (and `browser_name_in_system` is provided), the browser executable path
|
|
55
|
+
will be automatically detected if `browser_exe` is `None`.
|
|
56
|
+
If `False` (and `browser_name_in_system` is provided), any existing `browser_exe`
|
|
57
|
+
path in the flags manager will be cleared.
|
|
58
|
+
If `None`, the current `use_browser_exe` state is maintained for the `_detect_browser_exe` logic.
|
|
59
|
+
start_page_url (str): The URL that the browser will attempt to navigate to
|
|
60
|
+
immediately after starting. Defaults to an empty string.
|
|
61
|
+
window_rect (Optional[WindowRect]): The initial window size and position settings.
|
|
62
|
+
If `None`, it defaults to a new `WindowRect()` instance, effectively resetting
|
|
63
|
+
to the browser's default window behavior.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
...
|
|
67
|
+
|
|
68
|
+
@abstractmethod
|
|
69
|
+
def update_settings(
|
|
70
|
+
self,
|
|
71
|
+
flags: Optional[YandexFlags] = None,
|
|
72
|
+
browser_exe: Optional[PATH_TYPEHINT] = None,
|
|
73
|
+
browser_name_in_system: Optional[str] = None,
|
|
74
|
+
use_browser_exe: Optional[bool] = None,
|
|
75
|
+
start_page_url: Optional[str] = None,
|
|
76
|
+
window_rect: Optional[WindowRect] = None,
|
|
77
|
+
):
|
|
78
|
+
"""
|
|
79
|
+
Updates various browser settings selectively without resetting others.
|
|
80
|
+
|
|
81
|
+
This method allows for dynamic updating of browser settings. Only the settings
|
|
82
|
+
for which a non-None value is provided will be updated. Settings passed as `None`
|
|
83
|
+
will retain their current values. This method can be called whether the browser
|
|
84
|
+
is active or not, but some changes might only take effect after the browser is
|
|
85
|
+
restarted.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
flags (Optional[YandexFlags]): New browser flags to update.
|
|
89
|
+
If provided, these flags will be merged with or overwrite existing flags
|
|
90
|
+
within the flags manager. If `None`, existing flags remain unchanged.
|
|
91
|
+
browser_exe (Optional[PATH_TYPEHINT]): The new path to the browser executable.
|
|
92
|
+
If provided, this path will be set in the flags manager. If `None`, the
|
|
93
|
+
current browser executable path remains unchanged.
|
|
94
|
+
browser_name_in_system (Optional[str]): The common name of the browser (e.g., "Yandex").
|
|
95
|
+
Used in conjunction with `use_browser_exe` to automatically detect the browser executable path.
|
|
96
|
+
This parameter only takes effect if `use_browser_exe` is explicitly provided.
|
|
97
|
+
If `None`, no automatic detection based on name will occur through this method call.
|
|
98
|
+
use_browser_exe (Optional[bool]): Controls the automatic detection of the browser executable.
|
|
99
|
+
If `True` (and `browser_name_in_system` is provided), the browser executable path
|
|
100
|
+
will be automatically detected if `browser_exe` is `None`.
|
|
101
|
+
If `False` (and `browser_name_in_system` is provided), any existing `browser_exe`
|
|
102
|
+
path in the flags manager will be cleared.
|
|
103
|
+
If `None`, the current `use_browser_exe` state is maintained for the `_detect_browser_exe` logic.
|
|
104
|
+
start_page_url (Optional[str]): The new URL that the browser will attempt to navigate to
|
|
105
|
+
immediately after starting. If `None`, the current start page URL remains unchanged.
|
|
106
|
+
window_rect (Optional[WindowRect]): The new window size and position settings.
|
|
107
|
+
If `None`, the current window rectangle settings remain unchanged.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
...
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import trio
|
|
3
|
+
from contextlib import asynccontextmanager
|
|
4
|
+
from typing import (
|
|
5
|
+
Any,
|
|
6
|
+
AsyncContextManager,
|
|
7
|
+
AsyncIterator,
|
|
8
|
+
Callable,
|
|
9
|
+
ContextManager,
|
|
10
|
+
Coroutine,
|
|
11
|
+
ParamSpec,
|
|
12
|
+
TypeVar
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = ["TrioThreadMixin"]
|
|
17
|
+
|
|
18
|
+
_METHOD_INPUT = ParamSpec("_METHOD_INPUT")
|
|
19
|
+
_METHOD_OUTPUT = TypeVar("_METHOD_OUTPUT")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TrioThreadMixin:
|
|
23
|
+
"""
|
|
24
|
+
Provides utilities for running synchronous functions in a Trio event loop
|
|
25
|
+
with a controlled concurrency, ensuring thread safety and resource limits.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
_lock (trio.Lock): A Trio Lock to ensure exclusive access for certain operations.
|
|
29
|
+
_capacity_limiter (trio.CapacityLimiter): A Trio CapacityLimiter to control the number
|
|
30
|
+
of concurrent synchronous operations.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, lock: trio.Lock, limiter: trio.CapacityLimiter) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Initializes the TrioThreadMixin with a Trio Lock and CapacityLimiter.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
lock (trio.Lock): A Trio Lock for synchronization.
|
|
39
|
+
limiter (trio.CapacityLimiter): A limiter to control thread pool concurrency.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
self._lock = lock
|
|
43
|
+
self._capacity_limiter = limiter
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def capacity_limiter(self) -> trio.CapacityLimiter:
|
|
47
|
+
"""
|
|
48
|
+
The Trio CapacityLimiter used for concurrency control.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
trio.CapacityLimiter: The limiter instance.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
return self._capacity_limiter
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def lock(self) -> trio.Lock:
|
|
58
|
+
"""
|
|
59
|
+
The Trio Lock used for synchronization.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
trio.Lock: The lock instance.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
return self._lock
|
|
66
|
+
|
|
67
|
+
def sync_to_trio(self, sync_function: Callable[_METHOD_INPUT, _METHOD_OUTPUT]) -> Callable[_METHOD_INPUT, Coroutine[Any, Any, _METHOD_OUTPUT]]:
|
|
68
|
+
"""
|
|
69
|
+
Wraps a synchronous function to run within a Trio thread pool using a lock and limiter.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
sync_function (Callable[_METHOD_INPUT, _METHOD_OUTPUT]): The synchronous function to wrap.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Callable[_METHOD_INPUT, Coroutine[Any, Any, _METHOD_OUTPUT]]: An async wrapper for the sync function.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
async def wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> _METHOD_OUTPUT:
|
|
79
|
+
def function_with_kwargs(*args_) -> _METHOD_OUTPUT:
|
|
80
|
+
return sync_function(*args_, **kwargs)
|
|
81
|
+
|
|
82
|
+
async with self._lock:
|
|
83
|
+
result = await trio.to_thread.run_sync(function_with_kwargs, *args, limiter=self._capacity_limiter)
|
|
84
|
+
|
|
85
|
+
return result
|
|
86
|
+
|
|
87
|
+
return wrapper
|
|
88
|
+
|
|
89
|
+
def sync_to_trio_context(
|
|
90
|
+
self,
|
|
91
|
+
context_manager_factory: Callable[_METHOD_INPUT, ContextManager[_METHOD_OUTPUT]]
|
|
92
|
+
) -> Callable[_METHOD_INPUT, AsyncContextManager[_METHOD_OUTPUT]]:
|
|
93
|
+
"""
|
|
94
|
+
Converts a synchronous context manager factory to an asynchronous Trio-compatible context manager.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
context_manager_factory (Callable[_METHOD_INPUT, ContextManager[_METHOD_OUTPUT]]): A factory function returning a context manager.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Callable[_METHOD_INPUT, AsyncContextManager[_METHOD_OUTPUT]]: An async function returning an async context manager.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
@asynccontextmanager
|
|
104
|
+
async def wrapper(*args: _METHOD_INPUT.args, **kwargs: _METHOD_INPUT.kwargs) -> AsyncIterator[_METHOD_OUTPUT]:
|
|
105
|
+
sync_context_manager = await self.sync_to_trio(sync_function=context_manager_factory)(*args, **kwargs)
|
|
106
|
+
|
|
107
|
+
enter_ = self.sync_to_trio(sync_function=sync_context_manager.__enter__)
|
|
108
|
+
exit_ = self.sync_to_trio(sync_function=sync_context_manager.__exit__)
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
result = await enter_()
|
|
112
|
+
|
|
113
|
+
yield result
|
|
114
|
+
except Exception as e:
|
|
115
|
+
exc_type, exc_val, exc_tb = sys.exc_info()
|
|
116
|
+
|
|
117
|
+
if not await exit_(exc_type, exc_val, exc_tb):
|
|
118
|
+
raise e
|
|
119
|
+
else:
|
|
120
|
+
await exit_(None, None, None)
|
|
121
|
+
|
|
122
|
+
return wrapper
|
|
@@ -1,33 +1,63 @@
|
|
|
1
1
|
import sys
|
|
2
2
|
import pathlib
|
|
3
|
-
from typing import Optional
|
|
4
|
-
from osn_selenium.
|
|
5
|
-
from osn_selenium.
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
from osn_selenium._typehints import PATH_TYPEHINT
|
|
5
|
+
from osn_selenium.browsers_handler.models import Browser
|
|
6
|
+
from osn_selenium.exceptions.platform import (
|
|
6
7
|
PlatformNotSupportedError
|
|
7
8
|
)
|
|
8
|
-
from osn_selenium.browsers_handler._windows import (
|
|
9
|
-
get_installed_browsers_win32
|
|
10
|
-
)
|
|
11
9
|
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
__all__ = [
|
|
12
|
+
"get_installed_browsers",
|
|
13
|
+
"get_path_to_browser",
|
|
14
|
+
"get_version_of_browser",
|
|
15
|
+
"get_version_of_driver"
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
if sys.platform == "win32":
|
|
19
|
+
from osn_selenium.browsers_handler._windows import (
|
|
20
|
+
get_installed_browsers as _platform_get_installed_browsers,
|
|
21
|
+
get_webdriver_version as _platform_get_webdriver_version
|
|
22
|
+
)
|
|
23
|
+
elif sys.platform == "linux":
|
|
24
|
+
from osn_selenium.browsers_handler._linux import (
|
|
25
|
+
get_installed_browsers as _platform_get_installed_browsers,
|
|
26
|
+
get_webdriver_version as _platform_get_webdriver_version
|
|
27
|
+
)
|
|
28
|
+
else:
|
|
29
|
+
raise PlatformNotSupportedError(platform=sys.platform)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_version_of_driver(driver_path: PATH_TYPEHINT) -> Optional[str]:
|
|
33
|
+
"""
|
|
34
|
+
Retrieves the version of a given webdriver executable based on the current platform.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
driver_path (PATH_TYPEHINT): The path to the webdriver executable.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Optional[str]: The version of the webdriver as a string, or None if not determined.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
return _platform_get_webdriver_version(driver_path=driver_path)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def get_installed_browsers() -> List[Browser]:
|
|
14
47
|
"""
|
|
15
|
-
Retrieves a
|
|
48
|
+
Retrieves a List of installed browsers on the system.
|
|
16
49
|
|
|
17
50
|
This function detects and lists the browsers installed on the operating system.
|
|
18
51
|
It supports different operating systems and uses platform-specific methods to find installed browsers.
|
|
19
52
|
|
|
20
53
|
Returns:
|
|
21
|
-
|
|
54
|
+
List[Browser]: A List of installed browsers. Each item in the List is a dictionary of type `Browser` containing information about the browser like name, version, and path.
|
|
22
55
|
|
|
23
56
|
Raises:
|
|
24
57
|
PlatformNotSupportedError: If the operating system is not supported.
|
|
25
58
|
"""
|
|
26
59
|
|
|
27
|
-
|
|
28
|
-
return get_installed_browsers_win32()
|
|
29
|
-
else:
|
|
30
|
-
raise PlatformNotSupportedError(sys.platform)
|
|
60
|
+
return _platform_get_installed_browsers()
|
|
31
61
|
|
|
32
62
|
|
|
33
63
|
def get_version_of_browser(browser_name: str) -> Optional[str]:
|
|
@@ -44,8 +74,8 @@ def get_version_of_browser(browser_name: str) -> Optional[str]:
|
|
|
44
74
|
"""
|
|
45
75
|
|
|
46
76
|
for browser in get_installed_browsers():
|
|
47
|
-
if browser
|
|
48
|
-
return browser
|
|
77
|
+
if browser.name == browser_name:
|
|
78
|
+
return browser.version
|
|
49
79
|
|
|
50
80
|
return None
|
|
51
81
|
|
|
@@ -64,7 +94,7 @@ def get_path_to_browser(browser_name: str) -> Optional[pathlib.Path]:
|
|
|
64
94
|
"""
|
|
65
95
|
|
|
66
96
|
for browser in get_installed_browsers():
|
|
67
|
-
if browser
|
|
68
|
-
return browser
|
|
97
|
+
if browser.name == browser_name:
|
|
98
|
+
return browser.path
|
|
69
99
|
|
|
70
100
|
return None
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
import glob
|
|
4
|
+
import shutil
|
|
5
|
+
import pathlib
|
|
6
|
+
import subprocess
|
|
7
|
+
from osn_selenium._typehints import PATH_TYPEHINT
|
|
8
|
+
from typing import (
|
|
9
|
+
List,
|
|
10
|
+
Optional,
|
|
11
|
+
Set,
|
|
12
|
+
Tuple
|
|
13
|
+
)
|
|
14
|
+
from osn_selenium.browsers_handler.models import Browser
|
|
15
|
+
from osn_selenium.exceptions.path import (
|
|
16
|
+
BrowserExecutableNotFoundError
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"get_browser_version",
|
|
22
|
+
"get_installed_browsers",
|
|
23
|
+
"get_webdriver_version"
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_process_version(executable_path: PATH_TYPEHINT) -> Optional[str]:
|
|
28
|
+
"""
|
|
29
|
+
Executes a process with the --version flag and extracts the version string.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
executable_path (PATH_TYPEHINT): The file system path to the executable.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Optional[str]: The extracted version string if successful, otherwise None.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
executable_path = pathlib.Path(executable_path)
|
|
39
|
+
|
|
40
|
+
if not executable_path.exists():
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
process = subprocess.Popen(
|
|
45
|
+
[str(executable_path), "--version"],
|
|
46
|
+
stdout=subprocess.PIPE,
|
|
47
|
+
stderr=subprocess.PIPE
|
|
48
|
+
)
|
|
49
|
+
stdout, stderr = process.communicate()
|
|
50
|
+
|
|
51
|
+
output = (stdout.decode("utf-8") + stderr.decode("utf-8")).strip()
|
|
52
|
+
|
|
53
|
+
match = re.search(r"(\d+(?:\.\d+)+)", output)
|
|
54
|
+
|
|
55
|
+
if match:
|
|
56
|
+
return match.group(1)
|
|
57
|
+
|
|
58
|
+
return None
|
|
59
|
+
except (Exception,):
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_webdriver_version(driver_path: PATH_TYPEHINT) -> Optional[str]:
|
|
64
|
+
"""
|
|
65
|
+
Retrieves the version string of a WebDriver executable.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
driver_path (PATH_TYPEHINT): The path to the WebDriver binary.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Optional[str]: The version string if found, otherwise None.
|
|
72
|
+
|
|
73
|
+
Raises:
|
|
74
|
+
BrowserExecutableNotFoundError: If the provided driver path does not exist.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
driver_path = pathlib.Path(driver_path)
|
|
78
|
+
|
|
79
|
+
if not driver_path.exists():
|
|
80
|
+
raise BrowserExecutableNotFoundError(path=driver_path)
|
|
81
|
+
|
|
82
|
+
version = _get_process_version(executable_path=driver_path)
|
|
83
|
+
|
|
84
|
+
if version:
|
|
85
|
+
return version
|
|
86
|
+
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def get_browser_version(browser_path: PATH_TYPEHINT) -> str:
|
|
91
|
+
"""
|
|
92
|
+
Retrieves the version string of a browser executable.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
browser_path (PATH_TYPEHINT): The path to the browser binary.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
str: The version string or 'unknown' if extraction fails.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
return _get_process_version(executable_path=browser_path) or "unknown"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _get_browser_from_binary(browser_name: str, binary_name: str, processed_paths: Set[pathlib.Path]) -> Optional[Tuple[Browser, pathlib.Path]]:
|
|
105
|
+
"""
|
|
106
|
+
Attempts to locate a browser binary and create a Browser model.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
browser_name (str): The display name of the browser.
|
|
110
|
+
binary_name (str): The command or path used to execute the browser.
|
|
111
|
+
processed_paths (Set[pathlib.Path]): A set of already identified paths to avoid duplicates.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Optional[Tuple[Browser, pathlib.Path]]: A tuple containing the Browser model and its resolved path.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
full_path = shutil.which(binary_name)
|
|
118
|
+
|
|
119
|
+
if full_path:
|
|
120
|
+
path_obj = pathlib.Path(full_path)
|
|
121
|
+
|
|
122
|
+
if path_obj in processed_paths:
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
version = get_browser_version(browser_path=path_obj)
|
|
126
|
+
|
|
127
|
+
browser = Browser(name=browser_name, path=path_obj, version=version)
|
|
128
|
+
|
|
129
|
+
return browser, path_obj
|
|
130
|
+
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def get_installed_browsers() -> List[Browser]:
|
|
135
|
+
"""
|
|
136
|
+
Scans the Linux system for installed web browsers.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
List[Browser]: A list of detected Browser instances.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
found_browsers: List[Browser] = []
|
|
143
|
+
processed_paths: Set[pathlib.Path] = set()
|
|
144
|
+
|
|
145
|
+
search_paths = [
|
|
146
|
+
"/usr/share/applications",
|
|
147
|
+
"/usr/local/share/applications",
|
|
148
|
+
os.path.expanduser("~/.local/share/applications")
|
|
149
|
+
]
|
|
150
|
+
|
|
151
|
+
for app_dir in search_paths:
|
|
152
|
+
if not os.path.exists(app_dir):
|
|
153
|
+
continue
|
|
154
|
+
|
|
155
|
+
for file_path in glob.glob(os.path.join(app_dir, "*.desktop")):
|
|
156
|
+
try:
|
|
157
|
+
with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
|
|
158
|
+
content = f.read()
|
|
159
|
+
|
|
160
|
+
if "WebBrowser" not in content:
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
name = None
|
|
164
|
+
exec_cmd = None
|
|
165
|
+
|
|
166
|
+
for line in content.splitlines():
|
|
167
|
+
if line.startswith("Name=") and not name:
|
|
168
|
+
name = line.split("=", 1)[1].strip()
|
|
169
|
+
|
|
170
|
+
if line.startswith("Exec=") and not exec_cmd:
|
|
171
|
+
raw_cmd = line.split("=", 1)[1].strip()
|
|
172
|
+
parts = raw_cmd.split()
|
|
173
|
+
|
|
174
|
+
if parts:
|
|
175
|
+
exec_cmd = parts[0].strip('"')
|
|
176
|
+
|
|
177
|
+
if name and exec_cmd:
|
|
178
|
+
result = _get_browser_from_binary(
|
|
179
|
+
browser_name=name,
|
|
180
|
+
binary_name=exec_cmd,
|
|
181
|
+
processed_paths=processed_paths
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if result is None:
|
|
185
|
+
continue
|
|
186
|
+
|
|
187
|
+
found_browser, path_obj = result
|
|
188
|
+
|
|
189
|
+
found_browsers.append(found_browser)
|
|
190
|
+
processed_paths.add(path_obj)
|
|
191
|
+
except (Exception,):
|
|
192
|
+
continue
|
|
193
|
+
|
|
194
|
+
for name, binaries in _STANDARD_BROWSERS_BINARIES.items():
|
|
195
|
+
for binary in binaries:
|
|
196
|
+
result = _get_browser_from_binary(browser_name=name, binary_name=binary, processed_paths=processed_paths)
|
|
197
|
+
|
|
198
|
+
if result is None:
|
|
199
|
+
continue
|
|
200
|
+
|
|
201
|
+
found_browser, path_obj = result
|
|
202
|
+
|
|
203
|
+
found_browsers.append(found_browser)
|
|
204
|
+
processed_paths.add(path_obj)
|
|
205
|
+
|
|
206
|
+
return found_browsers
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
_STANDARD_BROWSERS_BINARIES = {
|
|
210
|
+
"Google Chrome": [
|
|
211
|
+
"google-chrome",
|
|
212
|
+
"google-chrome-stable",
|
|
213
|
+
"google-chrome-beta",
|
|
214
|
+
"google-chrome-unstable",
|
|
215
|
+
"chrome"
|
|
216
|
+
],
|
|
217
|
+
"Chromium": ["chromium", "chromium-browser", "chromium-freeworld"],
|
|
218
|
+
"Microsoft Edge": [
|
|
219
|
+
"microsoft-edge",
|
|
220
|
+
"microsoft-edge-stable",
|
|
221
|
+
"microsoft-edge-beta",
|
|
222
|
+
"microsoft-edge-dev",
|
|
223
|
+
"microsoft-edge-canary"
|
|
224
|
+
],
|
|
225
|
+
"Yandex": ["yandex-browser", "yandex-browser-beta", "yandex_browser"]
|
|
226
|
+
}
|
|
@@ -2,8 +2,9 @@ import re
|
|
|
2
2
|
import winreg
|
|
3
3
|
import pathlib
|
|
4
4
|
import subprocess
|
|
5
|
-
from typing import
|
|
6
|
-
from osn_selenium.
|
|
5
|
+
from typing import List, Optional
|
|
6
|
+
from osn_selenium._typehints import PATH_TYPEHINT
|
|
7
|
+
from osn_selenium.browsers_handler.models import Browser
|
|
7
8
|
from win32api import (
|
|
8
9
|
GetFileVersionInfo,
|
|
9
10
|
HIWORD,
|
|
@@ -11,12 +12,19 @@ from win32api import (
|
|
|
11
12
|
)
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
__all__ = [
|
|
16
|
+
"get_browser_version",
|
|
17
|
+
"get_installed_browsers",
|
|
18
|
+
"get_webdriver_version"
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_webdriver_version(driver_path: PATH_TYPEHINT) -> Optional[str]:
|
|
15
23
|
"""
|
|
16
24
|
Retrieves the version of a given webdriver executable.
|
|
17
25
|
|
|
18
26
|
Args:
|
|
19
|
-
driver_path (
|
|
27
|
+
driver_path (PATH_TYPEHINT): The path to the webdriver executable. It can be a string or a Path object.
|
|
20
28
|
|
|
21
29
|
Returns:
|
|
22
30
|
Optional[str]: The version of the webdriver as a string, or None if the version cannot be determined.
|
|
@@ -26,8 +34,7 @@ def get_webdriver_version(driver_path: Union[pathlib.Path, str]) -> Optional[str
|
|
|
26
34
|
Exception: If there is an error executing the webdriver or parsing the output.
|
|
27
35
|
"""
|
|
28
36
|
|
|
29
|
-
|
|
30
|
-
driver_path = pathlib.Path(driver_path)
|
|
37
|
+
driver_path = pathlib.Path(driver_path)
|
|
31
38
|
|
|
32
39
|
if not driver_path.exists():
|
|
33
40
|
raise FileNotFoundError(f"{driver_path} not found.")
|
|
@@ -55,41 +62,41 @@ def get_webdriver_version(driver_path: Union[pathlib.Path, str]) -> Optional[str
|
|
|
55
62
|
raise e
|
|
56
63
|
|
|
57
64
|
|
|
58
|
-
def get_browser_version(browser_path:
|
|
65
|
+
def get_browser_version(browser_path: PATH_TYPEHINT) -> str:
|
|
59
66
|
"""
|
|
60
67
|
Retrieves the version of a browser given its file path.
|
|
61
68
|
|
|
62
69
|
This function uses the `GetFileVersionInfo` function from the `win32api` module to extract the browser's version information from the executable file.
|
|
63
70
|
|
|
64
71
|
Args:
|
|
65
|
-
browser_path (
|
|
72
|
+
browser_path (Path): The file path to the browser executable.
|
|
66
73
|
|
|
67
74
|
Returns:
|
|
68
75
|
str: The version of the browser as a string, or "unknown" if the file does not exist.
|
|
69
76
|
"""
|
|
70
77
|
|
|
71
|
-
|
|
72
|
-
browser_path = pathlib.Path(browser_path)
|
|
78
|
+
browser_path = pathlib.Path(browser_path)
|
|
73
79
|
|
|
74
80
|
if not browser_path.exists():
|
|
75
81
|
return "unknown"
|
|
76
82
|
|
|
77
83
|
info = GetFileVersionInfo(str(browser_path.resolve()), "\\")
|
|
84
|
+
|
|
78
85
|
ms = info["FileVersionMS"]
|
|
79
86
|
ls = info["FileVersionLS"]
|
|
80
87
|
|
|
81
88
|
return ".".join(map(str, (HIWORD(ms), LOWORD(ms), HIWORD(ls), LOWORD(ls))))
|
|
82
89
|
|
|
83
90
|
|
|
84
|
-
def
|
|
91
|
+
def get_installed_browsers() -> List[Browser]:
|
|
85
92
|
"""
|
|
86
|
-
Retrieves a
|
|
93
|
+
Retrieves a List of installed browsers on a Windows system by querying the registry.
|
|
87
94
|
|
|
88
95
|
This function iterates through different registry locations to identify installed browsers and their paths.
|
|
89
|
-
It constructs a
|
|
96
|
+
It constructs a List of unique `Browser` objects, each representing an installed browser.
|
|
90
97
|
|
|
91
98
|
Returns:
|
|
92
|
-
|
|
99
|
+
List[Browser]: A List of unique installed browsers.
|
|
93
100
|
"""
|
|
94
101
|
|
|
95
102
|
installed_browsers = []
|