Ответ
Да, эмуляция медленных сетевых условий — это обязательная практика при тестировании производительности и отказоустойчивости веб-приложений. Браузерные DevTools предоставляют для этого встроенные и мощные инструменты.
Как настроить троттлинг в Chrome DevTools:
- Откройте DevTools (
F12илиCtrl+Shift+I/Cmd+Opt+I). - Перейдите на вкладку Network.
- Найдите выпадающий список Throttling (по умолчанию стоит "Online").
- Выберите один из предустановленных профилей или нажмите Add... для создания кастомного.
Предустановленные профили:
- Slow 3G: Загрузка ~ 400 Кбит/с, отдача ~ 400 Кбит/с, задержка 400 мс.
- Fast 3G: Загрузка ~ 1.5 Мбит/с, отдача ~ 750 Кбит/с, задержка 150 мс.
- Regular 4G: Загрузка ~ 4 Мбит/с, отдача ~ 3 Мбит/с, задержка 20 мс.
- Offline: Эмуляция полного отсутствия сети.
Что проверять при медленном соединении:
- Загрузка контента: Появляются ли лоадеры/скелетоны? Не "прыгает" ли layout?
- Обработка ошибок: Как приложение реагирует на таймауты запросов? Есть ли retry-логика?
- Прогресс-индикация: Показывается ли прогресс загрузки файлов?
- Отзывчивость UI: Блокируется ли интерфейс на время загрузки?
- Приоритизация: Загружаются ли критичные ресурсы (CSS, JS) в первую очередь?
Пример автоматизации троттлинга с помощью Puppeteer (Node.js):
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 1. Включаем эмуляцию медленного 3G через CDP (Chrome DevTools Protocol)
const client = await page.target().createCDPSession();
await client.send('Network.emulateNetworkConditions', {
offline: false,
downloadThroughput: 500 * 1024 / 8, // 500 Кбит/с в байтах/сек
uploadThroughput: 500 * 1024 / 8, // 500 Кбит/с
latency: 400 // 400 мс задержки
});
// 2. Подписываемся на события загрузки ресурсов
await page.setRequestInterception(true);
page.on('request', request => {
console.log(`Запрос: ${request.url()} (тип: ${request.resourceType()})`);
request.continue();
});
// 3. Измеряем время загрузки страницы
console.time('pageLoad');
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
console.timeEnd('pageLoad');
// 4. Делаем скриншот для визуальной проверки состояния
await page.screenshot({ path: 'slow-connection-state.png' });
// 5. Проверяем, загрузились ли критичные элементы
const isContentLoaded = await page.evaluate(() => {
const mainContent = document.querySelector('.main-content');
return mainContent && mainContent.textContent.length > 0;
});
console.assert(isContentLoaded, 'Основной контент не загрузился при медленном соединении!');
await browser.close();
})();
Пример с Selenium WebDriver (Java + ChromeOptions):
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v85.network.Network;
import org.openqa.selenium.devtools.v85.network.model.ConnectionType;
public class NetworkThrottlingTest {
public static void main(String[] args) {
ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();
// Включаем эмуляцию сети
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
// Устанавливаем параметры медленного 3G
devTools.send(Network.emulateNetworkConditions(
false, // offline
500, // latency (ms)
50000, // downloadThroughput (bytes/sec) ~400 Kbps
50000, // uploadThroughput (bytes/sec) ~400 Kbps
Optional.of(ConnectionType.CELLULAR3G)
));
// Измеряем производительность с помощью Navigation Timing API
driver.get("https://example.com");
Long loadTime = (Long) driver.executeScript(
"return performance.timing.loadEventEnd - performance.timing.navigationStart;"
);
System.out.println("Время полной загрузки страницы: " + loadTime + " мс");
// Проверяем, что время загрузки не превышает приемлемый лимит (например, 15 секунд)
assert loadTime < 15000 : "Страница грузится слишком долго при медленном 3G: " + loadTime + "мс";
driver.quit();
}
}
Дополнительные инструменты и подходы:
- Charles Proxy / Fiddler: Более продвинутое троттлинг с возможностью настройки правил для конкретных доменов.
- WebPageTest: Онлайн-сервис для тестирования производительности с разными скоростями соединения.
- Lighthouse: Аудит производительности с эмуляцией медленных сетей.
- Дросселирование на уровне ОС: Инструменты вроде
tc(Linux) илиNetwork Link Conditioner(macOS) для тестирования нативных приложений.
Ключевые метрики для мониторинга:
- First Contentful Paint (FCP)
- Largest Contentful Paint (LCP)
- Time to Interactive (TTI)
- Общий размер загружаемых ресурсов
- Количество HTTP-запросов
Ответ 18+ 🔞
Э, слушай, а вот эта ваша эмуляция медленного интернета — это ж вообще святое дело, когда приложение пишешь! Это как проверка на вшивость, блядь. Представь: у тебя всё летает на локалхосте, а потом выкатываешь на прод, и какой-нибудь пользователь с хутора, где интернет через два ведра и мокрую тряпку, открывает твой сайт и получает пиздец, а не интерфейс. Волнение ебать!
Как в Хроме это самое троттлинг включить, чтобы всё ползло как в жопе у черепахи:
- Тыкаешь
F12— DevTools вылазят, как геморрой в понедельник. - Ищешь вкладку Network (Сеть, блять).
- Там есть выпадашка Throttling (по дефолту "Online").
- Выбираешь готовый профиль или жмёшь Add..., чтобы свой извращённый придумать.
Что там есть из коробки, эти ваши профили:
- Slow 3G: Качает и отдаёт по ~400 Кбит/с, а пинг — 400 мс. Ощущения, будто данные через спутник с Марса идут, ёпта.
- Fast 3G: Чуть быстрее, но всё равно тоска.
- Regular 4G: Уже терпимо.
- Offline: Полный пиздец, коннекта нет. Как будто провайдер тебе сказал «иди нахуй».
А на что вообще смотреть, когда всё тормозит?
- Контент: Грузится ли хоть что-то? Или юзер пялится в белый экран, а потом у него layout из-за картинки прыгает, и он клавиатуру об стену швыряет?
- Ошибки: А что, если запрос просто сдохнет по таймауту? Приложение не должно просто зависнуть и молчать, как мудак. Должна быть какая-то retry-логика, сообщение «эй, интернет-то говно».
- Прогресс: Если файл качается, видно ли, сколько ещё ждать? Или это магический чёрный ящик?
- Интерфейс: Весь UI встаёт колом на время загрузки? Кнопки не нажимаются? Вот это пиздец.
- Приоритеты: Сначала грузятся самые важные штуки (стили, основной скрипт), а уже потом всякая хуйня вроде баннеров? Или наоборот?
Вот, смотри, как это автоматизировать можно, через Puppeteer (Node.js):
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 1. Врубаем медленный 3G через CDP (Chrome DevTools Protocol)
const client = await page.target().createCDPSession();
await client.send('Network.emulateNetworkConditions', {
offline: false,
downloadThroughput: 500 * 1024 / 8, // 500 Кбит/с в байтах/сек
uploadThroughput: 500 * 1024 / 8, // 500 Кбит/с
latency: 400 // 400 мс задержки
});
// 2. Слушаем, какие запросы ползут (можно посмотреть, какая хуйня сколько тормозит)
await page.setRequestInterception(true);
page.on('request', request => {
console.log(`Запрос: ${request.url()} (тип: ${request.resourceType()})`);
request.continue();
});
// 3. Засекаем, сколько страница грузится (время до полного пиздеца)
console.time('pageLoad');
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
console.timeEnd('pageLoad');
// 4. Делаем скриншот — вдруг там полная дичь отобразилась
await page.screenshot({ path: 'slow-connection-state.png' });
// 5. Проверяем, а главная часть контента вообще загрузилась?
const isContentLoaded = await page.evaluate(() => {
const mainContent = document.querySelector('.main-content');
return mainContent && mainContent.textContent.length > 0;
});
console.assert(isContentLoaded, 'Основной контент не загрузился при медленном соединении!');
await browser.close();
})();
А вот пример на Java с Selenium, для любителей посерьёзнее:
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v85.network.Network;
import org.openqa.selenium.devtools.v85.network.model.ConnectionType;
public class NetworkThrottlingTest {
public static void main(String[] args) {
ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();
// Включаем отслеживание сети
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
// Настраиваем параметры медленного 3G (чтоб всё еле-еле)
devTools.send(Network.emulateNetworkConditions(
false, // offline
500, // latency (ms)
50000, // downloadThroughput (bytes/sec) ~400 Kbps
50000, // uploadThroughput (bytes/sec) ~400 Kbps
Optional.of(ConnectionType.CELLULAR3G)
));
// Замеряем время загрузки через Navigation Timing API
driver.get("https://example.com");
Long loadTime = (Long) driver.executeScript(
"return performance.timing.loadEventEnd - performance.timing.navigationStart;"
);
System.out.println("Время полной загрузки страницы: " + loadTime + " мс");
// Проверяем, что хотя бы в 15 секунд уложились
assert loadTime < 15000 : "Страница грузится слишком долго при медленном 3G: " + loadTime + "мс";
driver.quit();
}
}
Ещё, блядь, инструменты есть, на любой вкус:
- Charles Proxy / Fiddler: Там можно такие извращения устроить — для каждого домена своё правило, где-то замедлить, где-то вообще обосрать запрос.
- WebPageTest: Онлайн-штука, там сразу с разных мест и скоростей тестировать можно.
- Lighthouse: Он в аудит производительности сразу с медленным сетями закладывается.
- Дросселирование на уровне ОС: В Линуксе
tc, на макеNetwork Link Conditioner. Это уже для нативных приложений каминг-аут, но суть та же.
Какие цифры потом смотреть, чтобы не опозориться?
- First Contentful Paint (FCP) — когда первый кусок контента появился.
- Largest Contentful Paint (LCP) — когда самая большая хрень (типо героя или фото) загрузилась.
- Time to Interactive (TTI) — когда можно уже тыкать и что-то делать.
- Общий размер всех файлов — если он овердохуища, то никакой троттлинг не спасёт.
- Количество HTTP-запросов — каждый запрос это риск, что что-то упрётся и всё поедет.
Короче, не ленись это делать, а то получится история, как с Герасимом и Муму, только ты в роли барыни, которая приказала всё утопить, а пользователи — это несчастная собачка. Пиздец.