Przejdź do głównej treści

Usługa Lighthouse

Usługa WebdriverIO umożliwiająca przeprowadzanie testów dostępności i wydajności za pomocą Google Lighthouse.

Uwaga: ta usługa obecnie obsługuje tylko testy uruchamiane na Google Chrome lub Chromium! Biorąc pod uwagę, że większość dostawców chmurowych nie udostępnia dostępu do Chrome DevTools Protocol, ta usługa zwykle działa tylko podczas lokalnego uruchamiania testów lub przez Selenium Grid w wersji 4 lub wyższej.

Instalacja

Najprostszym sposobem jest utrzymywanie @wdio/lighthouse-service jako zależności deweloperskiej w pliku package.json, poprzez:

npm install @wdio/lighthouse-service --save-dev

Instrukcje dotyczące instalacji WebdriverIO można znaleźć tutaj.

Konfiguracja

Aby korzystać z usługi, wystarczy dodać ją do listy usług w pliku wdio.conf.js, na przykład:

// wdio.conf.js
export const config = {
// ...
services: ['lighthouse'],
// ...
};

Użycie

Usługa @wdio/lighthouse-service umożliwia uruchamianie testów dostępności i wydajności Google Lighthouse poprzez WebdriverIO.

Testy wydajnościowe

Usługa Lighthouse umożliwia przechwytywanie danych o wydajności z każdego ładowania strony lub przejścia strony spowodowanego kliknięciem. Aby ją włączyć, wywołaj browser.enablePerformanceAudits(<options>). Po zakończeniu przechwytywania wszystkich niezbędnych danych o wydajności wyłącz ją, aby przywrócić ustawienia throttlingu, np.:

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()
})
})

Dostępne są następujące polecenia wraz z ich wynikami:

getMetrics

Pobiera najczęściej używane metryki wydajności, np.:

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

Pobiera przydatne diagnostyki dotyczące ładowania strony.

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

Zwraca listę z podziałem wszystkich zadań głównego wątku i ich całkowitym czasem trwania.

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

Zwraca ocenę wydajności Lighthouse, która jest średnią ważoną następujących metryk: firstContentfulPaint, speedIndex, largestContentfulPaint, cumulativeLayoutShift, totalBlockingTime, interactive, maxPotentialFID lub cumulativeLayoutShift.

console.log(await browser.getPerformanceScore())
/**
* 0.897826278457836
*/

enablePerformanceAudits

Włącza automatyczne audyty wydajności dla wszystkich ładowań stron, które są spowodowane wywołaniem polecenia url lub kliknięciem na link, lub czymkolwiek, co powoduje załadowanie strony. Możesz przekazać obiekt konfiguracyjny, aby określić opcje throttlingu. Domyślny profil throttlingu to sieć Good 3G z 4-krotnym throttlingiem CPU.

await browser.enablePerformanceAudits({
networkThrottling: 'Good 3G',
cpuThrottling: 4,
cacheEnabled: true,
formFactor: 'mobile'
})

Dostępne są następujące profile throttlingu sieci: offline, GPRS, Regular 2G, Good 2G, Regular 3G, Good 3G, Regular 4G, DSL, Wifi i online (bez throttlingu).

Testowanie PWA

Za pomocą polecenia checkPWA możesz sprawdzić, czy Twoja aplikacja internetowa jest zgodna z najnowszymi standardami internetowymi w zakresie progresywnych aplikacji internetowych. Sprawdza:

  • czy Twoja aplikacja może być zainstalowana
  • zapewnia service worker
  • ma ekran powitalny
  • zapewnia ikony Apple Touch i Maskable
  • może być używana na urządzeniach mobilnych

Jeśli nie jesteś zainteresowany jednym z tych sprawdzeń, możesz przekazać listę sprawdzeń, które chcesz przeprowadzić. Właściwość passed zwróci true, jeśli wszystkie sprawdzenia zostaną zaliczone. Jeśli nie powiodą się, możesz użyć właściwości details, aby wzbogacić komunikat o błędzie szczegółami niepowodzenia.

// open page first
await browser.url('https://webdriver.io')
// validate PWA
const result = await browser.checkPWA()
expect(result.passed).toBe(true)

Polecenie startTracing(categories, samplingFrequency)

Rozpocznij śledzenie przeglądarki. Opcjonalnie możesz przekazać niestandardowe kategorie śledzenia (domyślnie ta lista) i częstotliwość próbkowania (domyślnie 10000).

await browser.startTracing()

Polecenie endTracing

Zatrzymaj śledzenie przeglądarki.

await browser.endTracing()

Polecenie getTraceLogs

Zwraca dzienniki śledzenia, które zostały przechwycone w okresie śledzenia. Możesz użyć tego polecenia do przechowywania dzienników śledzenia w systemie plików, aby analizować śledzenie przez interfejs 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()))

Polecenie getPageWeight

Zwraca informacje o wadze strony z ostatniego ładowania strony.

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 } }
// }

Więcej informacji na temat WebdriverIO można znaleźć na stronie głównej.

Welcome! How can I help?

WebdriverIO AI Copilot