Автоматизируйте создание файлов HAR из Google Chrome

В основном мне нужен способ автоматизировать результат следующих операций:

  1. открыть новую вкладку;

  2. откройте вкладку «Сеть» в инструментах разработчика;

  3. загрузить URL-адрес;

  4. выберите «Сохранить все как HAR».

Часто предлагаемые решения включают использование PhantomJS, browsermob-proxy или pcap2har; они не подходят для моего случая, так как мне нужно работать с трафиком SPDY.

Я попытался погрузиться в API расширений Google Chrome и действительно смог автоматизировать некоторые задачи, но все еще не удачи в том, что касается генерации файлов HAR. Теперь этот метод особенно перспективен, но я до сих пор не могу понять, как Я использую это.

Другими словами, мне нужно что-то вроде этого эксперимента от ребят из Google. Обратите внимание на следующее:

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

Любые идеи?


Решение

Для любопытных я закончил с модулем Node.js, который автоматизирует такие тесты: chrome-har-capturer< /а>. Это также дало мне возможность глубже изучить протокол удаленной отладки и написать более простой уровень интерфейса Node.js для универсальной автоматизации Chrome: chrome-remote-interface.


person cYrus    schedule 24.11.2012    source источник
comment
Как использовать chrome-har-capturer? Не могли бы вы направить?   -  person UmeshPathak    schedule 14.08.2020
comment
Разве README недостаточно? Если у вас есть какие-либо сомнения, не стесняйтесь задавать вопрос.   -  person cYrus    schedule 16.08.2020


Ответы (2)


Короткий ответ: нет никакого способа получить данные, которые вам нужны напрямую. Метод getHAR применим только к расширениям, предназначенным для расширения самого DevTools. Хорошей новостью является то, что вы можете создать файл HAR самостоятельно без особых проблем — это точно какой фантом .js делает.

  1. Запустите Chrome с удаленной отладкой
  2. Подключитесь к Chrome через порт отладки с подключением через веб-сокет.
  3. Включите отладку «Сеть», вы также можете очистить кеш и т. д. — см. Network API.
  4. Скажите браузеру перейти на страницу, которую вы хотите захватить, и Chrome вернет вам все метаданные запроса.
  5. Массируйте сетевые данные в формате HAR, например, phantom.js.
  6. ...
  7. Выгода.

Для начала у меня есть сообщение с примером кода Ruby, который вы должны начать с шагов 1-4: http://www.igvita.com/2012/04/09/driving-google-chrome-via-websocket-api/

person igrigorik    schedule 24.11.2012
comment
Забавно, что настоящий сотрудник Google ответил на мой вопрос! :) В эти дни я получил представление о темах, которые вы упомянули, и, наконец, вы дали мне клей. Позвольте мне попробовать, я скоро вернусь с некоторыми отзывами ... - person cYrus; 24.11.2012
comment
Хорошо, это определенно путь. Теперь у меня есть скрипт nodejs, который запускает Chrome, запускает tcpdump, открывает WebSocket, выполняет некоторую настройку, загружает URL-адрес и, наконец, выгружает файл HAR... Я следовал предоставленному вами примеру PhantomJS, спецификации HAR и Network API, но есть еще кое-что о таймингах, которые я не понимаю, в частности: как я могу заполнить поле timings.receive? Насколько я понял: запрос начинается с requestTime; ожидание от сервера начинается в requestTime + sendEnd и заканчивается в Network.responseReceived (timestamp), правильно ли это? - person cYrus; 25.11.2012
comment
Или, может быть, весь ответ получен на Network.responseReceived (timestamp)? - person cYrus; 25.11.2012
comment
responseReceived должен содержать все данные синхронизации внутри (как часть NavTiming). Вы определенно не хотите заниматься расчетом этого времени самостоятельно. - person igrigorik; 27.11.2012
comment
Я надеюсь на это, но все, что у меня есть, это ResourceTiming, и я не могу понять, как определить, когда ответ полностью получен, нет такого поля, как responseEnd. - person cYrus; 27.11.2012
comment
Похоже, вы также можете прослушивать событие Network.loadingFinished. Если вы отфильтруете Network.responseReceived, вы получите уведомление, когда заголовок будет доступен, и вы сможете сохранить идентификатор запроса + другие метаданные о нем, а затем сопоставить его с loadingFinished, чтобы получить окончательную метку времени. - person igrigorik; 27.11.2012
comment
Отлично, теперь все должно быть хорошо. Спасибо за вашу помощь! - person cYrus; 29.11.2012
comment
Рад слышать. Если у вас где-нибудь есть код, хотелось бы взглянуть! - person igrigorik; 29.11.2012
comment
Большое спасибо за это решение. Я также использую для этого chrome-har-capturer. Но у меня есть один вопрос - можно ли сделать то же самое на каком-то сервере (не стационарном компьютере), где у меня есть только некоторый консольный доступ. Я имею в виду, зависит ли Chrome от действительного отображения браузера на рабочем столе, или он может работать и в консоли? Надеюсь вы понимаете меня :) - person Levsha; 29.04.2016
comment
Для тех, кто просто читает комментарии, @cYrus разместил код, который он придумал, на github как chrome -har-capturer, который он сейчас упоминает в конце своего вопроса - person Brad Parks; 22.09.2017

К настоящему времени для этого есть плагин для браузера: https://github.com/devtools-html/har-export-trigger

Он использует API WebExtensions DevTools, и я заставил его работать как с Firefox, так и с Chrome.

См. мой код для Chrome здесь: https://github.com/theri/web-measurement-tools/blob/master/load/load_url_using_chrome.py#L175

Автоматическая установка плагина в Chrome немного сложнее, чем в Firefox, но выполнима — я распаковал архив плагина локально, а затем сделал ссылку на него в chrome_prefs.json (см. тот же репозиторий).

person Theresa Enghardt    schedule 23.10.2018