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.