Playwright v1.61.0 : passkeys WebAuthn, vraie API WebStorage et modes vidéo à la trace pour le test runner

Playwright v1.61.0 : passkeys WebAuthn, vraie API WebStorage et modes vidéo à la trace pour le test runner

lschvn

Playwright v1.61.0 est sortie aujourd'hui, le 15 juin 2026 à 10:05 UTC, environ six semaines après v1.60.0 le 11 mai. C'est une release de fonctionnalités sans breaking change, et trois des nouvelles API adressent directement des lacunes anciennes dans la façon dont les équipes testent les flux passkey, manipulent le stockage navigateur et raisonnent sur les runs CI flaky. La release livre aussi les canaux navigateur Chromium 149, Firefox 151 et WebKit 26.5, et ajoute Ubuntu 26.04 à la liste des plateformes supportées.

Un authentificateur WebAuthn virtuel pour les tests passkey

La fonctionnalité phare est browserContext.credentials, un authentificateur virtuel qui peut enregistrer des passkeys et répondre aux cérémonies navigator.credentials.create() / navigator.credentials.get() dans la page. Aucune clé matérielle réelle n'est requise, et ça marche dans tous les canaux navigateur, Chromium, Firefox et WebKit.

Le flux typique consiste à seeder une passkey que le backend a déjà provisionnée pour un utilisateur de test, puis à laisser le navigator.credentials.get() de la page répondre au challenge avec cette clé :

const context = await browser.newContext();

// Seed une passkey que votre backend a provisionnée pour un user de test.
await context.credentials.create('example.com', {
  id: credentialId,
  userHandle,
  privateKey,
  publicKey,
});
await context.credentials.install();

const page = await context.newPage();
await page.goto('https://example.com/login');
// Le navigator.credentials.get() de la page est répondu avec la passkey seedée.

Les notes de release mentionnent un pattern alternatif : exécuter un test de setup one-shot qui enregistre une passkey via la vraie UI, la relire avec credentials.get(), et la seeder dans le reste de la suite. C'est la bonne forme pour les projets qui découvrent que le support passkey est requis pour se logger et qui sautaient complètement ces tests auparavant.

La conséquence pratique est que le patch explicit resource management que Bun a livré en 1.3.12 est désormais une excuse beaucoup plus mince : tester un login passkey-only exigeait auparavant une vraie YubiKey sur le runner CI, un driver d'authentificateur virtuel custom, ou bien de sauter le flux. Après la 1.61.0, c'est un appel credentials.create dans un beforeEach.

Une API de première classe page.localStorage et page.sessionStorage

La seconde pièce est la nouvelle API WebStorage, exposée comme page.localStorage et page.sessionStorage. Les lectures et écritures vont directement au stockage de la page pour l'origine courante, sans round-trip page.evaluate :

await page.localStorage.setItem('token', 'abc');
const token = await page.localStorage.getItem('token');
const items = await page.sessionStorage.items();

page.evaluate(() => localStorage.setItem('token', 'abc')) fonctionne toujours, mais la nouvelle API est une commande protocolaire de première classe sur la même forme que ce que Playwright utilise pour les cookies et le storage state. Ça la rend utilisable sur les pages d'arrière-plan, sur les service workers, et dans les tests qui veulent juste asserter un état de stockage sans rebondir dans le contexte JS.

Réseau : securityDetails() et serverAddr() sur les API responses

Les nouveaux apiResponse.securityDetails() et apiResponse.serverAddr() reflètent les response.securityDetails() et response.serverAddr() côté navigateur. Pour les équipes qui interceptent et rejouent du HTTP via l'API request / APIRequestContext de Playwright, c'est enfin un moyen d'assertir la version TLS négociée, le cipher, le sujet du certificat et l'adresse serveur résolue, le tout dans un seul test. C'est le même type de capacité qui a motivé l'histoire du path-traversal du dev server d'esbuild 0.28.1 côté offense ; ici c'est le côté défense.

Test runner : modes vidéo à la trace et expect.soft.poll

Le runner récupère trois modes vidéo qui amènent testOptions.video à parité avec testOptions.trace. Les nouvelles valeurs sont 'on-all-retries', 'retain-on-first-failure' et 'retain-on-failure-and-retries'. Le tableau des modes vidéo documente quels runs sont enregistrés et lesquels sont retenus dans chaque mode. Pour la CI, 'retain-on-failure' est le gain évident : seuls les runs cassés brûlent du disque.

