Вы можете использовать page.metrics()
для сравнения двух точек во времени (например, до и после page.goto
). Подход page.evaluate
для чтения данных из performance
API также является хорошей альтернативой. Как я уже указывал в комментарии, не определено, что следует считать «полной загрузкой страницы». Оба подхода действительны.
Это еще сложнее
Есть ряд вещей, которые люди могут считать загружаемой страницей:
DOMContentLoaded
событие сработало
Load
событие сработало
- Время, которое требуется от начала навигации до тех пор, пока все ресурсы, встроенные в документ (например, загруженные изображения),
- Время от начала навигации до загрузки всех ресурсов
- Время до тех пор, пока не будет больше текущих сетевых запросов.
- ...
Вы также должны решить, хотите ли вы, чтобы связанные с сетью фазы (например, DNS) были частью измерения. Вот пример запроса (сгенерированный с помощью вкладки Chrome DevTools Network), показывающий, насколько сложным может быть один запрос:
Существует также документ , объясняющий каждый из этих этапов.
Простой подход
Самый простой способ измерить время загрузки - это просто начать измерение при запуске навигации и прекратить измерение после загрузки страницы. Это можно сделать так:
const t1 = Date.now();
await page.goto('https://example.com');
const diff1 = Date.now() - t1;
console.log(`Time: ${diff1}ms`);
Обратите внимание, что есть и другие API (page.metrics
, process.hrtime
, perf_hooks
) для получения более точных временных отметок.
Вы также можете передать опции в функцию page.goto
, чтобы изменить разрешение обещания на что-то вроде этого (цитируется в документации):
Считать, что навигация завершена, если не более 0 сетевых подключений в течение не менее 500 мс
Для этого вам нужно будет использовать настройку networkidle0
:
await page.goto('https://example.com', { waitUntil: 'networkidle0' });
В документах, связанных выше, вы также можете использовать другие события.
Более сложный: используйте Performance API
Чтобы получить более точные результаты, вы можете использовать Performance API , как вы уже сделали в своем коде. Вместо прохождения прототипа window.performance
вы также можете использовать функции performance.getEntries()
или performance.toJSON()
, например:
const perfData = await page.evaluate(() =>
JSON.stringify(performance.toJSON(), null, 2)
);
Таким образом, вы получаете данные, которые выглядят так:
{
"timeOrigin": 1556727036740.113,
"timing": {
"navigationStart": 1556727036740,
"unloadEventStart": 0,
"unloadEventEnd": 0,
"redirectStart": 0,
"redirectEnd": 0,
"fetchStart": 1556727037227,
"domainLookupStart": 1556727037230,
"domainLookupEnd": 1556727037280,
"connectStart": 1556727037280,
"connectEnd": 1556727037348,
"secureConnectionStart": 1556727037295,
"requestStart": 1556727037349,
"responseStart": 1556727037548,
"responseEnd": 1556727037805,
"domLoading": 1556727037566,
"domInteractive": 1556727038555,
"domContentLoadedEventStart": 1556727038555,
"domContentLoadedEventEnd": 1556727038570,
"domComplete": 1556727039073,
"loadEventStart": 1556727039073,
"loadEventEnd": 1556727039085
},
"navigation": {
"type": 0,
"redirectCount": 0
}
}
Поэтому, если вы хотите узнать, сколько времени ушло с navigationStart
до loadEventStart
, вы вычтите одно значение из другого (например, 1556727039073
- 1556727036740
= 2333
мс).
Так какой же взять?
Это ваше решение. В целом, хорошей идеей является использование события Load
в качестве отправной точки. Ожидание завершения всех запросов может фактически никогда не произойти, поскольку в фоновом режиме постоянно загружаются ресурсы. Использование networkidle2
в качестве waitUntil
опция может быть альтернативой, если вы не хотите использовать событие загрузки.
В конце, однако, все зависит от вашего варианта использования.