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 deexpect.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.argvest un snapshot deprocess.argvdu process runner, que les reporters peuvent lire pour exposer les arguments custom passés après le séparateur--.fullConfig.failOnFlakyTestsreflète l'option de config, donc les reporters peuvent expliquer pourquoi un run marqué flaky a échoué.testInfo.errorsliste désormais chaque sous-erreur d'unAggregateErrorcomme 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
-Gpour--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
artifactsDirsurbrowserType.connectOverCDP()contrôle où vont traces et downloads quand on s'attache à un browser existant. - Une nouvelle option
cursorsurscreencast.showActions()contrôle la décoration de curseur rendue pour les actions de pointeur. - Le callback
onFramedansscreencast.start()reçoit désormais untimestampdu 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.



