2025, Oct 31 00:17

Bing Maps не открывается в Selenium из-за --disable-3d-apis: как исправить

Bing Maps не грузится в Selenium? Причина — --disable-3d-apis. Решение: удалите флаг или используйте --disable-accelerated-2d-canvas и --disable-gpu надёжно.

Открытие Bing Maps в сеансе Chrome под управлением Selenium может внезапно перестать работать, даже если раньше всё было стабильно. Причиной становится конкретный флаг командной строки Chrome, который мешает странице загрузить графический слой. Ниже — короткое, по делу, руководство по диагностике и исправлению проблемы без перестройки всего конвейера автоматизации.

Контекст проблемы

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

import os, sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

chrome_cfg = Options()
chrome_cfg.add_argument("start-maximized")
chrome_cfg.add_argument('--use-gl=swiftshader')
chrome_cfg.add_argument('--enable-unsafe-webgpu')
chrome_cfg.add_argument('--enable-unsafe-swiftshader')
chrome_cfg.add_argument("--disable-3d-apis")
chrome_cfg.add_argument('--disable-gpu')
chrome_cfg.add_argument('--no-sandbox')
chrome_cfg.add_argument('--disable-dev-shm-usage')
chrome_cfg.add_argument("start-maximized")
chrome_cfg.add_argument('--log-level=3')
chrome_cfg.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1})
chrome_cfg.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_cfg.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_cfg.add_experimental_option('useAutomationExtension', False)
chrome_cfg.add_argument('--disable-blink-features=AutomationControlled')

svc = Service()

maps_url = "https://www.bing.com/maps"
browser = webdriver.Chrome(service=svc, options=chrome_cfg)
browser.get(maps_url)
input("Press!")

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

Флаг, который блокирует страницу, — --disable-3d-apis. С ним Bing Maps не успевает инициализироваться. Удаление флага возвращает нормальное поведение. Это совпадает с наблюдением: стоит не передавать этот переключатель в Chrome — и код снова работает.

Если по-прежнему нужно держать GPU отключённой, можно управлять рендерингом, не блокируя весь 3D‑стек. Добавьте --disable-accelerated-2d-canvas, чтобы предотвратить переход на программный рендеринг при отключённом GPU; такой вариант хорошо сочетается с --disable-gpu.

Рабочее решение

Исправление простое: перестаньте передавать --disable-3d-apis. При желании замените его на --disable-accelerated-2d-canvas. Также можно «укрепить» сеанс дополнительными флагами, чтобы уменьшить всплывающие окна, рекламу, уведомления и шум от расширений. Если сайт показывает диалог согласия, явное ожидание и клик по идентификатору элемента помогут сохранить предсказуемость процесса.

import os, sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_cfg = Options()
chrome_cfg.add_argument("start-maximized")
chrome_cfg.add_argument('--use-gl=swiftshader')
chrome_cfg.add_argument('--enable-unsafe-webgpu')
chrome_cfg.add_argument('--enable-unsafe-swiftshader')
# chrome_cfg.add_argument("--disable-3d-apis")  # удалено, чтобы страница смогла инициализироваться
chrome_cfg.add_argument("--disable-accelerated-2d-canvas")  # хорошо сочетается с --disable-gpu
chrome_cfg.add_argument('--disable-gpu')
chrome_cfg.add_argument('--no-sandbox')
chrome_cfg.add_argument('--disable-dev-shm-usage')
chrome_cfg.add_argument("start-maximized")
chrome_cfg.add_argument('--log-level=3')
chrome_cfg.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1})
chrome_cfg.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_cfg.add_experimental_option('excludeSwitches', ['enable-logging'])
chrome_cfg.add_experimental_option('useAutomationExtension', False)
chrome_cfg.add_argument('--disable-blink-features=AutomationControlled')

# Снизить «шум» интерфейса во время выполнения
chrome_cfg.add_argument("--disable-popup-blocking")
chrome_cfg.add_argument("--disable-ads")
chrome_cfg.add_argument("--disable-notifications")
chrome_cfg.add_argument("--disable-extensions")

svc = Service()

maps_url = "https://www.bing.com/maps"
browser = webdriver.Chrome(service=svc, options=chrome_cfg)
browser.get(maps_url)

# При появлении кликнуть по кнопке "Reject" по её id

def press_by_id(elem_id="bnp_btn_reject", timeout=10):
    try:
        WebDriverWait(browser, timeout).until(
            EC.element_to_be_clickable((By.ID, elem_id))
        ).click()
    except Exception as exc:
        print(f"Error clicking button: {exc}")

press_by_id()

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

Автоматизация, которая «душит» графику и интерфейс широкими флагами, оказывается хрупкой перед современными веб‑приложениями. Когда один переключатель вроде --disable-3d-apis мешает карте отрендериться, встаёт весь тест или сбор данных. Понимание, какие флаги безопасны, а какие вырубают критичную функциональность, помогает избежать плавающих сбоёв и долгой отладки.

Вместо тотального отключения 3D лучше использовать точечный подход: так сессия остаётся стабильной даже при запрете GPU. И разбор проблем упрощается: если страница перестала грузиться, первыми подозреваемыми становятся переключатели, напрямую влияющие на рендеринг.

Итоги

Если Bing Maps не загружается в Selenium, проверьте наличие --disable-3d-apis и уберите его. Используйте --disable-accelerated-2d-canvas вместе с --disable-gpu, чтобы не было отката на программный рендеринг. Держите поверхность браузера «чистой»: подавляйте всплывающие окна, рекламу, уведомления и расширения, а для окна согласия применяйте явное ожидание и клик по id. Небольшие, осмысленные правки флагов запуска возвращают надёжность без изменений всей схемы автоматизации.

Статья основана на вопросе на StackOverflow от Rapid1898 и ответе Gооd_Mаn.