Идеальное решение для драйвера Chrome версии 115 и более поздних версий.
Идеальное решение для драйвера Chrome версии 115 и более поздних версий.

фон

При использовании селена с браузером Chrome для автоматизации,нуждаться Конфигурацияchromedriver Для управления браузером, поскольку браузер Chrome был обновлен до версии 115, последняя версия драйвера, предоставленная по ранее указанному адресу загрузки или обычно используемому изображению Taobao в Китае, — 114.

версия драйвера chromedriver до 114

После недолгих поисков я нашел адрес загрузки драйверов версии 115 и новее следующим образом:

версия драйвера chromedriver после 115

Ручная настройка

Проверьте версию Chrome

  • Введите chrome://version в адресную строку
  • Загрузите драйвер и задайте переменную среды Конфигурация или напрямую пропишите путь к загруженному драйверу при запуске Chrome.

автоматическая конфигурация

Введение в вебдрайвер-менеджер

  • webdriver-manage — это веб-страница Автоматизированное Кстати, программа управления драйверами «Установить» может реализовать автоматическое управление драйверами браузера с помощью простой конфигурации.
  • Адрес документа:https://pypi.org/project/webdriver-manager/

Установить

Язык кода:python
кодКоличество запусков:0
копировать
pip install webdriver-manager -U
  • Версия webdriver-manager должна быть выше 4.0.0.

Конфигурация

selenium 3.x
Язык кода:python
кодКоличество запусков:0
копировать
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
selenium 4.x
Язык кода:python
кодКоличество запусков:0
копировать
# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

принцип

Возьмем, к примеру, вождение браузера Chrome.,Прежде чем использовать webdriver_manager,Наш скрипт для запуска Chrome выглядит следующим образом,Вам необходимо самостоятельно указать путь к chromedriver или добавить Конфигурацию в переменную среды.

Язык кода:python
кодКоличество запусков:0
копировать
from selenium import webdriver
driver = webdriver.Chrome('/home/user/drivers/chromedriver')

После использованияwebdriver_manager нам нужно только заменить это предложение

Язык кода:python
кодКоличество запусков:0
копировать
driver = webdriver.Chrome(ChromeDriverManager().install())

очевидно ChromeDriverManager().install() вернулсяchromedriverпуть,Поэтому мы в основном смотрим наinstall()Реализация метода,Прочитав исходный код, я обнаружил, что общий процесс выглядит следующим образом:

  1. Получите операционную систему и номер версии Chrome компьютерного устройства, на котором выполняется сценарий.,Просмотр сопоставления папок кэшаdriver.jsonЕсть ли драйвер этой версии?,Если есть прямой обратный путь,Если нет, то скачайте
Язык кода:python
кодКоличество запусков:0
копировать
    def _get_driver_binary_path(self, driver):

        binary_path = self._cache_manager.find_driver(driver)
        if binary_path:
            return binary_path
        os_type = self.get_os_type()
        file = self._download_manager.download_file(driver.get_driver_download_url(os_type))
        binary_path = self._cache_manager.save_file_to_cache(driver, file)

        return binary_path
  1. Перейдите по соответствующему URL-адресу, чтобы загрузить драйвер chromewebdriver, соответствующий номеру версии Chrome соответствующей операционной системы.,существует в каталоге пользователя.wdm/drivers в папке,и создатьdriver.jsonСвязь между версией обслуживания файла и путем к драйверу,Если это ваш первый раз, используйте,Будут созданы соответствующие каталоги и файлы.
Язык кода:python
кодКоличество запусков:0
копировать
{

    "mac64_chromedriver_119.0.6045.0_for_119.0.6045": {

        "timestamp": "15/11/2023",

        "binary_path": "/Users/jack/.wdm/drivers/chromedriver/mac64/119.0.6045.0/chromedriver-mac-x64/chromedriver"

    }

}
  1. Возвращает адрес локального драйвераwebdriver.Chrome()середина

проблемы с сетью

Описание проблемы

При автоматической загрузке исходный код определяет, является ли версия Chrome после 115, а затем переходит к соответствующему URL-адресу для загрузки. Однако независимо от того, находится ли она до или после 115, все они являются внешними URL-адресами. При плохой сетевой среде. загрузка будет медленной и неудачной.

Язык кода:python
кодКоличество запусков:0
копировать
    def get_driver_download_url(self, os_type):
        driver_version_to_download = self.get_driver_version_to_download()
        # For Mac ARM CPUs after version 106.0.5249.61 the format of OS type changed
        # to more unified "mac_arm64". For newer versions, it'll be "mac_arm64"
        # by default, for lower versions we replace "mac_arm64" to old format - "mac64_m1".
        if version.parse(driver_version_to_download) < version.parse("106.0.5249.61"):
            os_type = os_type.replace("mac_arm64", "mac64_m1")

        if version.parse(driver_version_to_download) >= version.parse("115"):
            if os_type == "mac64":
                os_type = "mac-x64"
            if os_type in ["mac_64", "mac64_m1", "mac_arm64"]:
                os_type = "mac-arm64"

            modern_version_url = self.get_url_for_version_and_platform(driver_version_to_download, os_type)
            log(f"Modern chrome version {modern_version_url}")
            return modern_version_url

        return f"{self._url}/{driver_version_to_download}/{self.get_name()}_{os_type}.zip"
Решение

После понимания описанного выше процесса нам нужно только переписать соответствующие методы и классы и заменить их вышеупомянутыми внутренними зеркальными веб-сайтами.

  • Новыйext/webdriver_manage_extend.pyдокумент,Напишите следующий контент
Язык кода:python
кодКоличество запусков:0
копировать
import os
from typing import Optional
from packaging import version
from webdriver_manager.core.logger import log

