Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python3 | |
| # this module is part of undetected_chromedriver | |
| import json | |
| import os | |
| from selenium.webdriver.chromium.options import ChromiumOptions as _ChromiumOptions | |
| class ChromeOptions(_ChromiumOptions): | |
| _session = None | |
| _user_data_dir = None | |
| def user_data_dir(self): | |
| return self._user_data_dir | |
| def user_data_dir(self, path: str): | |
| """ | |
| Sets the browser profile folder to use, or creates a new profile | |
| at given <path>. | |
| Parameters | |
| ---------- | |
| path: str | |
| the path to a chrome profile folder | |
| if it does not exist, a new profile will be created at given location | |
| """ | |
| apath = os.path.abspath(path) | |
| self._user_data_dir = os.path.normpath(apath) | |
| def _undot_key(key, value): | |
| """turn a (dotted key, value) into a proper nested dict""" | |
| if "." in key: | |
| key, rest = key.split(".", 1) | |
| value = ChromeOptions._undot_key(rest, value) | |
| return {key: value} | |
| def _merge_nested(a, b): | |
| """ | |
| merges b into a | |
| leaf values in a are overwritten with values from b | |
| """ | |
| for key in b: | |
| if key in a: | |
| if isinstance(a[key], dict) and isinstance(b[key], dict): | |
| ChromeOptions._merge_nested(a[key], b[key]) | |
| continue | |
| a[key] = b[key] | |
| return a | |
| def handle_prefs(self, user_data_dir): | |
| prefs = self.experimental_options.get("prefs") | |
| if prefs: | |
| user_data_dir = user_data_dir or self._user_data_dir | |
| default_path = os.path.join(user_data_dir, "Default") | |
| os.makedirs(default_path, exist_ok=True) | |
| # undot prefs dict keys | |
| undot_prefs = {} | |
| for key, value in prefs.items(): | |
| undot_prefs = self._merge_nested( | |
| undot_prefs, self._undot_key(key, value) | |
| ) | |
| prefs_file = os.path.join(default_path, "Preferences") | |
| if os.path.exists(prefs_file): | |
| with open(prefs_file, encoding="latin1", mode="r") as f: | |
| undot_prefs = self._merge_nested(json.load(f), undot_prefs) | |
| with open(prefs_file, encoding="latin1", mode="w") as f: | |
| json.dump(undot_prefs, f) | |
| # remove the experimental_options to avoid an error | |
| del self._experimental_options["prefs"] | |
| def from_options(cls, options): | |
| o = cls() | |
| o.__dict__.update(options.__dict__) | |
| return o | |