Les autres améliorations du runner sont petites mais utiles :

  • expect.soft.poll(...) est désormais supporté, la forme polling de expect.soft. Les assertions échouées sont enregistrées sur le test, mais l'exécution continue, donc un test de dashboard peut asserter cinq choses lâchement couplées et reporter toutes les défaillances à la fin au lieu de fixer la première, relancer, trouver la suivante et recommencer.
  • fullConfig.argv est un snapshot de process.argv du process runner, que les reporters peuvent lire pour exposer les arguments custom passés après le séparateur --.
  • fullConfig.failOnFlakyTests reflète l'option de config, donc les reporters peuvent expliquer pourquoi un run marqué flaky a échoué.
  • testInfo.errors liste désormais chaque sous-erreur d'un AggregateError comme entrée séparée, donc une assertion multi-failures ne se collapse plus en une seule ligne dans le report.
  • Un nouveau shorthand CLI -G pour --grep-invert.

Versions navigateur, HAR et support plateforme

La release pin Chromium 149.0.7827.55, Mozilla Firefox 151.0 et WebKit 26.5, et est aussi testée contre les canaux stables Google Chrome 149 et Microsoft Edge 149. Ubuntu 26.04 est désormais une plateforme supportée.

Les enregistrements HAR et trace incluent désormais les requêtes WebSocket. Avant la 1.61.0, une régression qui n'apparaissait qu'au-dessus d'une connexion WebSocket (chat, curseurs temps réel, mises à jour temps réel, server-sent events multiplexés sur un seul socket) était invisible dans l'artefact enregistré. Le panneau network du trace viewer et le fichier HAR contiennent désormais tous les deux les frames WebSocket, ce que la plupart des équipes attendaient depuis le jour un.

Petites touches

  • Une nouvelle option artifactsDir sur browserType.connectOverCDP() contrôle où vont traces et downloads quand on s'attache à un browser existant.
  • Une nouvelle option cursor sur screencast.showActions() contrôle la décoration de curseur rendue pour les actions de pointeur.
  • Le callback onFrame dans screencast.start() reçoit désormais un timestamp du moment où la frame a été présentée par le navigateur.

Pour la plupart des équipes l'upgrade est bun install @playwright/test@latest et une réinstall des browsers. Les nouvelles API sont additives, pas de flag day. Les API passkey et WebStorage sont les parties qui valent une petite migration, puisqu'elles rendent la suite de tests significativement plus honnête sur ce que l'app de production doit réellement gérer.

Questions fréquentes

Articles connexes

Plus de couverture avec des sujets et tags en commun.

esbuild 0.28.1 : première release en deux mois avec une RCE Deno de haute gravité, un path traversal Windows et un bug de disposal `using`
security

esbuild 0.28.1 : première release en deux mois avec une RCE Deno de haute gravité, un path traversal Windows et un bug de disposal `using`

esbuild v0.28.1 (11 juin 2026) est la première release depuis avril. Elle corrige une exécution de code à distance CVSS 8.1 dans l'API Deno via NPM_CONFIG_REGISTRY, un path traversal du dev server limité à Windows, et un bug du minifier qui cassait silencieusement le disposal des ressources avec `using` et `await using`.
JSIR de Google : une représentation intermédiaire basée sur MLIR pour l'analyse JavaScript
security

JSIR de Google : une représentation intermédiaire basée sur MLIR pour l'analyse JavaScript

Google a open source JSIR, un nouvel outil d'analyse JavaScript basé sur MLIR. Il supporte à la fois l'analyse de flux de données de haut niveau et la transformation source-à-source sans perte, utilisé en interne pour la décompilation du bytecode Hermes et la désobfuscation JavaScript assistée par IA.
Vite 8.1 Beta : imports `.wasm` directs, `build.chunkImportMap` et rename `server.hmr` → `server.ws`
tooling

Vite 8.1 Beta : imports `.wasm` directs, `build.chunkImportMap` et rename `server.hmr` → `server.ws`

Vite 8.1.0-beta.0 (15 juin 2026) est la première beta de la ligne 8.1. Elle livre le standard WASM ESM Integration en imports `.wasm` directs, une option build.chunkImportMap qui exploite les import maps pour améliorer les taux de cache des chunks, l'intégration avec Vite Task pour du cache de build sans configuration, le support des dépendances de plugin lightningcss, et un breaking rename qui déplace toutes les options `server.hmr` vers `server.ws`.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.