Testowanie Wizualne
Co potrafi?
WebdriverIO zapewnia porównywanie obrazów ekranów, elementów lub całych stron dla
- 🖥️ Przeglądarek desktopowych (Chrome / Firefox / Safari / Microsoft Edge)
- 📱 Przeglądarek mobilnych / tabletowych (Chrome na emulatorach Androida / Safari na symulatorach iOS / Symulatory / prawdziwe urządzenia) poprzez Appium
- 📱 Natywnych aplikacji (emulatory Androida / symulatory iOS / prawdziwe urządzenia) poprzez Appium (🌟 NOWOŚĆ 🌟)
- 📳 Aplikacji hybrydowych poprzez Appium
za pomocą @wdio/visual-service
, która jest lekką usługą WebdriverIO.
Pozwala to na:
- zapisywanie lub porównywanie ekranów/elementów/pełnych stron z bazą odniesienia
- automatyczne tworzenie bazy odniesienia, gdy takowa nie istnieje
- blokowanie niestandardowych regionów a nawet automatyczne wykluczanie paska statusu i/lub pasków narzędziowych (tylko mobilne) podczas porównania
- zwiększanie wymiarów zrzutów ekranu elementów
- ukrywanie tekstu podczas porównywania stron internetowych, aby:
- poprawić stabilność i zapobiec problemom z renderowaniem czcionek
- skupić się tylko na układzie strony internetowej
- używanie różnych metod porównania i zestawu dodatkowych matcherów dla lepiej czytelnych testów
- weryfikację jak Twoja strona obsługuje nawigację za pomocą klawisza Tab, zobacz również Nawigacja po stronie za pomocą tabulatora
- i wiele więcej, zobacz opcje usługi i metody
Usługa jest lekkim modułem do pobierania potrzebnych danych i zrzutów ekranu dla wszystkich przeglądarek/urządzeń. Moc porównawcza pochodzi z ResembleJS. Jeśli chcesz porównać obrazy online, możesz sprawdzić narzędzie online.
Metody saveScreen
, saveElement
, checkScreen
, checkElement
oraz matchery toMatchScreenSnapshot
i toMatchElementSnapshot
mogą być używane dla aplikacji natywnych/kontekstu.
Prosz ę użyć właściwości isHybridApp:true
w ustawieniach usługi, gdy chcesz używać jej dla aplikacji hybrydowych.
Instalacja
Najprostszym sposobem jest utrzymanie @wdio/visual-service
jako dev-dependency w twoim package.json
, poprzez:
npm install --save-dev @wdio/visual-service
Użycie
@wdio/visual-service
może być używany jako normalna usługa. Możesz skonfigurować go w swoim pliku konfiguracyjnym w następujący sposób:
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
services: [
[
"visual",
{
// Niektóre opcje, zobacz dokumentację, aby uzyskać więcej informacji
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
formatImageName: "{tag}-{logName}-{width}x{height}",
screenshotPath: path.join(process.cwd(), "tmp"),
savePerInstance: true,
// ... więcej opcji
},
],
],
// ...
};
Więcej opcji usługi można znaleźć tutaj.
Po skonfigurowaniu w konfiguracji WebdriverIO możesz przejść do dodawania asercji wizualnych do swoich testów.
Możliwości
Aby korzystać z modułu testowania wizualnego, nie musisz dodawać żadnych dodatkowych opcji do swoich capabilities. Jednak w niektórych przypadkach, możesz chcieć dodać dodatkowe metadane do swoich testów wizualnych, takie jak logName
.
logName
pozwala przypisać niestandardową nazwę do każdego capability, która może być następnie uwzględniona w nazwach plików obrazów. Jest to szczególnie przydatne do rozróżniania zrzutów ekranu wykonanych na różnych przeglądarkach, urządzeniach lub konfiguracjach.
Aby to włączyć, możesz zdefiniować logName
w sekcji capabilities
i upewnić się, że opcja formatImageName
w usłudze testowania wizualnego odwołuje się do niej. Oto jak możesz to skonfigurować:
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
capabilities: [
{
browserName: 'chrome',
'wdio-ics:options': {
logName: 'chrome-mac-15', // Niestandardowa nazwa dla Chrome
},
}
{
browserName: 'firefox',
'wdio-ics:options': {
logName: 'firefox-mac-15', // Niestandardowa nazwa dla Firefox
},
}
],
services: [
[
"visual",
{
// Niektóre opcje, zobacz dokumentację, aby uzyskać więcej informacji
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
screenshotPath: path.join(process.cwd(), "tmp"),
// Poniższy format będzie używać `logName` z capabilities
formatImageName: "{tag}-{logName}-{width}x{height}",
// ... więcej opcji
},
],
],
// ...
};
Jak to działa
-
Konfiguracja
logName
:- W sekcji
capabilities
przypisz unikalnąlogName
do każdej przeglądarki lub urządzenia. Na przykład,chrome-mac-15
identyfikuje testy uruchamiane na Chrome na macOS w wersji 15.
- W sekcji
-
Niestandardowe nazewnictwo obrazów:
-
Opcja
formatImageName
integrujelogName
w nazwach plików zrzutów ekranu. Na przykład, jeślitag
to homepage, a rozdzielczość to1920x1080
, wynikowa nazwa pliku może wyglądać tak:homepage-chrome-mac-15-1920x1080.png
-
-
Korzyści niestandardowego nazewnictwa:
- Rozróżnianie między zrzutami ekranu z różnych przeglądarek lub urządzeń staje się znacznie łatwiejsze, szczególnie przy zarządzaniu bazami odniesienia i debugowaniu rozbieżności.
-
Uwaga o domyślnych wartościach:
-Jeśli
logName
nie jest ustawione w capabilities, opcjaformatImageName
pokaże ją jako pusty ciąg w nazwach plików (homepage--15-1920x1080.png
)
WebdriverIO MultiRemote
Wspieramy również MultiRemote. Aby to działało poprawnie, upewnij się, że dodałeś wdio-ics:options
do swoich
capabilities, jak możesz zobaczyć poniżej. Zapewni to, że każdy zrzut ekranu będzie miał swoją własną unikalną nazwę.
Pisanie testów nie będzie różnić się w porównaniu do korzystania z testrunner
// wdio.conf.js
export const config = {
capabilities: {
chromeBrowserOne: {
capabilities: {
browserName: "chrome",
"goog:chromeOptions": {
args: ["disable-infobars"],
},
// TO!!!
"wdio-ics:options": {
logName: "chrome-latest-one",
},
},
},
chromeBrowserTwo: {
capabilities: {
browserName: "chrome",
"goog:chromeOptions": {
args: ["disable-infobars"],
},
// TO!!!
"wdio-ics:options": {
logName: "chrome-latest-two",
},
},
},
},
};
Uruchamianie programistyczne
Oto minimalny przykład użycia @wdio/visual-service
za pomocą opcji remote
:
import { remote } from "webdriverio";
import VisualService from "@wdio/visual-service";
let visualService = new VisualService({
autoSaveBaseline: true,
});
const browser = await remote({
logLevel: "silent",
capabilities: {
browserName: "chrome",
},
});
// "Uruchom" usługę, aby dodać niestandardowe polecenia do `browser`
visualService.remoteSetup(browser);
await browser.url("https://webdriver.io/");
// lub użyj tego do TYLKO zapisania zrzutu ekranu
await browser.saveFullPageScreen("examplePaged", {});
// lub użyj tego do walidacji. Obie metody nie muszą być łączone, patrz FAQ
await browser.checkFullPageScreen("examplePaged", {});
await browser.deleteSession();
Nawigacja po stronie za pomocą tabulatora
Możesz sprawdzić, czy strona internetowa jest dostępna, używając klawisza TAB. Testowanie tej części dostępności zawsze było czasochłonnym (ręcznym) zadaniem i dość trudnym do zautomatyzowania.
Dzięki metodom saveTabbablePage
i checkTabbablePage
możesz teraz narysować linie i kropki na swojej stronie, aby zweryfikować kolejność tabulatorów.
Pamiętaj, że jest to przydatne tylko dla przeglądarek desktopowych i NIE** dla urządzeń mobilnych. Wszystkie przeglądarki desktopowe obsługują tę funkcję.
Praca jest inspirowana postem na blogu Viva Richardsa o "AUTOMATING PAGE TABABILITY (IS THAT A WORD?) WITH VISUAL TESTING".
Sposób wybierania elementów podlegających nawigacji za pomocą tabulatora opiera się na module tabbable. Jeśli są jakiekolwiek problemy dotyczące tabulacji, sprawdź README.md, a zwłaszcza sekcję More Details.
Jak to działa
Obie metody utworzą element canvas
na Twojej stronie i narysują linie i kropki, aby pokazać Ci, gdzie poszedłby Twój TAB, gdyby użytkownik końcowy go użył. Następnie zostanie wykonany zrzut ekranu całej strony, aby dać Ci dobry przegląd przepływu.
**Używaj saveTabbablePage
tylko wtedy, gdy potrzebujesz utworzyć zrzut ekranu i NIE chcesz go porównywać **z obrazem bazowym.****
Gdy chcesz porównać przepływ tabulacji z bazą odniesienia, możesz użyć metody checkTabbablePage
. NIE musisz używać obu metod razem. Jeśli już istnieje obraz bazowy, który może zostać automatycznie utworzony poprzez dostarczenie autoSaveBaseline: true
podczas inicjalizacji usługi,
checkTabbablePage
najpierw utworzy obraz rzeczywisty, a następnie porówna go z bazą odniesienia.
Opcje
Obie metody używają tych samych opcji co saveFullPageScreen
lub
compareFullPageScreen
.
Przykład
Oto przykład działania tabulacji na naszej testowej stronie:
Automatycznie aktualizuj nieudane zrzuty wizualne
Aktualizuj obrazy bazowe przez wiersz poleceń, dodając argument --update-visual-baseline
. Spowoduje to
- automatyczne skopiowanie aktualnego zrzutu ekranu i umieszczenie go w folderze bazowym
- jeśli są różnice, test przejdzie, ponieważ baza odniesienia została zaktualizowana
Użycie:
npm run test.local.desktop --update-visual-baseline
Podczas uruchamiania w trybie logów info/debug zobaczysz następujące dodane logi
[0-0] ..............
[0-0] #####################################################################################
[0-0] INFO:
[0-0] Updated the actual image to
[0-0] /Users/wswebcreation/Git/wdio/visual-testing/localBaseline/chromel/demo-chrome-1366x768.png
[0-0] #####################################################################################
[0-0] ..........
Wsparcie dla TypeScript
Ten moduł zawiera wsparcie dla TypeScript, pozwalając korzystać z auto-uzupełniania, bezpieczeństwa typów i ulepszonego środowiska programistycznego podczas korzystania z usługi testowania wizualnego.
Krok 1: Dodaj definicje typów
Aby upewnić się, że TypeScript rozpoznaje typy modułu, dodaj następujący wpis do pola types w swoim tsconfig.json:
{
"compilerOptions": {
"types": ["@wdio/visual-service"]
}
}
Krok 2: Włącz bezpieczeństwo typów dla opcji usługi
Aby wymusić sprawdzanie typów na opcjach usługi, zaktualizuj swoją konfigurację WebdriverIO:
// wdio.conf.ts
import { join } from 'node:path';
// Importuj definicję typu
import type { VisualServiceOptions } from '@wdio/visual-service';
export const config = {
// ...
// =====
// Setup
// =====
services: [
[
"visual",
{
// Opcje usługi
baselineFolder: join(process.cwd(), './__snapshots__/'),
formatImageName: '{tag}-{logName}-{width}x{height}',
screenshotPath: join(process.cwd(), '.tmp/'),
} satisfies VisualServiceOptions, // Zapewnia bezpieczeństwo typów
],
],
// ...
};
Wymagania systemowe
Wersja 5 i wyższe
Dla wersji 5 i wyższych, moduł ten jest czysto oparty na JavaScript bez dodatkowych zależności systemowych poza ogólnymi wymaganiami projektu. Używa Jimp, który jest biblioteką przetwarzania obrazów dla Node napisaną całkowicie w JavaScript, bez natywnych zależności.
Wersja 4 i niższe
Dla wersji 4 i niższych, moduł ten opiera się na Canvas, implementacji canvas dla Node.js. Canvas zależy od Cairo.
Szczegóły instalacji
Domyślnie, binaria dla macOS, Linux i Windows zostaną pobrane podczas instalacji npm install
twojego projektu. Jeśli nie masz obsługiwanego systemu operacyjnego lub architektury procesora, moduł zostanie skompilowany na twoim systemie. Wymaga to kilku zależności, w tym Cairo i Pango.
Szczegółowe informacje na temat instalacji znajdziesz w wiki node-canvas. Poniżej znajdują się jednolinijkowe instrukcje instalacji dla popularnych systemów operacyjnych. Zauważ, że libgif/giflib
, librsvg
i libjpeg
są opcjonalne i potrzebne tylko dla obsługi GIF, SVG i JPEG. Wymagany jest Cairo v1.10.0 lub nowszy.
- OS
- Ubuntu
- Fedora
- Solaris
- OpenBSD
- Window
- Others
Używając Homebrew:
brew install pkg-config cairo pango libpng jpeg giflib librsvg pixman
Mac OS X v10.11+: Jeśli niedawno zaktualizowałeś do Mac OS X v10.11+ i doświadczasz problemów podczas kompilacji, uruchom następujące polecenie: xcode-select --install
. Przeczytaj więcej o problemie na Stack Overflow.
Jeśli masz zainstalowany Xcode 10.0 lub nowszy, aby zbudować ze źródeł potrzebujesz NPM 6.4.1 lub nowszego.
sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
sudo yum install gcc-c++ cairo-devel pango-devel libjpeg-turbo-devel giflib-devel
pkgin install cairo pango pkg-config xproto renderproto kbproto xextproto
doas pkg_add cairo pango png jpeg giflib
Zobacz wiki
Zobacz wiki