2025, Nov 09 06:01

Selenium и Chrome/Chromedriver: как убрать предупреждение abseil

Разбираемся, почему Chrome/ChromeDriver в Selenium пишет в stderr сообщение abseil и почему логирование Python не помогает. Практичные способы скрыть вывод в CI.

Когда вы запускаете Selenium с Chrome или ChromeDriver и сразу видите назойливую строку вроде «All log messages before absl::InitializeLog() is called are written to STDERR», появляется соблазн найти настройку логирования в Python или флаг Selenium, чтобы её приглушить. Проблема в том, что это предупреждение приходит не из вашего процесса Python, и большинство привычных регулировок на него не действуют.

Как воспроизвести проблему

Минимальный скрипт Selenium уже вызывает это сообщение при запуске:

from selenium import webdriver
cfg = webdriver.ChromeOptions()
cfg.add_argument('log-level=3')
client = webdriver.Chrome(options=cfg)
client.get("https://example.com")
input()

Консоль может показать, например:

DevTools listening on ws://127.0.0.1:62699/devtools/browser/8462948e-49fc-4e39-aa2b-bc89d4e3d0e4
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1751797016.966696   65184 voice_transcription.cc:58] Registering VoiceTranscriptionCapability

Даже если вы уже уменьшили уровень логов Chrome через log-level, предупреждение abseil всё равно появляется.

Что на самом деле происходит

Сообщение генерируется нативным кодом внутри связки Chrome/Chromedriver и записывается напрямую в stderr процесса. Его не выводит Selenium, и оно не проходит через механизмы логирования Python. Библиотеки вроде Abseil или gRPC в свежих сборках Chromium инициализируют своё C++‑логирование и могут печатать ранние сообщения ещё до того, как настроено какое‑либо верхнеуровневое логирование. Отсюда строка про absl::InitializeLog и соседние сообщения со ссылкой на voice_transcription.cc.

Поскольку сообщение рождается на уровне бинарника, оно обходит перенаправление на стороне Python и настройки детализации Selenium. Изменение ChromeOptions, подкрутка логгеров Python или правка переменных окружения, влияющих на пакеты Python, не повлияют на строку, которую нативный дочерний процесс пишет прямо в stderr терминала.

Почему привычные рычаги не работают

Попытки менять переменные окружения для несвязанных стеков или перенаправлять файловые дескрипторы Python тут не помогают. Например, установка этих переменных окружения в Python не влияет на вывод со стороны Chromium:

import os
os.environ["GRPC_VERBOSITY"] = "ERROR"
os.environ["GLOG_minloglevel"] = "2"

Точно так же переназначение sys.stdout или sys.stderr внутри Python не перехватывает то, что нативный дочерний процесс пишет в терминал:

import sys
buf = []
class Sink:
    def write(self, chunk):
        buf.append(chunk)
sys.stdout = Sink()
sys.stderr = Sink()

Эти изменения затрагивают только собственные файловые объекты Python. Chrome/Chromedriver работает отдельно и пишет прямо в потоковые дескрипторы ОС.

Что реально можно сделать

На сегодня нет аккуратного, официально поддерживаемого переключателя, чтобы скрыть именно это предупреждение. Оно безвредно и не влияет на работу Selenium. Если вам нужно убрать его из вывода, практичные варианты лежат вне Selenium и системы логирования Python.

Надёжный путь — перенаправить stderr на границе процесса. Запустите скрипт Selenium под обёрткой, которая стартует процесс Python с выводом stderr в «чёрную дыру». В Python это выглядит как запуск вашего скрипта через subprocess с перенаправлением stderr:

import subprocess
import sys
subprocess.Popen([sys.executable, "your_selenium_script.py"], stderr=subprocess.DEVNULL)

Либо используйте оболочку вашей операционной системы, чтобы перенаправить stderr всего процесса. Оба подхода — обходные решения, а не исправления, но они не дадут предупреждению abseil попасть в консоль или логи CI.

Небольшая ремарка о том, какой бинарник браузера используется

Появление сообщения может отличаться в зависимости от того, какой именно бинарник из семейства Chromium запускается и с какими флагами. Среда выполнения может выбрать Chrome или Chromium в зависимости от того, что первое найдено в PATH, а при их отсутствии — перейти на Chrome‑for‑Testing. Возможна и обратная ситуация: предупреждение видно при прямом запуске google-chrome, но не видно при запуске браузера из Selenium — просто потому, что используются разные исполнимые файлы или стартовые аргументы. Однако первопричину это не меняет: строка приходит из нативного стека браузера, а не из Selenium или Python.

Почему это важно

В конвейерах CI и тест-раннерах посторонний вывод в stderr может сбивать парсеры логов или мешать разбору инцидентов. Понимание того, что это нативное стартовое сообщение, избавляет от ложных направлений — правки логирования Python, Selenium‑способностей или несвязанных переменных окружения. Это также объясняет, почему подавление на уровне модулей в Python не помогает и почему перенаправление нужно делать на уровне процесса.

Итоги и практические советы

Если при запуске Selenium с Chrome/Chromedriver вы встречаете строку «All log messages before absl::InitializeLog() is called are written to STDERR», относитесь к ней как к безобидному нативному предупреждению. Его не генерирует Selenium, и его нельзя приглушить настройками логирования в Python, переменными окружения вроде GLOG_minloglevel или GRPC_VERBOSITY, либо переназначением sys.stderr. Когда необходимо полностью убрать строку из вывода, запускайте скрипт Selenium под обёрткой, перенаправляющей stderr всего процесса, или применяйте перенаправление на уровне ОС. В остальных случаях просто игнорируйте её — автоматизация браузера будет работать как ожидается.

Статья основана на вопросе на StackOverflow от Shi kaimao и ответе Veda B.