Tests Visuels
Que peut-il faire ?
WebdriverIO fournit des comparaisons d'images sur les écrans, les éléments ou une page complète pour
- 🖥️ Navigateurs de bureau (Chrome / Firefox / Safari / Microsoft Edge)
- 📱 Navigateurs mobiles / tablettes (Chrome sur émulateurs Android / Safari sur simulateurs iOS / Simulateurs / appareils réels) via Appium
- 📱 Applications natives (émulateurs Android / simulateurs iOS / appareils réels) via Appium (🌟 NOUVEAU 🌟)
- 📳 Applications hybrides via Appium
grâce au @wdio/visual-service
qui est un service WebdriverIO léger.
Cela vous permet de :
- sauvegarder ou comparer des écrans/éléments/pages complètes par rapport à une référence
- automatiquement créer une référence lorsqu'aucune référence n'existe
- bloquer des régions personnalisées et même exclure automatiquement une barre d'état et/ou des barres d'outils (mobile uniquement) pendant une comparaison
- augmenter les dimensions des captures d'écran d'éléments
- masquer le texte pendant la comparaison de sites web pour :
- améliorer la stabilité et éviter les problèmes de rendu de police
- se concentrer uniquement sur la mise en page d'un site web
- utiliser différentes méthodes de comparaison et un ensemble de matchers supplémentaires pour des tests plus lisibles
- vérifier comment votre site web prendra en charge la navigation au clavier avec la touche Tab, voir aussi Navigation au clavier sur un site web
- et bien plus encore, voir les options de service et de méthode
Le service est un module léger pour récupérer les données et captures d'écran nécessaires pour tous les navigateurs/appareils. La puissance de comparaison provient de ResembleJS. Si vous souhaitez comparer des images en ligne, vous pouvez consulter l'outil en ligne.
Les méthodes saveScreen
, saveElement
, checkScreen
, checkElement
et les matchers toMatchScreenSnapshot
et toMatchElementSnapshot
peuvent être utilisés pour les applications/contextes natifs.
Veuillez utiliser la propriété isHybridApp:true
dans vos paramètres de service lorsque vous souhaitez l'utiliser pour des applications hybrides.
Installation
La façon la plus simple est de garder @wdio/visual-service
comme dépendance de développement dans votre package.json
, via :
npm install --save-dev @wdio/visual-service
Utilisation
@wdio/visual-service
peut être utilisé comme un service normal. Vous pouvez le configurer dans votre fichier de configuration comme suit :
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
services: [
[
"visual",
{
// Quelques options, voir la documentation pour plus d'informations
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
formatImageName: "{tag}-{logName}-{width}x{height}",
screenshotPath: path.join(process.cwd(), "tmp"),
savePerInstance: true,
// ... plus d'options
},
],
],
// ...
};
Plus d'options de service peuvent être trouvées ici.
Une fois configuré dans votre configuration WebdriverIO, vous pouvez ajouter des assertions visuelles à vos tests.
Capacités
Pour utiliser le module de tests visuels, vous n'avez pas besoin d'ajouter d'options supplémentaires à vos capacit és. Cependant, dans certains cas, vous pourriez vouloir ajouter des métadonnées supplémentaires à vos tests visuels, comme un logName
.
Le logName
vous permet d'attribuer un nom personnalisé à chaque capacité, qui peut ensuite être inclus dans les noms de fichiers d'images. C'est particulièrement utile pour distinguer les captures d'écran prises sur différents navigateurs, appareils ou configurations.
Pour activer cela, vous pouvez définir logName
dans la section capabilities
et vous assurer que l'option formatImageName
dans le service de tests visuels y fait référence. Voici comment vous pouvez le configurer :
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
capabilities: [
{
browserName: 'chrome',
'wdio-ics:options': {
logName: 'chrome-mac-15', // Nom de journal personnalisé pour Chrome
},
}
{
browserName: 'firefox',
'wdio-ics:options': {
logName: 'firefox-mac-15', // Nom de journal personnalisé pour Firefox
},
}
],
services: [
[
"visual",
{
// Quelques options, voir la documentation pour plus d'informations
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
screenshotPath: path.join(process.cwd(), "tmp"),
// Le format ci-dessous utilisera le `logName` des capacités
formatImageName: "{tag}-{logName}-{width}x{height}",
// ... plus d'options
},
],
],
// ...
};
Comment ça fonctionne
-
Configuration du
logName
:- Dans la section
capabilities
, attribuez unlogName
unique à chaque navigateur ou appareil. Par exemple,chrome-mac-15
identifie les tests exécutés sur Chrome sur macOS version 15.
- Dans la section
-
Nommage personnalisé des images :
-
L'option
formatImageName
intègre lelogName
dans les noms de fichiers des captures d'écran. Par exemple, si letag
est homepage et la résolution est1920x1080
, le nom de fichier résultant pourrait ressembler à ceci :homepage-chrome-mac-15-1920x1080.png
-
-
Avantages du nommage personnalisé :
- Distinguer les captures d'écran de différents navigateurs ou appareils devient beaucoup plus facile, surtout lors de la gestion des références et du débogage des différences.
-
Note sur les valeurs par défaut :
- Si
logName
n'est pas défini dans les capacités, l'optionformatImageName
l'affichera comme une chaîne vide dans les noms de fichiers (homepage--15-1920x1080.png
)
- Si
WebdriverIO MultiRemote
Nous prenons également en charge MultiRemote. Pour que cela fonctionne correctement, assurez-vous d'ajouter wdio-ics:options
à vos
capacités comme vous pouvez le voir ci-dessous. Cela garantira que chaque capture d'écran aura son propre nom unique.
Écrire vos tests ne sera pas différent par rapport à l'utilisation du testrunner
// wdio.conf.js
export const config = {
capabilities: {
chromeBrowserOne: {
capabilities: {
browserName: "chrome",
"goog:chromeOptions": {
args: ["disable-infobars"],
},
// CECI!!!
"wdio-ics:options": {
logName: "chrome-latest-one",
},
},
},
chromeBrowserTwo: {
capabilities: {
browserName: "chrome",
"goog:chromeOptions": {
args: ["disable-infobars"],
},
// CECI!!!
"wdio-ics:options": {
logName: "chrome-latest-two",
},
},
},
},
};
Exécution par programmation
Voici un exemple minimal d'utilisation de @wdio/visual-service
via les options 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",
},
});
// "Démarrer" le service pour ajouter les commandes personnalisées au `browser`
visualService.remoteSetup(browser);
await browser.url("https://webdriver.io/");
// ou utilisez ceci pour SEULEMENT sauvegarder une capture d'écran
await browser.saveFullPageScreen("examplePaged", {});
// ou utilisez ceci pour la validation. Les deux méthodes n'ont pas besoin d'être combinées, voir la FAQ
await browser.checkFullPageScreen("examplePaged", {});
await browser.deleteSession();
Navigation au clavier sur un site web
Vous pouvez vérifier si un site web est accessible en utilisant la touche TAB du clavier. Tester cette partie de l'accessibilité a toujours été un travail (manuel) chronophage et assez difficile à faire par l'automatisation.
Avec les méthodes saveTabbablePage
et checkTabbablePage
, vous pouvez maintenant dessiner des lignes et des points sur votre site web pour vérifier l'ordre de tabulation.
Sachez que cela n'est utile que pour les navigateurs de bureau et PAS pour les appareils mobiles. Tous les navigateurs de bureau prennent en charge cette fonctionnalité.
Ce travail est inspiré du billet de blog de Viv Richards sur "AUTOMATING PAGE TABABILITY (IS THAT A WORD?) WITH VISUAL TESTING".
La façon dont les éléments tabulables sont sélectionnés est basée sur le module tabbable. S'il y a des problèmes concernant la tabulation, veuillez consulter le README.md et en particulier la section More Details.
Comment ça fonctionne
Les deux méthodes créeront un élément canvas
sur votre site web et dessineront des lignes et des points pour vous montrer où votre TAB irait si un utilisateur final l'utilisait. Après cela, elles créeront une capture d'écran de la page complète pour vous donner un bon aperçu du flux.
Utilisez saveTabbablePage
uniquement lorsque vous devez créer une capture d'écran et que vous NE voulez PAS la comparer avec une image de référence.
Lorsque vous souhaitez comparer le flux de tabulation avec une référence, vous pouvez utiliser la méthode checkTabbablePage
. Vous N'avez PAS besoin d'utiliser les deux méthodes ensemble. S'il existe déjà une image de référence créée, ce qui peut être fait automatiquement en fournissant autoSaveBaseline: true
lors de l'instanciation du service,
checkTabbablePage
créera d'abord l'image actuelle puis la comparera à la référence.
Options
Les deux méthodes utilisent les mêmes options que saveFullPageScreen
ou
compareFullPageScreen
.
Exemple
Voici un exemple de fonctionnement de la tabulation sur notre site web guinea pig :
Mettre à jour automatiquement les instantanés visuels échoués
Mettez à jour les images de référence via la ligne de commande en ajoutant l'argument --update-visual-baseline
. Cela va
- automatiquement copier la capture d'écran réelle et la placer dans le dossier de référence
- s'il y a des différences, il fera passer le test car la référence a été mise à jour
Utilisation :
npm run test.local.desktop --update-visual-baseline
Lors de l'exécution en mode info/debug, vous verrez les journaux suivants ajoutés
[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] ..........
Support TypeScript
Ce module inclut la prise en charge de TypeScript, vous permettant de bénéficier de l'auto-complétion, de la sécurité des types et d'une meilleure expérience de développement lors de l'utilisation du service de tests visuels.
Étape 1 : Ajouter les définitions de types
Pour vous assurer que TypeScript reconnaît les types du module, ajoutez l'entrée suivante au champ types dans votre tsconfig.json :
{
"compilerOptions": {
"types": ["@wdio/visual-service"]
}
}
Étape 2 : Activer la sécurité des types pour les options de service
Pour appliquer la vérification des types sur les options de service, mettez à jour votre configuration WebdriverIO :
// wdio.conf.ts
import { join } from 'node:path';
// Importer la définition de type
import type { VisualServiceOptions } from '@wdio/visual-service';
export const config = {
// ...
// =====
// Setup
// =====
services: [
[
"visual",
{
// Options de service
baselineFolder: join(