Сервис Lighthouse
Сервис WebdriverIO, который позволяет вам запускать тесты доступности и производительности с помощью Google Lighthouse.
Примечание: на данный момент этот сервис поддерживает только тесты, запущенные в Google Chrome или Chromium! Учитывая, что большинство облачных поставщиков не предоставляют доступ к Chrome DevTools Protocol, этот сервис обычно работает только при локал ьном запуске тестов или через Selenium Grid версии 4 или выше.
Установка
Самый простой способ - это добавить @wdio/lighthouse-service как dev-зависимость в ваш package.json, с помощью:
npm install @wdio/lighthouse-service --save-dev
Инструкции по установке WebdriverIO можно найти здесь.
Конфигурация
Чтобы использовать сервис, вам просто нужно добавить его в список сервисов в вашем wdio.conf.js, например:
// wdio.conf.js
export const config = {
// ...
services: ['lighthouse'],
// ...
};
Использование
Сервис @wdio/lighthouse-service позволяет вам запускать тесты доступности и производительности Google Lighthouse через WebdriverIO.
Тестирование производительности
Сервис Lighthouse позволяет вам собирать данные о производительности при каждой загрузке страницы или переходе, вызванном кликом. Чтобы включить его, вызовите browser.enablePerformanceAudits(<options>). После того, как вы закончите сбор всех необходимых данных о производительности, отключите его, чтобы вернуть настройки дросселирования, например:
import assert from 'node:assert'
describe('JSON.org page', () => {
before(async () => {
await browser.enablePerformanceAudits()
})
it('should load within performance budget', async () => {
/**
* this page load will take a bit longer as the DevTools service will
* capture all metrics in the background
*/
await browser.url('http://json.org')
let metrics = await browser.getMetrics()
assert.ok(metrics.speedIndex < 1500) // check that speedIndex is below 1.5ms
let score = await browser.getPerformanceScore() // get Lighthouse Performance score
assert.ok(score >= .99) // Lighthouse Performance score is at 99% or higher
$('=Esperanto').click()
metrics = await browser.getMetrics()
assert.ok(metrics.speedIndex < 1500)
score = await browser.getPerformanceScore()
assert.ok(score >= .99)
})
after(async () => {
await browser.disablePerformanceAudits()
})
})
Доступны следующие команды с их результатами:
getMetrics
Получает наиболее часто используемые метрики производительности, например:
console.log(await browser.getMetrics())
/**
* { timeToFirstByte: 566,
* serverResponseTime: 566,
* domContentLoaded: 3397,
* firstVisualChange: 2610,
* firstPaint: 2822,
* firstContentfulPaint: 2822,
* firstMeaningfulPaint: 2822,
* largestContentfulPaint: 2822,
* lastVisualChange: 15572,
* interactive: 6135,
* load: 8429,
* speedIndex: 3259,
* totalBlockingTime: 31,
* maxPotentialFID: 161,
* cumulativeLayoutShift: 2822 }
*/
getDiagnostics
Получает полезную диагностическую информацию о загрузке страницы.
console.log(await browser.getDiagnostics())
/**
* { numRequests: 8,
* numScripts: 0,
* numStylesheets: 0,
* numFonts: 0,
* numTasks: 237,
* numTasksOver10ms: 5,
* numTasksOver25ms: 2,
* numTasksOver50ms: 2,
* numTasksOver100ms: 0,
* numTasksOver500ms: 0,
* rtt: 147.20600000000002,
* throughput: 47729.68474448835,
* maxRtt: 176.085,
* maxServerLatency: 1016.813,
* totalByteWeight: 62929,
* totalTaskTime: 254.07899999999978,
* mainDocumentTransferSize: 8023 }
*/
getMainThreadWorkBreakdown
Возвращает список с разбивкой всех задач основного потока и их общей продолжительностью.
console.log(await browser.getMainThreadWorkBreakdown())
/**
* [ { group: 'styleLayout', duration: 130.59099999999998 },
* { group: 'other', duration: 44.819 },
* { group: 'paintCompositeRender', duration: 13.732000000000005 },
* { group: 'parseHTML', duration: 3.9080000000000004 },
* { group: 'scriptEvaluation', duration: 2.437999999999999 },
* { group: 'scriptParseCompile', duration: 0.20800000000000002 } ]
*/
getPerformanceScore
Возвращает оценку производительности Lighthouse, которая является взвешенным средним следующих метрик: firstContentfulPaint, speedIndex, largestContentfulPaint, cumulativeLayoutShift, totalBlockingTime, interactive, maxPotentialFID или cumulativeLayoutShift.
console.log(await browser.getPerformanceScore())
/**
* 0.897826278457836
*/