Сетевое дросселирование с помощью хрома и селена

Google Chrome 38 представил новую функцию "Режим устройства и мобильная эмуляция" в devtools. В дополнение к выбору устройства для эмуляции также возможно эмулировать различные сетевые условия:

Оптимизация производительности вашего сайта в разных условиях сети ключевой аспект развития для мобильной аудитории.

Настройка режима устройства в режиме устройства позволяет протестировать ваш сайт на множество сетевых подключений, включая Edge, 3G и даже офлайн. Выберите соединение из раскрывающегося списка предустановки, чтобы применить сеть дросселирование и латентность.

Например, мы можем установить его как в старые добрые времена - GPRS 50 Кбит/с:

enter image description here

Теперь у нас есть хороший прецедент для этого - у нас есть внутреннее приложение для тестирования скорости сети. И эта новая функциональность эмуляции очень полезна для ручного тестирования. Но мы бы хотели автоматизировать его.

Вопрос:

Можно ли запустить хром через селен с указанными сетевыми условиями? Это то, что можно контролировать с помощью хромных настроек или аргументов командной строки?


Есть, конечно, несколько вариантов имитировать медленное подключение к Интернету, но вопрос в частности касается хром + селен.

Ответ 1

API для управления эмуляцией сети был добавлен в ChromeDriver. И должно быть доступно довольно долго. Согласно комментарию в связанной проблеме, вы должны использовать версию как минимум 2.26 из-за некоторого исправления.

В соответствии с Selenium список изменений доступен для следующих языков:

  • JavaScript начиная с версии 3.4.0 (commit)
  • Python начиная с версии 3.5.0 (commit)
  • Ruby начиная с версии 3.11.0 (commit)
  • С# с версии 4 (коммит)

Если вам нужны эти привязки на других языках, вам, вероятно, следует открыть реализацию вопроса/содействия, аналогичную одной из вышеперечисленных.

Пример использования из Python ниже:

driver.set_network_conditions(
    offline=False,
    latency=5,  # additional latency (ms)
    download_throughput=500 * 1024,  # maximal throughput
    upload_throughput=500 * 1024)  # maximal throughput

Ответ 2

Нет, невозможно управлять эмуляцией сетевых подключений с помощью настроек Chrome или аргументов командной строки. Эмуляция сетевых подключений является частью встроенного отладчика Chrome. Один из способов решения этого - управлять отладчиком. Это можно сделать с помощью расширения или путем прямого управления отладчиком, см. объяснение. Однако это не будет работать с WebDriver. Причина этого в том, что может быть только один сеанс "отладки", и WebDriver уже использует его, см. объяснение. Поскольку нет открытого интерфейса, также нет возможности управлять им через WebDriver.

Для Режим устройства и мобильная эмуляция, который также является частью встроенного отладчика, есть открытый интерфейс (подробности) и, следовательно, можно контролировать. Это можно сделать с помощью возможностей WebDriver. Два варианта: 1) Укажите имя устройства. 2) Введите свои собственные параметры (ограниченные).

Ответ 3

Хотя это очень полезный и полезный элемент функциональности, для серьезного тестирования я думаю, что обычные методы моделирования сети все еще не решены.

Мне известны 2 решения в дополнение к уже связанным - веб-прокси Charles (очень полезный инструмент - коммерческий) и реализация собственного рецепта с использованием Linux Traffic Control (например, см. Главу 6 в LAMPe2e).

Взаимодействуя с сетевыми подключениями, а не с браузером, вы получите надлежащую оценку воздействия независимо от используемого браузера.

Почему вы просто хотите использовать функциональность Chrome?

Ответ 4

Действительно, в последней версии С# Selenium (3.11) добавлены условия сети. Теперь вы можете использовать это так:

     var driver = new ChromeDriver(pathToDriver);
     driver.NetworkConditions = new ChromeNetworkConditions()
     {  DownloadThroughput = 5000, UploadThroughput = 5000, Latency = TimeSpan.FromMilliseconds(5) };

Проблема в том, что он еще не используется из-за ошибки

https://github.com/SeleniumHQ/selenium/issues/5693

Так что ребятам .Net придется ждать до 3.12 релиза Selenium.

Ответ 6

Вы можете использовать этот метод для запуска вашего теста в определенных условиях сети

protected void networkThrotting() throws IOException {
  Map map = new HashMap();
  map.put("offline", false);
  map.put("latency", 5);
  map.put("download_throughput", 500);
  map.put("upload_throughput", 1024);


  CommandExecutor executor = ((ChromeDriver)driver).getCommandExecutor();
  Response response = executor.execute(
        new Command(((ChromeDriver)driver).getSessionId(),    "setNetworkConditions", ImmutableMap.of("network_conditions", ImmutableMap.copyOf(map)))
  );
}