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

В 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) запросы напрямую.

from seleniumwire import webdriver  # pip install selenium-wire

options = {}
driver = webdriver.Chrome(seleniumwire_options=options)

driver.get("https://example.com")

# Перехватить все запросы
for request in driver.requests:
    if request.response:
        print(request.url, request.response.status_code)

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

driver.scopes = ['.*example.*']  # фильтр по URL

for request in driver.requests:
    if "api" in request.url:
        print(request.headers)

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

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

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()

    def log_request(route, request):
        print(f"Request: {request.url}")
        route.continue_()

    page.route("**/*", log_request)
    page.goto("https://example.com")
    browser.close()
  • Тут можно мокать API, перехватывать и менять ответы.

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


4. DevTools Protocol (CDP) в Selenium 4+

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

from selenium import webdriver

driver = webdriver.Chrome()

# Включаем мониторинг сетевых событий
driver.execute_cdp_cmd("Network.enable", {})

# Делаем запрос
driver.get("https://example.com")

# Перехватываем ответы
logs = driver.get_log("performance")
for log in logs:
    print(log)

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


🔹 Итог

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

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

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

Last updated

Was this helpful?