Как взаимодействовать с запросами, отправляемыми из браузера?

В Selenium классическом нет встроенной поддержки перехвата/управления сетевыми запросами (HTTP/HTTPS), потому что он работает только с DOM. Но в автоматизации есть несколько способов:


🔹 Подходы к работе с запросами из браузера

1. Selenium + BrowserMob Proxy / MITM Proxy

  • Используется внешний прокси-сервер, который «вклинивается» между браузером и сервером.

  • Можно перехватывать, проверять и модифицировать запросы/ответы.

Пример с BrowserMob Proxy:

from browsermobproxy import Server
from selenium import webdriver

server = Server("path/to/browsermob-proxy")
server.start()
proxy = server.create_proxy()

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f"--proxy-server={proxy.proxy}")

driver = webdriver.Chrome(options=chrome_options)

proxy.new_har("test", options={"captureHeaders": True, "captureContent": True})
driver.get("https://example.com")

# Получаем все запросы
for entry in proxy.har['log']['entries']:
    url = entry['request']['url']
    status = entry['response']['status']
    print(f"{url} -> {status}")

📌 Минус: настройка не всегда тривиальная, нужны сторонние утилиты.


2. Selenium Wire

Очень удобное расширение Selenium, позволяющее перехватывать HTTP(S) запросы напрямую.

Можно даже подменять заголовки и ответы:


3. Playwright или Cypress (альтернатива Selenium)

  • Playwright (Python, JS, Java) умеет нативно работать с сетью:

  • Тут можно мокать API, перехватывать и менять ответы.

  • Для тестов API + UI — это гораздо удобнее, чем Selenium.


4. DevTools Protocol (CDP) в Selenium 4+

В ChromeDriver/Selenium 4 появился доступ к Chrome DevTools Protocol, что позволяет слушать сетевые события.

📌 Но тут много «сырого» JSON, приходится разбирать руками.


🔹 Итог

  • Для Selenium классического лучше использовать Selenium Wire (проще всего).

  • Для гибкой работы с API/UI — перейти на Playwright (он поддерживает перехват, моки, подмену ответов из коробки).

  • Проксирование (BrowserMob Proxy, MITMProxy) — более старый вариант, но всё ещё рабочий.

Last updated