2025, Oct 20 18:16

Как запустить распакованное расширение в Chrome через Selenium

Как запустить распакованное расширение в Chrome 137–138 через Selenium что мешает загрузке, флаг DisableLoadExtensionCommandLineSwitch и переход к Manifest V3.

Загрузка распакованного расширения Chrome с помощью Selenium в современных сборках браузера может неожиданно оказаться непростой задачей. Типичный симптом: браузер запускается без ошибок, целевая страница открывается, но расширение не появляется на панели и явно неактивно. Ниже — краткое объяснение, что происходит, и как добиться стабильной работы без догадок.

Воспроизведение проблемы

Следующий скрипт на Python запускает Chrome, указывает папку с распакованным расширением и открывает Google Maps. В Chrome 138.0.7204.100 (Ubuntu 24.04) расширение не появляется:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
ext_dir = 'Pano-fetch'
chr_opts = Options()
drv_svc = Service("/usr/bin/chromedriver")
chr_opts.add_argument('--load-extension={}'.format(ext_dir))
chr_opts.add_experimental_option("detach", True)
browser = webdriver.Chrome(service=drv_svc, options=chr_opts)
browser.get("https://www.google.com/maps")
time.sleep(10)

Что на самом деле блокирует расширение

В последних релизах Chrome есть два изменения, влияющих на этот сценарий. Во‑первых, начиная с Chrome 137, переключатель --load-extension по умолчанию отключён, пока вы явно не разрешите его специальным флагом. Во‑вторых, обновление Chrome 138 убрало поддержку расширений на Manifest V2. Если в вашей распакованной директории находится расширение V2, Chrome может просто отказать в его загрузке.

Первую преграду устранить легко. Вторая полностью зависит от самого расширения. Упомянутое в исходном контексте расширение последний раз обновлялось в 2018 году, что, вероятнее всего, означает Manifest V2 — и оно не загрузится в Chrome, где принудительно применяется V3. В такой ситуации нужно либо перейти на совместимое с Manifest V3 расширение, либо использовать сборку Chrome, где V2 ещё допускается, например через chrome-for-testing.

Рабочее решение и обновлённый пример

Сначала заново разрешите использование командного переключателя для распакованных расширений. Добавьте к настройкам Chrome следующий аргумент:

--disable-features=DisableLoadExtensionCommandLineSwitch

После этого остальной процесс остаётся прежним. Вот скорректированный скрипт:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
ext_dir = 'Pano-fetch'
chr_opts = Options()
drv_svc = Service("/usr/bin/chromedriver")
chr_opts.add_argument('--disable-features=DisableLoadExtensionCommandLineSwitch')
chr_opts.add_argument('--load-extension={}'.format(ext_dir))
chr_opts.add_experimental_option("detach", True)
browser = webdriver.Chrome(service=drv_svc, options=chr_opts)
browser.get("https://www.google.com/maps")
time.sleep(10)

Если после этого расширение всё равно не появляется, скорее всего вы столкнулись с отключением Manifest V2 в Chrome 138. Тогда используйте расширение, совместимое с Manifest V3. Либо выберите версию Chrome, где V2 ещё работает, установив нужную сборку через chrome-for-testing.

Почему это важно для автоматизации

Поддержка расширений — это вопрос и функциональности, и стабильности для сквозных тестов и пайплайнов парсинга. Одно обновление Chrome может незаметно сломать предположения о том, как загружаются распакованные расширения, или допустима ли старая версия манифеста вообще. Синхронизация тестовой среды с поведением релизов браузера — и понимание нужных переключателей — критичны, чтобы избежать нестабильных прогонов.

Когда выйдет Chrome 139, ситуация может измениться. Будьте готовы.

Также стоит отметить, что в одном из описанных окружений хватило только первого исправления, и расширение на Manifest V2 всё же загрузилось в текущей сборке Chrome. Ваш результат может отличаться в зависимости от конкретного релиза и состояния обновлений.

Выводы

Если распакованное расширение не отображается при запуске через Selenium в Chrome 137 и новее, сначала включите командный переключатель, добавив --disable-features=DisableLoadExtensionCommandLineSwitch. Если в Chrome 138 оно всё равно не загружается, предполагайте, что Manifest V2 не поддерживается, и переходите на совместимое с Manifest V3 расширение либо используйте версию Chrome, где V2 ещё работает, через chrome-for-testing. Следите за будущими релизами — поведение загрузки расширений может снова измениться.

Статья основана на вопросе с StackOverflow от Daniel AG и ответе Michael Mintz.