Как найти запрос, который вызывает ошибку на браузере?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как найти запрос, вызывающий ошибку в браузере
Поиск проблемного запроса — ключевая задача при отладке веб-приложений. Как автоматизатор с 10+ лет опыта, я использую системный подход, сочетающий браузерные инструменты разработчика, прокси-серверы и специализированные фреймворки.
Основные инструменты и методы
1. Панель разработчика браузера (DevTools)
Первая линия обороны. Открывается через F12 или Ctrl+Shift+I.
- Вкладка Network (Сеть): Здесь отображаются ВСЕ HTTP/HTTPS-запросы.
* **Фильтрация**: Используйте фильтры по типу (XHR, JS, CSS), статусу (4xx, 5xx) или домену.
* **Поиск ошибок**: Красный статус код (например, `404`, `500`, `403`) или статус `(failed)` сразу указывают на проблему.
* **Preserve log**: Включите эту опцию, чтобы логи не очищались при перезагрузке страницы.
* **Throttling**: Имитируйте медленную сеть, чтобы выявить таймауты.
- Вкладка Console (Консоль): JavaScript-ошибки и CORS-ошибки часто связаны с неудачными запросами. Ищите сообщения типа
Failed to load resourceилиCORS policy.
Пример быстрого анализа в DevTools:
- Откройте DevTools (
F12) → вкладка Network. - Воспроизведите сценарий ошибки.
- Отсортируйте таблицу по столбцу Status.
- Кликните на запрос с ошибкой → исследуйте вкладки Headers, Response, Timing.
2. Прокси-серверы для автоматизации (Charles Proxy, Fiddler, mitmproxy)
Незаменимы для автоматизированного тестирования, так как позволяют перехватывать и модифицировать трафик из любых источников (браузер, мобильное приложение, автотесты).
- Charles Proxy:
* Установите SSL-сертификаты для расшифровки HTTPS.
* Используйте **Breakpoints** (точки останова), чтобы приостановить запрос и изучить его.
* **Map Local/Remote** для подмены ответов сервера и симуляции ошибок.
* Сохраняйте сессии (`.chls` файлы) для анализа или прикрепления к баг-репорту.
- Fiddler:
* Мощные возможности фильтрации и скриптования на **C#**.
* **Autoresponder** для подмены ответов.
Пример настройки перехвата в автотесте (Python + Selenium):
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
# Настройка прокси для перенаправления трафика через Charles (localhost:8888)
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "localhost:8888"
proxy.ssl_proxy = "localhost:8888"
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
driver = webdriver.Chrome(desired_capabilities=capabilities)
# Далее весь трафик из теста будет виден в Charles
3. Логирование на стороне браузера (Performance API, пользовательские обработчики)
Для сложных случаев можно встраивать код в тесты для мониторинга.
- Performance Observer API: Можно отслеживать ресурсы с ошибками.
- Перехват fetch/XHR: Подписка на события ошибок глобально.
Пример кода для отслеживания неудачных запросов в браузере:
// Код для выполнения в браузере через execute_script в Selenium
window.failedRequests = [];
const originalFetch = window.fetch;
window.fetch = function(...args) {
return originalFetch.apply(this, args).then(response => {
if (!response.ok) {
window.failedRequests.push({
url: args[0],
status: response.status,
statusText: response.statusText
});
}
return response;
}).catch(error => {
window.failedRequests.push({ url: args[0], error: error.message });
throw error;
});
};
// Аналогично для XMLHttpRequest
const originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
this.addEventListener('error', function() {
window.failedRequests.push({
url: this.responseURL,
status: this.status,
statusText: this.statusText
});
});
originalSend.call(this, body);
};
Стратегия поиска в процессе тестирования
- Воспроизведение: Четко зафиксируйте шаги, приводящие к ошибке.
- Включение записи: Запустите запись в DevTools или прокси ДО воспроизведения.
- Анализ по фильтрам:
* `status>=400`
* `method:POST` (часто проблемные)
* Поиск по части URL или ключевому слову из ошибки.
- Изучение деталей проблемного запроса:
* **Request Headers** (корректны ли `Authorization`, `Content-Type`?).
* **Request Payload/Query String** (правильные ли данные отправлены?).
* **Response Body/Headers** (что именно вернул сервер?).
* **Timing/Waterfall** (на каком этапе запрос упал: DNS, SSL, Waiting?).
- Сравнение с успешным запросом (если есть).
- Фиксация доказательств: Делайте скриншоты всей вкладки Network, сохраняйте HAR-файл (Export HAR), логи из прокси.
Интеграция с автотестами
Для QA Automation критично уметь находить ошибки автоматически:
- Использование Selenium Logs (Performance Log): Chrome DevTools Protocol позволяет получать Network-логи.
from selenium import webdriver caps = webdriver.DesiredCapabilities.CHROME caps['goog:loggingPrefs'] = {'performance': 'ALL'} # Включаем логи производительности driver = webdriver.Chrome(desired_capabilities=caps) # После выполнения действий logs = driver.get_log('performance') for entry in logs: # Парсим JSON, ищем события Network.responseReceived с ошибкой print(entry['message']) - Сторонние библиотеки: BrowserMob Proxy (в связке с Selenium) для генерации HAR программно.
- Мониторинг в Page Object: Можно добавить проверку на отсутствие критических ошибок в сети после ключевых действий.
Заключение: Умение быстро находить проблемный запрос — это комбинация знания инструментов и методичного подхода. Всегда начинайте с DevTools для ручного исследования, а для автоматизации внедряйте прокси-серверы и логирование через CDP. Ключ к успеху — фиксация контекста: HAR-файлы, логи и четкие шаги воспроизведения бесценны как для разработчика, так и для создания автоматических проверок на подобные ошибки в будущем.