Сервис 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
*/
enablePerformanceAudits
Включает автоматический аудит производительности для всех загрузок страниц, вызванных командой url
, нажатием на ссылку или любым другим действием, вызывающим загрузку страницы. Вы можете передать объект конфигурации для определения некоторых параметров дросселирования. Профиль дросселирования по умолчанию - сеть Good 3G
с 4-кратным ограничением CPU.
await browser.enablePerformanceAudits({
networkThrottling: 'Good 3G',
cpuThrottling: 4,
cacheEnabled: true,
formFactor: 'mobile'
})
Доступны следующие профили дросселирования сети: offline
, GPRS
, Regular 2G
, Good 2G
, Regular 3G
, Good 3G
, Regular 4G
, DSL
, Wifi
и online
(без дросселирования).
Тестирование PWA
С помощью команды checkPWA
вы можете проверить, соответствует ли ваше веб-приложение последним веб-стандартам прогрессивных веб-приложений. Проверяется:
- устанавливаемо ли ваше приложение
- предоставляет ли service worker
- имеет ли экран-заставку
- предоставляет ли Apple Touch и Maskable иконки
- может ли обслуживаться на мобильных устройствах
Если вы не заинтересованы в одной из этих проверок, вы можете передать список проверок, которые хотите выполнить. Свойство passed
вернет true
, если все проверки пройдены. Если они не проходят, вы можете использовать свойство details
для обогащения своего сообщения об ошибке деталями сбоя.
// open page first
await browser.url('https://webdriver.io')
// validate PWA
const result = await browser.checkPWA()
expect(result.passed).toBe(true)
Команда startTracing(categories, samplingFrequency)
Начинает трассировку браузера. Вы можете опционально передать пользовательские категории трассировки (по умолчанию этот список) и частоту выборки (по умолчанию 10000
).
await browser.startTracing()