Сервіс 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
з 4x обмеженням 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 Icons
- чи може він обслуговуватися на мобільних пристроях
Якщо ви не зацікавлені в якійсь із цих перевірок, ви можете передати список перевірок, які ви хочете виконати. Властивість 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()
Команда endTracing
Зупиняє трасування браузера.
await browser.endTracing()
Команда getTraceLogs
Повертає журнали трасування, які були захоплені протягом періоду трасування. Ви можете використовувати цю команду для збереження журналів трасування у файловій системі для аналізу трасування через інтерфейс Chrome DevTools.
import fs from 'node:fs/promises'
await browser.startTracing()
await browser.url('http://json.org')
await browser.endTracing()
await fs.writeFile('/path/to/tracelog.json', JSON.stringify(browser.getTraceLogs()))
Команда getPageWeight
Повертає інформацію про вагу сторінки останнього завантаження сторінки.
await browser.startTracing()
await browser.url('https://webdriver.io')
await browser.endTracing()
console.log(await browser.getPageWeight())
// outputs:
// { pageWeight: 2438485,
// transferred: 1139136,
// requestCount: 72,
// details: {
// Document: { size: 221705, encoded: 85386, count: 11 },
// Stylesheet: { size: 52712, encoded: 50130, count: 2 },
// Image: { size: 495023, encoded: 482433, count: 36 },
// Script: { size: 1073597, encoded: 322854, count: 15 },
// Font: { size: 84412, encoded: 84412, count: 5 },
// Other: { size: 1790, encoded: 1790, count: 2 },
// XHR: { size: 509246, encoded: 112131, count: 1 } }
// }
Для отримання додаткової інформації про WebdriverIO відвідайте домашню сторінку.