Playwright-OWUI - Tests E2E pédagogiques pour Open WebUI
← Plateformes conversationnelles | ← Documentation GenAI | ↑ Open-WebUI | → Vibe-Coding
Refonte pédagogique livrée (#4433, fermée 2026-08-12). Cette série évolue d’un banc de tests vers un parcours QA narratif : fil rouge « QA Engineer d’une flotte GenAI multi-tenant », format hybride notebook + tests E2E réels conservés en backend, et projet de certification final. Point d’entrée : 00-Parcours-QA-OWUI.md (cadrage de la mission). La flotte multi-tenant tourne sur Open WebUI v0.11.0 (depuis le 2026-08-07) ; les modules 01-06 ont été revalidés contre cette version (campagne #9854, 2026-08-10 — 37 passed / 1 failed / 4 skipped, l’unique rouge étant un défaut de test, pas de l’application). Le module 06 démontre les nouveautés v0.10 (mémoire, dossiers d’équipe, raisonnement streamé) ; les pièges v0.11 mesurés (drift DOM, payload chat
chat_id+id) sont documentés dans WHATS-NEW-v0.11.md.
Série pédagogique complète pour apprendre Playwright (framework de tests E2E) en testant une application réelle : Open WebUI, une plateforme de chat IA générative.
Format particulier : Contrairement aux autres sous-domaines GenAI qui utilisent des Jupyter Notebooks (.ipynb), cette série utilise des fichiers TypeScript (.spec.ts) exécutés par Playwright. Chaque module contient un
README.mdavec la théorie et les explications, et un fichier.spec.tsavec les tests commentés qui servent d’exercices pratiques. Les tests sont auto-documentés : chaque test contient des commentaires pédagogiques expliquant les concepts, et des exercices supplémentaires à compléter par l’étudiant.
Pourquoi cette série ?
Cette série se distingue des tutoriels Playwright classiques par son sujet : - On ne teste pas un simple formulaire ou une todo-list - On teste une vraie application de production avec des modèles d’IA générative - Les défis sont réels : streaming, non-déterminisme, latence variable, multi-tenant
Structure
Playwright-OWUI/
├── 01-decouverte/ # Premier contact avec Playwright
│ ├── README.md # Théorie + exercices
│ └── 01-decouverte.spec.ts # 4 tests : navigation, sélecteurs, screenshots
├── 02-navigation-authentification/ # Auth & navigation dans OWUI
│ ├── README.md
│ └── 02-navigation-auth.spec.ts # 8 tests : login, admin, workspace, channels
├── 03-chat-streaming/ # Le coeur : tester le chat IA
│ ├── README.md
│ └── 03-chat-streaming.spec.ts # 7 tests : chat, streaming, markdown, edit
├── 04-rag-tools-avances/ # RAG, MCP tools, channels
│ ├── README.md
│ └── 04-rag-tools.spec.ts # 7 tests : KBs, outils MCP, canaux
├── 05-multi-tenant-ci/ # API tests, multi-tenant, CI/CD
│ ├── README.md
│ └── 05-api-multi-tenant.spec.ts # 8 tests : API REST, isolation, partage
├── 06-nouveautes-v0.10/ # Nouveautés v0.10 (mémoire, dossiers, raisonnement)
│ ├── README.md
│ └── 06-nouveautes.spec.ts # 7 tests : mémoire, dossiers, raisonnement, compaction
├── helpers/ # Fonctions utilitaires réutilisables
│ ├── selectors.ts # Sélecteurs CSS centralisés (+ REASONING/FOLDER/MEMORY)
│ ├── chat.ts # Helpers d'interaction chat
│ └── api.ts # Client API REST (+ mémoire & dossiers v0.10)
├── fixtures/ # Setup et configuration
│ └── auth.setup.ts # Authentification automatique
├── .auth/ # Sessions sauvegardées (gitignore)
├── .env.example # Template de configuration
├── .gitignore
├── package.json
├── tsconfig.json # Typecheck CI (tsc --noEmit)
├── playwright.config.ts
├── WHATS-NEW-v0.9.1.md # Nouveautés v0.9.1 (historique)
├── WHATS-NEW-v0.10.md # Nouveautés v0.10 (côté étudiant)
├── WHATS-NEW-v0.11.md # Nouveautés v0.11 (refonte de l'interface)
├── TRIAGE-INFRA-VS-TEST.md # Guide transversal : app, test ou infra ?
└── README.md # Ce fichier
Périmètre publiable
Cette section documente ce qui est commité dans le harnais et ce qui est ignoré, avec le motif. Décision tranchée par #10025 (livrable 1 — périmètre publiable ; le livrable 2, les patterns .gitignore globaux, est dans la PR #10057).
Committé
| Catégorie | Fichiers | Motif |
|---|---|---|
| Spécifications de tests | 01-decouverte/*.spec.ts, 02-navigation-authentification/*.spec.ts, 03-chat-streaming/*.spec.ts, 04-rag-tools-avances/*.spec.ts, 05-multi-tenant-ci/*.spec.ts, 06-nouveautes-v0.10/*.spec.ts |
Code pédagogique, reproductible par quiconque clone le dépôt |
| Helpers et fixtures | helpers/selectors.ts, helpers/chat.ts, helpers/api.ts, fixtures/auth.setup.ts |
Code utilitaire partagé entre modules |
| Configuration | playwright.config.ts, tsconfig.json, package.json, package-lock.json |
Lockfile = reproductibilité d’npm install |
| Notebooks pédagogiques | 00-Parcours-QA-OWUI.ipynb, 01..06/*/[Module].ipynb |
Format hybride notebook + .spec.ts (cf. supra) |
| Documentation | README.md (ce fichier), 00-Parcours-QA-OWUI.md, TRIAGE-INFRA-VS-TEST.md, WHATS-NEW-v0.9.1.md, WHATS-NEW-v0.10.md, WHATS-NEW-v0.11.md, 01..06/README.md |
Cadrage pédagogique et guides transverses |
| Template de configuration | .env.example |
8 clés actives + 7 commentées (optionnelles), valeurs vides ou exemples neutres (OWUI_URL=https://open-webui.example.com, OWUI_EMAIL=your_email_here, etc.). Aucune valeur réelle. |
Ignoré (jamais committé)
| Pattern | Motif |
|---|---|
.env |
SECRET — credentials utilisateur, jamais versionné |
.auth/*.json |
SECRET — Playwright storageState contient les cookies de session authentifiés |
storage-state*.json (racine) |
SECRET — idem, scope global (PR #10057) |
playwright/.auth/ (racine) |
SECRET — idem, scope global (PR #10057) |
node_modules/ |
REGENERABLE — npm install suffit, pollue le diff |
dist/ |
REGENERABLE — tsc rebuild, artefacts TypeScript |
playwright-report/, test-results/, blob-report/ |
REGENERABLE — sortie HTML/JSON de npx playwright test, régénérable à chaque run |
playwright/.cache/ (racine) |
REGENERABLE — cache browser downloads |
Vérifications après la PR
# 1. Check-ignore sur les 3 chemins sensibles
git check-ignore -v <racine>/.auth/owui.json # → ignoré
git check-ignore -v <racine>/playwright-report/index.html # → ignoré
git check-ignore -v <racine>/test-results/.last-run.json # → ignoré
# 2. git add -An (dry-run) doit ne rien proposer de sensible
git add -An -- MyIA.AI.Notebooks/GenAI/Plateformes-Conversationnelles/Open-WebUI/Playwright-OWUI/
# (vide)
# 3. Aucun fichier credential-class dans l'index
git ls-files | grep -ciE '\.auth/|storage[-_]?state'
# 0Voir aussi
- Issue #10025 — décision du périmètre publiable (ce document)
- PR #10057 —
chore(gitignore,#10025): ignore Playwright storage-state (session cookies) + test artifacts(patterns.gitignoreglobaux) - Issue #10021 — même défaut de fond : harnais de calcul non committé → sorties invérifiables
- Issue #16 — provisioning OWUI/auth services (territoire po-2023)
Modules
Module 01 — Découverte de Playwright & OWUI (2-3h)
Niveau Débutant
- Installation et configuration de Playwright
- Premier test : vérifier le chargement de la page
- Sélecteurs CSS, ARIA, et sémantiques
- Mode headed et screenshots
- 4 tests + exercices
Module 03 — Chat & Streaming LLM (3h)
Niveau Intermédiaire
- L’éditeur TipTap :
keyboard.type()vsfill() - Gestion du streaming (polling, waitForFunction)
- Assertions sur du contenu non-déterministe
- Skip gracieux pour services indisponibles
- Actions sur les messages (régénérer, éditer)
- 7 tests + exercices
Module 04 — RAG, Outils MCP & Fonctionnalités avancées (3h)
Niveau Intermédiaire+
- RAG : attacher une Knowledge Base via le raccourci #
- Outils MCP (Model Context Protocol) : recherche web
- Channels : canaux de discussion collaborative
- Tests conditionnels sur la configuration
- 7 tests + exercices
Module 05 — Multi-tenant, API Testing & CI/CD (3-4h)
Niveau Expert
- Tests API avec APIRequestContext (sans navigateur)
- Architecture multi-tenant : isolation et partage
- Comparaison cross-instance de données
- Intégration CI/CD (GitHub Actions)
- 8 tests + exercices
Module 06 — Les nouveautés v0.10 (3h)
Niveau Expert
- Mémoire persistante : CRUD via API + preuve du champ
type(nouveauté v0.10) - Dossiers et partage d’équipe (permissions lecture/écriture)
- Raisonnement streamé : afficher le bloc « réflexion » d’un modèle thinking (skip gracieux)
- Compaction automatique du contexte : vérifier que le fil de conversation tient sur plusieurs tours
- Détection de fonctionnalité (feature-detection) et nettoyage systématique via
finally - 7 tests + exercices — voir aussi WHATS-NEW-v0.10.md
Installation rapide (5 minutes)
1. Prerequisites
- Node.js 18+ installé (nodejs.org)
- Une instance Open WebUI accessible :
- Instance de cours fournie par l’enseignant, OU
- Instance locale via Docker :
docker run -p 3000:8080 ghcr.io/open-webui/open-webui:main
2. Installation
# Se placer dans le répertoire
cd GenAI/Playwright-OWUI
# Installer les dépendances
npm install
# Installer le navigateur Chromium (télécharge ~200 Mo)
npx playwright install chromium3. Configuration
# Copier le template de configuration
cp .env.example .env
# Editer .env avec vos identifiants
# (Utilisez votre éditeur préféré)Variables minimales à remplir dans .env :
| Variable | Description | Exemple |
|---|---|---|
OWUI_URL |
URL de l’instance Open WebUI | https://open-webui.myia.io |
OWUI_EMAIL |
Email de connexion | etudiant@ecole.fr |
OWUI_PASSWORD |
Mot de passe | monMotDePasse |
Variables optionnelles :
| Variable | Description | Module |
|---|---|---|
OWUI_CLOUD_MODEL |
Modèle cloud pour les tests de chat | 03 |
OWUI_LOCAL_MODEL |
Modèle local (vLLM/Ollama) | 03 |
OWUI_PERSONA_MODEL |
Modèle persona/custom | 03 |
OWUI_TENANT2_* |
Instance secondaire (multi-tenant) | 05 |
OWUI_REASONING_MODEL |
Modèle « thinking » affichant son raisonnement (sinon test sauté) | 06 |
4. Vérification
# Lancer le module 01 pour vérifier que tout fonctionne
npm run test:module1
# En mode visible (pour voir le navigateur)
npx playwright test --grep "01" --headedCommandes utiles
# Lancer tous les tests
npm test
# Lancer un module spécifique
npm run test:module1 # Module 01
npm run test:module2 # Module 02
npm run test:module3 # Module 03
npm run test:module4 # Module 04
npm run test:module5 # Module 05
npm run test:module6 # Module 06 (nouveautés v0.10)
# Mode visible (navigateur affiche)
npx playwright test --headed
# Mode debug (inspecteur Playwright)
npm run test:debug
# Interface graphique Playwright
npm run test:ui
# Vérifier que tout compile et se collecte (sans instance live, comme la CI)
npm run typecheck # tsc --noEmit
npm run test:list # énumère les tests sans les exécuter
# Voir le rapport HTML des derniers tests
npm run reportConcepts clés appris
| Concept | Module | Description |
|---|---|---|
| Sélecteurs | 01 | IDs, ARIA, getByRole, getByText |
| storageState | 01-02 | Session authentifiée réutilisable |
| Auto-wait | 01 | Playwright attend automatiquement |
| TipTap/fill() | 03 | keyboard.type() pour éditeurs rich text |
| Streaming | 03 | Polling et waitForFunction |
| test.skip() | 03-04 | Skip gracieux pour services indisponibles |
| API testing | 05 | APIRequestContext sans navigateur |
| Multi-tenant | 05 | Isolation et partage de données |
| CI/CD | 05 | GitHub Actions, rapports, artefacts |
| Feature-detection | 06 | Prouver une nouveauté via un champ de réponse (ex. type sur la mémoire) |
Nettoyage (finally) |
06 | Toujours supprimer les données de test créées (mémoire, dossiers) |
| Comportement observable | 06 | Tester la compaction/le raisonnement par leur effet, pas leur implémentation |
Pièges courants et solutions
Ces pièges ont été découverts lors de la validation initiale de la suite de tests. Ils sont documentés ici car ils sont représentatifs de vrais problèmes rencontrés lors du test E2E d’applications web modernes.
Avant de corriger un test rouge, identifiez la cause. Les quatre pièges ci-dessous relèvent du test lui-même — mais une suite peut aussi rougir sans qu’aucun test ni aucune ligne de code n’ait de problème. Le guide TRIAGE-INFRA-VS-TEST.md apprend à distinguer une régression applicative, une dérive de sélecteur et une panne d’infrastructure, à partir de trois incidents réels de la flotte.
1. Modal “Quoi de neuf” (Changelog)
Problème : Open WebUI affiche un dialogue modal au premier chargement (changelog des mises à jour). Ce modal a un overlay plein écran (z-index: 9999) qui intercepte TOUS les clics.
Solution : Le helper dismissModals() ferme automatiquement ces dialogues avant chaque interaction. Il essaie plusieurs stratégies : bouton de fermeture, touche Échap, clic en dehors.
import { dismissModals } from '../helpers/chat';
// Dans beforeEach :
await page.goto('/');
await dismissModals(page);2. Éditeur TipTap (fill() ne fonctionne pas)
Problème : Open WebUI utilise TipTap/ProseMirror au lieu d’un <textarea>. La méthode fill() de Playwright ne déclenche pas les événements nécessaires.
Solution : Toujours utiliser keyboard.type() pour saisir du texte dans le chat :
// FAUX :
await page.locator('#chat-input').fill('Bonjour');
// CORRECT :
await page.locator('#chat-input').click();
await page.keyboard.type('Bonjour', { delay: 10 });3. Rate limiting de l’API d’authentification
Problème : L’endpoint /api/v1/auths/signin a un rate limit strict (~2 min entre appels). Si chaque test fait son propre login, on atteint rapidement le 429.
Solution : S’authentifier UNE FOIS dans beforeAll() et réutiliser le token :
let token = '';
test.beforeAll(async ({ request }) => {
token = await apiLogin(request, baseUrl, email, password);
});
test('...', async ({ request }) => {
// Reutiliser 'token' directement
const models = await getModels(request, baseUrl, token);
});4. APIs retournant du HTML (reverse proxy)
Problème : Certaines APIs (knowledge bases, functions) retournent du HTML au lieu de JSON quand le reverse proxy intercepte la requête ou la redirige.
Solution : Vérifier le Content-Type avant de parser, et utiliser test.skip() si l’API n’est pas disponible en JSON.
Liens utiles
Origine
Cette série pédagogique a été créée dans le cadre du cycle GenAI CoursIA, en complement des ateliers Vibe-Coding (Claude Code et Roo Code). Elle utilise les tests E2E réels du projet Open WebUI comme base pédagogique.
FAQ
npm install echoue ou Playwright ne trouve pas Chromium
Playwright (utilise dans les modules 01 a 05) requiert Node.js 18+ et télécharge Chromium (~200 Mo). Si erreur :
# Verifier Node.js
node --version # doit afficher v18+
# Installer Playwright browsers
npx playwright install chromium
# Si erreur de permissions (Linux/Mac)
npx playwright install-deps chromiumSi vous êtes derrière un proxy ou firewall, télécharger manuellement : PLAYWRIGHT_DOWNLOAD_HOST=https://proxy.example.com npx playwright install chromium. Le module 01 couvre la configuration pas-à-pas.
Les tests échouent avec “Timeout exceeded” sur le chat
Le module 03 teste le chat avec un LLM réel via streaming. Les timeouts sont allongés (30-60s) mais les LLM lents ou surchargés peuvent les dépasser. Mitigation :
// Augmenter le timeout pour un test spécifique
test('chat réponse', { tag: '@slow' }, async ({ page }) => {
test.setTimeout(120_000); // 2 minutes
// ...
});- Vérifier que l’instance OWUI est accessible :
curl $OWUI_URL/api/v1/models - Le streaming utilise
page.waitForFunction()— si le modèle ne stream pas, le poll tourne en boucle. - Le module 03 explique les stratégies d’assertion sur du contenu non-déterministe.
Peut-on utiliser cette série sans instance Open WebUI ?
Partiellement. Les modules 01 (navigation, sélecteurs) et 05 (API testing) fonctionnent sur toute application web. Les modules 02 à 04 sont spécifiques à OWUI (auth, chat, RAG).
Pour une instance locale rapide :
# OWUI avec modèles Ollama (local, pas de clé API)
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway ghcr.io/open-webui/open-webui:main
# Ou avec vLLM (GPU requis)
# Configurer OWUI_LOCAL_MODEL dans .envLe module 01 explique comment pointer Playwright vers votre instance via .env.
Les tests du module 04 (RAG/MCP) sont tous skip
Le module 04 teste les Knowledge Bases, les outils MCP et les channels. Les 5 skips dans les résultats de validation viennent de fonctionnalités non configurées sur l’instance OWUI :
- Knowledge Bases : nécessitent un upload préalable de documents via l’interface OWUI.
- Outils MCP : le serveur MCP doit être configuré dans les paramètres OWUI (Admin > Tools).
- Channels : fonctionnalité collaborative qui requiert plusieurs utilisateurs actifs.
Pour activer ces tests, configurer les fonctionnalités correspondantes dans OWUI et décommenter les test.skip() dans 04-rag-tools.spec.ts.
Quelle différence entre cette série et les ateliers Vibe-Coding ?
| Critère | Playwright-OWUI | Vibe-Coding |
|---|---|---|
| Focus | Tests E2E automatisés | Développement assisté par IA |
| Langage | TypeScript (.spec.ts) | Naturel (prompt engineering) |
| Outil | Playwright | Claude Code / Roo Code |
| Public | Testeurs QA, dev backend | Développeurs, débutants |
| Non-déterminisme | Gère (streaming, LLM) | N/A |
Les deux séries sont complémentaires : Vibe-Coding (README) couvre le développement assisté par IA, tandis que Playwright-OWUI couvre la validation automatisée des interfaces générées.
Comment adapter les tests a une autre application OWUI (version ou config différente) ?
Les sélecteurs CSS et les patterns d’auth sont stables entre OWUI v0.8.x et v0.10.x. Si votre instance diffère :
npx playwright test --debug) que les sélecteurs dans helpers/selectors.ts correspondent a votre version.getByRole()(plus robuste quegetByText()).WHATS-NEW-v0.9.1.md) ; OWUI v0.10 ajoute la mémoire persistante, les dossiers d’équipe et le raisonnement streamé (voirWHATS-NEW-v0.10.mdet le module 06) ; OWUI v0.11 refond l’interface (réglages en onglets, fork de chat, pages de dossier — voirWHATS-NEW-v0.11.md). Ce sont de bons candidats pour des exercices bonus.Le module 01 enseigne les sélecteurs robustes (
getByRole,getByTestId) qui resistent aux changements d’UI.Version 1.2.0 — Juillet 2026 (module 06 ajouté, validé sur OWUI v0.10.2)