Playwright v1.61.0 ist heute, am 15. Juni 2026 um 10:05 UTC erschienen, etwa sechs Wochen nach v1.60.0 am 11. Mai. Es ist ein Feature-Release ohne Breaking Changes, und drei der neuen APIs adressieren direkt langjährige Lücken dabei, wie Teams Passkey-Flows testen, Browser-Storage manipulieren und flaky CI-Runs nachvollziehen. Die Release bringt außerdem die Browser-Kanäle Chromium 149, Firefox 151 und WebKit 26.5 und nimmt Ubuntu 26.04 in die Liste der unterstützten Plattformen auf.
Ein virtueller WebAuthn-Authenticator für Passkey-Tests
Das Headline-Feature ist browserContext.credentials, ein virtueller Authenticator, der Passkeys registrieren und navigator.credentials.create() / navigator.credentials.get()-Zeremonien in der Seite beantworten kann. Es wird kein echter Hardware-Key benötigt, und es funktioniert in jedem Browser-Kanal, Chromium, Firefox und WebKit.
Der typische Ablauf ist, einen Passkey zu seeden, den das Backend bereits für einen Test-User provisioniert hat, und dann den navigator.credentials.get() der Seite mit diesem Key auf den Challenge antworten zu lassen:
const context = await browser.newContext();
// Seeded einen Passkey, den euer Backend für einen Test-User provisioniert hat.
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');
// Der navigator.credentials.get() der Seite wird mit dem geseedeten Passkey beantwortet.
Die Release-Notes nennen ein alternatives Muster: einen One-Shot-Setup-Test laufen lassen, der einen Passkey über die echte UI registriert, ihn mit credentials.get() zurückliest und in den Rest der Suite re-seeded. Das ist die richtige Form für Projekte, die feststellen, dass Passkey-Support zum Login nötig ist und diese Tests vorher komplett übersprungen haben.
Die praktische Konsequenz ist, dass der explicit resource management-Patch, den Bun in 1.3.12 geliefert hat, jetzt eine viel dünnere Ausrede ist: einen Passkey-only-Login zu testen erforderte vorher einen echten YubiKey auf dem CI-Runner, einen Custom-Treiber für einen virtuellen Authenticator oder das Überspringen des Flows. Nach 1.61.0 ist es ein credentials.create-Aufruf in einem beforeEach.
Eine erstklassige page.localStorage- und page.sessionStorage-API
Das zweite Stück ist die neue WebStorage-API, exponiert als page.localStorage und page.sessionStorage. Reads und Writes gehen direkt in den Storage der Seite für die aktuelle Origin, ohne page.evaluate-Round-Trip:
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')) funktioniert weiterhin, aber die neue API ist eine erstklassige Protokoll-Kommando in derselben Form, die Playwright bereits für Cookies und Storage-State verwendet. Das macht sie auf Hintergrund-Seiten, auf Service Workern und in Tests nutzbar, die einfach nur einen Storage-Zustand asserten wollen, ohne durch den JS-Kontext zu hüpfen.
Netzwerk: securityDetails() und serverAddr() auf API-Responses
Die neuen apiResponse.securityDetails() und apiResponse.serverAddr() spiegeln die Browser-seitigen response.securityDetails() und response.serverAddr(). Für Teams, die HTTP über Playwrights request- / APIRequestContext-API abfangen und replay-en, ist das endlich ein Weg, die ausgehandelte TLS-Version, die Cipher, den Zertifikats-Subject und die aufgelöste Server-Adresse in einem einzigen Test zu asserten. Es ist dieselbe Klasse von Capability, die die esbuild-0.28.1-Dev-Server-Path-Traversal-Story auf Offense-Seite getrieben hat; hier ist es die Defense-Seite.
Test-Runner: Trace-artige Video-Modi und expect.soft.poll
Der Runner nimmt drei Video-Modi auf, die testOptions.video auf Parität mit testOptions.trace bringen. Die neuen Werte sind 'on-all-retries', 'retain-on-first-failure' und 'retain-on-failure-and-retries'. Die Video-Modi-Tabelle dokumentiert, welche Runs in welchem Modus aufgenommen und behalten werden. Für CI ist 'retain-on-failure' der offensichtliche Gewinn: nur kaputte Runs verbrauchen Disk.
Weitere Runner-Verbesserungen sind klein, aber nützlich:
expect.soft.poll(...)wird jetzt unterstützt, die Polling-Form vonexpect.soft. Fehlgeschlagene Assertions werden am Test vermerkt, aber die Ausführung läuft weiter, sodass ein Dashboard-Test fünf lose gekoppelte Dinge asserten und am Ende alle Fehler berichten kann, statt das erste zu fixen, neu zu laufen, das nächste zu finden und zu wiederholen.fullConfig.argvist ein Snapshot vonprocess.argvaus dem Runner-Prozess, den Reporter lesen können, um Custom-Argumente hinter dem---Separator offenzulegen.fullConfig.failOnFlakyTestsspiegelt die Config-Option, sodass Reporter erklären können, warum ein als flaky markierter Run fehlgeschlagen ist.testInfo.errorslistet jetzt jeden Sub-Fehler einesAggregateErrorals separaten Eintrag, sodass eine Multi-Failure-Assertion im Report nicht mehr zu einer einzelnen Zeile kollabiert.- Eine neue CLI-Kurzform
-Gfür--grep-invert.
Browser-Versionen, HAR und Plattform-Support
Die Release pinnt Chromium 149.0.7827.55, Mozilla Firefox 151.0 und WebKit 26.5 und wird zusätzlich gegen die Stable-Kanäle Google Chrome 149 und Microsoft Edge 149 getestet. Ubuntu 26.04 ist jetzt eine unterstützte Plattform.
HAR- und Trace-Aufzeichnungen enthalten jetzt WebSocket-Requests. Vor 1.61.0 haben Playwrights HAR- und Trace-Aufzeichnungen nur HTTP-Traffic erfasst, sodass eine Regression, die nur über eine WebSocket-Verbindung auftrat (Chat, Live-Cursor, Echtzeit-Updates, Server-Sent-Events, die über einen einzelnen Socket multiplexed sind), im Artefakt unsichtbar war. Das Network-Panel des Trace-Viewers und die HAR-Datei enthalten jetzt beide die WebSocket-Frames, was die meisten Teams vom ersten Tag an erwartet haben.
Kleinere Touches
- Eine neue
artifactsDir-Option aufbrowserType.connectOverCDP()steuert, wo Traces und Downloads landen, wenn man sich an einen existierenden Browser anhängt. - Eine neue
cursor-Option aufscreencast.showActions()steuert die Cursor-Dekoration, die für Pointer-Aktionen gerendert wird. - Der
onFrame-Callback inscreencast.start()erhält jetzt einentimestamp, wann die Frame vom Browser präsentiert wurde.
Für die meisten Teams ist das Upgrade bun install @playwright/test@latest und eine Neuinstallation der Browser. Die neuen APIs sind additiv, kein Flag-Day. Die Passkey- und WebStorage-APIs lohnen eine kleine Migration, weil sie die Test-Suite deutlich ehrlicher machen, was die Produktions-App tatsächlich handhaben muss.