from webdriver_manager.core.download_manager import DownloadManager
from webdriver_manager.core.driver_cache import DriverCacheManager
from webdriver_manager.core.manager import DriverManager
from webdriver_manager.core.os_manager import OperationSystemManager, ChromeType
from webdriver_manager.drivers.chrome import ChromeDriver


class ExtChromeDriver(ChromeDriver):
    def get_driver_download_url(self, os_type):
        driver_version_to_download = self.get_driver_version_to_download()
        # For Mac ARM CPUs after version 106.0.5249.61 the format of OS type changed
        # to more unified "mac_arm64". For newer versions, it'll be "mac_arm64"
        # by default, for lower versions we replace "mac_arm64" to old format - "mac64_m1".
        if version.parse(driver_version_to_download) < version.parse("106.0.5249.61"):
            os_type = os_type.replace("mac_arm64", "mac64_m1")

        if version.parse(driver_version_to_download) >= version.parse("115"):
            if os_type == "mac64":
                os_type = "mac-x64"
            if os_type in ["mac_64", "mac64_m1", "mac_arm64"]:
                os_type = "mac-arm64"

            modern_version_url = self.get_url_for_version_and_platform(driver_version_to_download, os_type)
            log(f"Modern chrome version {modern_version_url}")
            return modern_version_url

        return f"{self._url}/{driver_version_to_download}/{self.get_name()}_{os_type}.zip"

    def get_browser_type(self):
        return self._browser_type

    def get_latest_release_version(self):
        determined_browser_version = self.get_browser_version_from_os()
        log(f"Get LATEST {self._name} version for {self._browser_type}")
        if determined_browser_version is not None and version.parse(determined_browser_version) >= version.parse("115"):
            url = "https://registry.npmmirror.com/-/binary/chrome-for-testing"
            response = self._http_client.get(url)
            response_list = response.json()
            determined_browser_version = self.get_version_form_net(determined_browser_version, response_list)
            if determined_browser_version.endswith("/"):
                determined_browser_version = determined_browser_version[:-1]
            return determined_browser_version
            # Remove the build version (the last segment) from determined_browser_version for version < 113
        determined_browser_version = ".".join(determined_browser_version.split(".")[:3])
        latest_release_url = (
            self._latest_release_url
            if (determined_browser_version is None)
            else f"{self._latest_release_url}_{determined_browser_version}"
        )
        resp = self._http_client.get(url=latest_release_url)
        return resp.text.rstrip()

    def get_version_form_net(self, os_version, net_versions):
        for v in net_versions:
            if os_version in v["name"]:
                return v["name"]
        raise Exception(f"No such driver version {os_version} for {self._browser_type}")

    def get_url_for_version_and_platform(self, browser_version, platform):
        base_url = f"https://registry.npmmirror.com/-/binary/chrome-for-testing/{browser_version}/"

        platform_path_map = {
            'linux64': 'linux64/chromedriver-linux64.zip',
            'mac-x64': 'mac-x64/chromedriver-mac-x64.zip',
            'mac-arm64': 'mac-arm64/chromedriver-mac-arm64.zip',
            'win32': 'win32/chromedriver-win32.zip',
            'win64': 'win64/chromedriver-win64.zip',
        }

        download_url = base_url + platform_path_map[platform]
        return download_url


class ChromeDriverManager(DriverManager):
    def __init__(
        self,
        driver_version: Optional[str] = None,
        name: str = "chromedriver",
        url: str = "https://registry.npmmirror.com/-/binary/chromedriver",
        latest_release_url: str = "https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE",
        chrome_type: str = ChromeType.GOOGLE,
        download_manager: Optional[DownloadManager] = None,
        cache_manager: Optional[DriverCacheManager] = None,
        os_system_manager: Optional[OperationSystemManager] = None

    ):
        super().__init__(
            download_manager=download_manager,
            cache_manager=cache_manager,
            os_system_manager=os_system_manager
        )

        self.driver = ExtChromeDriver(
            name=name,
            driver_version=driver_version,
            url=url,
            latest_release_url=latest_release_url,
            chrome_type=chrome_type,
            http_client=self.http_client,
            os_system_manager=os_system_manager
        )

    def install(self) -> str:
        driver_path = self._get_driver_binary_path(self.driver)
        os.chmod(driver_path, 0o755)
        return driver_path
  • Следующий метод заменяет адрес источника внутреннего зеркала.
Язык кода:python
кодКоличество запусков:0
копировать
    def get_url_for_version_and_platform(self, browser_version, platform):
        base_url = f"https://registry.npmmirror.com/-/binary/chrome-for-testing/{browser_version}/"

        platform_path_map = {
            'linux64': 'linux64/chromedriver-linux64.zip',
            'mac-x64': 'mac-x64/chromedriver-mac-x64.zip',
            'mac-arm64': 'mac-arm64/chromedriver-mac-arm64.zip',
            'win32': 'win32/chromedriver-win32.zip',
            'win64': 'win64/chromedriver-win64.zip',
        }

        download_url = base_url + platform_path_map[platform]
        return download_url
использовать
  • Замените путь импорта ChromeDriverManager нашим собственным расширением.
Язык кода:python
кодКоличество запусков:0
копировать
# selenium 3
from selenium import webdriver
from ext.webdriver_manage_extend import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
Язык кода:python
кодКоличество запусков:0
копировать
# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from ext.webdriver_manage_extend import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

driver.get('https://www.baidu.com')

Таким образом, независимо от того, какая у вас версия браузера Chrome и обновляется ли Chrome автоматически, файлами драйверов можно управлять автоматически без каких-либо проблем.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose