2025, Dec 28 00:02
Как запустить Chromium с нужным расширением в NoDriver (macOS ARM)
Как вернуть расширение при запуске Chromium через NoDriver: уберите --disable-extensions, не включайте инкогнито и загрузите его через --load-extension на macOS
Запуск Chromium в автоматическом режиме часто ведет себя иначе, чем при ручном старте. Частый сюрприз: расширение, которое остаётся включённым, когда вы открываете браузер вручную, пропадает при запуске Chromium из Python‑скрипта. Если сессия ещё и стартует в режиме инкогнито, разрыв становится ещё заметнее. Ниже — короткое объяснение, почему так происходит, и как запустить Chromium с нужным расширением при работе с NoDriver на macOS 64 ARM.
Как воспроизвести проблему
Следующий асинхронный фрагмент на Python запускает Chromium с набором флагов, которые непреднамеренно блокируют загрузку расширений и принудительно включают режим инкогнито. В итоге вкладка открывается без вашего расширения.
async def process_account(login_blob):
browser_session = None
provided_secret = None
secret_phrase = None
if ".com:" in login_blob:
login_blob, secret_phrase = login_blob.split(":", 1)
provided_secret = secret_phrase
try:
selected_proxy = None
if ENABLE_PROXIES and proxy_pool:
selected_proxy = random.choice(proxy_pool)
else:
print(f"{RED}Not using proxy {CLR}")
win_w = random.randint(1000, 1500)
win_h = random.randint(750, 950)
pos_x = random.randint(0, 500)
pos_y = random.randint(0, 500)
opts = [
f"--window-size={win_w},{win_h}",
f"--window-position={pos_x},{pos_y}",
"--disable-sync",
"--no-first-run",
"--no-default-browser-check",
"--disable-backgrounding-occluded-windows",
"--disable-renderer-backgrounding",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--disable-extensions",
"--incognito",
"--disable-dev-shm-usage",
]
if selected_proxy:
host, port, usern, passw = split_proxy_dsn(selected_proxy)
proxy_auth = [usern, passw]
proxy_url = f"http://{host}:{port}"
opts.append(f"--proxy-server={proxy_url}")
browser_session = await nd.start(
browser_executable_path=CHROME_BIN,
headless=HEADLESS_ON,
stealth=True,
browser_args=opts
)
bootstrap_tab = await browser_session.get("draft:,")
await apply_proxy_auth(proxy_auth[0], proxy_auth[1], bootstrap_tab)
page = await browser_session.get("https://www.target.com/")
await page.evaluate(
"""
() => {
localStorage.clear();
sessionStorage.clear();
}
"""
)
Что на самом деле происходит
Здесь сходятся три фактора. Во‑первых, режим инкогнито обычно по умолчанию отключает расширения. Во‑вторых, безголовые или автоматизированные сессии Chrome, как правило, не загружают расширения в инкогнито, если вы явно это не разрешили. В‑третьих, флаг --disable-extensions безусловно отключает все расширения. В совокупности эти параметры гарантируют, что при программном запуске Chromium ваше расширение не появится.
Решение
Практичный путь — перестать отключать расширения, не навязывать режим инкогнито, если нужно активное расширение, и явно подгрузить его с диска. Если вы хотите переиспользовать профиль, где расширение уже настроено, укажите Chromium путь к каталогу этого профиля.
async def process_account(login_blob):
browser_session = None
provided_secret = None
secret_phrase = None
if ".com:" in login_blob:
login_blob, secret_phrase = login_blob.split(":", 1)
provided_secret = secret_phrase
try:
selected_proxy = None
if ENABLE_PROXIES and proxy_pool:
selected_proxy = random.choice(proxy_pool)
else:
print(f"{RED}Not using proxy {CLR}")
win_w = random.randint(1000, 1500)
win_h = random.randint(750, 950)
pos_x = random.randint(0, 500)
pos_y = random.randint(0, 500)
ext_path = "/Users/<user>/Library/Application Support/Chromium/Default/Extensions/pgojnojmmhpofjgdmaebadhbocahppod/1.16.0_0"
# При желании можно переиспользовать существующий профиль с настроенными расширениями:
# profile_dir = "/Users/<user>/Library/Application Support/Chromium"
opts = [
f"--window-size={win_w},{win_h}",
f"--window-position={pos_x},{pos_y}",
"--disable-sync",
"--no-first-run",
"--no-default-browser-check",
"--disable-backgrounding-occluded-windows",
"--disable-renderer-backgrounding",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--disable-dev-shm-usage",
f"--load-extension={ext_path}",
# f"--user-data-dir={profile_dir}",
]
if selected_proxy:
host, port, usern, passw = split_proxy_dsn(selected_proxy)
proxy_auth = [usern, passw]
proxy_url = f"http://{host}:{port}"
opts.append(f"--proxy-server={proxy_url}")
browser_session = await nd.start(
browser_executable_path=CHROME_BIN,
headless=HEADLESS_ON,
stealth=True,
browser_args=opts
)
bootstrap_tab = await browser_session.get("draft:,")
await apply_proxy_auth(proxy_auth[0], proxy_auth[1], bootstrap_tab)
page = await browser_session.get("https://www.target.com/")
await page.evaluate(
"""
() => {
localStorage.clear();
sessionStorage.clear();
}
"""
)
Ключевые изменения просты. Не передавайте --disable-extensions. Не включайте принудительно --incognito, если ожидаете активное расширение. Укажите путь к расширению на диске через --load-extension. На macOS путь может выглядеть так: /Users/<user>/Library/Application Support/Chromium/Default/Extensions/pgojnojmmhpofjgdmaebadhbocahppod/1.16.0_0. Если удобнее переиспользовать существующий профиль, где расширение уже установлено и включено, направьте Chromium на этот профиль через --user-data-dir.
Почему это важно
При автоматическом запуске Chromium параметры командной строки полностью определяют поведение браузера. Настройки, сделанные вручную в интерфейсе — включая разрешение работы расширения в инкогнито — могут быть переопределены или проигнорированы в зависимости от заданных флагов. Понимание того, как взаимодействуют --incognito, --disable-extensions и --load-extension, помогает избежать побочных эффектов и добиваться того, чтобы сценарии вели себя так же, как ручные сессии.
Итоги
Если в автоматизированной сессии расширение не появляется, начните с удаления --disable-extensions, не навязывайте инкогнито, когда расширение необходимо, и явно подгрузите его из папки через --load-extension. Если важна сохранность настроек, используйте --user-data-dir, чтобы переиспользовать известный профиль. С этими настройками Chromium, запущенный через NoDriver, будет повторять вашу ручную конфигурацию и сохранять расширение доступным при открытии вкладки скриптом.