Playwright ist Microsofts Framework für Browser-Automatisierung: eine Apache-2.0-lizenzierte Library mit TypeScript-Fokus, die einen echten Browser startet, ihn über eine einzige API steuert und die Seite erst zurückgibt, nachdem JavaScript ausgeführt wurde. Vermarktet wird es als End-to-End-Testframework, doch genau die Engine darunter ist für viele der heimliche Favorit, wenn ein HTTP-Request nur eine leere Hülle dort zurückliefert, wo eigentlich Daten stehen sollten. Vom Aufbau her tritt es gegen Puppeteer und Selenium an — echte Browser, die man skriptet, keine HTTP-Clients, die man parst.
Ich habe microsoft/playwright in Version 1.56.0 mit einem festen Satz an Scraping-Tests geprüft — ein statischer Katalog mit Pagination, ein Artikel, ein per JavaScript gerenderter Katalog, eine JSON-API, ein fehlerhafter 500er, ein kleiner Crawl-Graph und zwei öffentliche Übungsseiten — auf Node v22.22.3, macOS arm64, ausschließlich Chromium. Der Rendering-Teil lief sauber durch. Der Crawl-Teil existiert nicht, und genau diese Lücke ist das Wichtigste, was man vor dem Einsatz über das Tool verstehen sollte.
Was besonders auffiel
Zwei Ergebnisse stechen heraus, und sie zeigen in leicht unterschiedliche Richtungen.
Das erste ist das erwartete Browser-Ergebnis, begrenzt durch die von mir gesetzten Wartebedingungen. Nach page.goto(..., { waitUntil: 'domcontentloaded' }) wartete der dynamische Fixture-Test auf #dynamic-products article.product-card, und der öffentliche Test Quotes to Scrape wartete auf .quote. Diese anwendungsbezogenen Selektoren erschienen, danach lieferten die Durchläufe 8/8 Fixture-Elemente und 10 Zitate von der öffentlichen Seite; das Fixture-Ergebnis erreichte einen Recall von 1,0 gegenüber seinem Ground Truth mit acht Einträgen. Es war keine eigene Polling-Schleife nötig, aber Playwright löste das Bereitstellungsproblem nicht auf — der Test lieferte selbst die Bedingung für den Abschluss. Ein Vollbild-Screenshot wurde außerdem direkt beim ersten Aufruf gespeichert.
Das zweite Ergebnis nutzte browserContext.request: konkret ctx.request.get(...), nachdem Chromium bereits gestartet war und ein Browser-Kontext existierte. Dabei wurde der JSON-Endpunkt des Fixtures direkt angesprochen, und 8/8 Produkte kamen zurück, ohne eine Seite zu erstellen oder zu rendern. Das umgeht DOM-Arbeit, nicht aber in diesem Setup die Kosten des Browser-Prozesses. Der kontextgebundene Request-Client kann Cookies mit Browser-Seiten teilen; ein eigenständiges playwright.request.newContext() braucht keinen Browser-Kontext, teilt diese Session aber nicht automatisch. In diesem Test wurde nur der erste Weg geprüft.
Playwright bringt außerdem weder Crawl-Queue noch Dataset-Writer noch automatisches Throttling mit. Mein Crawl-Graph-Test — interne Links verfolgen, Tiefe erfassen und Wiederbesuche vermeiden — kam auf 12 Seiten mit den Tiefen {0:1, 1:4, 2:7}, aber die Breadth-First-Traversierung war eigener Testcode. Playwright öffnet und inspiziert Seiten; Frontier-Persistenz, URL-Policy, Retries und Scheduling gehören in eine andere Schicht.
Was Playwright eigentlich ist
Das Tool — microsoft/playwright auf GitHub — ist in TypeScript geschrieben, unter Apache-2.0 lizenziert und wird von Microsoft gepflegt. Die hier getestete Build-Version war am 9. Juli 2026 1.56.0. Die Ergebnisse beziehen sich ausdrücklich auf genau diese Version und sind nicht als Kompatibilitätsaussage für spätere Releases zu verstehen.
Die offizielle Einordnung ist klar: ein Framework für Web-Tests und Automatisierung, das Chromium, Firefox und WebKit über eine gemeinsame API steuert. Der eigentliche Hauptpfad von Playwright ist ein Test Runner mit Fixtures, Assertions und Trace Viewer. Wer es als Scraping-Baustein nutzen will, folgt der dokumentierten Library mode: chromium.launch(), dann ein context, dann eine page, außerhalb des Test-Frameworks. Alles in dieser Review nutzte genau diese öffentliche API. Ein Kompatibilitätstest über mehrere Versionen wurde nicht durchgeführt; daher ist das keine Aussage, dass jedes hier geprüfte Verhalten über alle Releases stabil bleibt.
Die dokumentierte Breite ist überall sonst das Hauptargument, deshalb formuliere ich es vorsichtig. Playwright steuert drei Browser-Engines — Chromium, Firefox und WebKit — über eine einzige API und bietet außerdem First-Class-Clients in Python, Java und .NET zusätzlich zu JavaScript. Das ist dokumentiert und tatsächlich der größte strukturelle Unterschied des Tools. Was dieser Durchlauf wirklich geprüft hat, ist enger gefasst:
| Fähigkeit | Status in dieser Review |
|---|---|
| Chromium-Engine | Geprüft — alle Tests hier liefen auf Chromium |
| Firefox-Engine | Dokumentiert, hier nicht verifiziert |
| WebKit-Engine | Dokumentiert, hier nicht verifiziert |
| Eine API über alle drei Engines | Dokumentiert, hier nicht verifiziert |
| Python-, Java- und .NET-Clients | Dokumentiert, hier nicht verifiziert |
| Proxying | Nicht getestet |
| Parallelität über mehrere Kontexte | Nicht getestet |
| Netzwerk-Interception für API-first-Scraping | Nicht getestet |
Wenn eine Zielseite unter Safari/WebKit anders rendert oder Ihr Team in Python arbeitet, ist diese Breite das Argument für Playwright — aber nehmen Sie meine Ergebnisse nicht als Beweis für Firefox- oder WebKit-Parität, denn ich habe diese Engines nicht getestet.
Wie es intern funktioniert
Das mentale Modell ist eine Browser-Engine, die man skriptet. chromium.launch() startet einen Browser-Prozess. Ein context ist eine isolierte Sitzung mit eigenen Cookies, eigenem Storage und Cache; eine page ist ein Tab innerhalb dieses Kontexts. Man ruft page.goto(url) auf, wartet auf die Bedingung, die für die Bereitschaft der Anwendung steht, und liest das resultierende DOM mit Helfern wie page.$$eval aus. Das ist näher an einem benutzerseitigen Browser als am Parsen einer HTTP-Antwort, aber es ist keine Gleichheit der Umgebungen: Headless-Signale, Viewport, Locale, Fonts, Profilzustand, TLS-/Netzwerkpfad und Schutzmechanismen der Website können trotzdem beeinflussen, was ausgeliefert wird. Diese Review hat weder Anti-Bot-Verhalten noch Parität zum Produktionsbrowser getestet.
page.screenshot() erfasst die gerenderte Seite, vollständig oder zugeschnitten, und funktionierte in meinem Lauf schon beim ersten Aufruf. Und die erwähnte Request-API — context.request.get — nutzt die Cookies desselben Kontexts, umgeht aber das Rendern. So kann man in einem Skript "Seite laden und DOM lesen" mit "nur den JSON-Endpunkt ansprechen" kombinieren, ohne das Tool zu wechseln.
Was unter der Haube nicht enthalten ist, ist Crawling-Infrastruktur. Es gibt keinen Request-Scheduler, kein persistent gespeichertes Visited-Set, keine Höflichkeitsregeln und keine Export-Pipeline. Eine begrenzte Traversierung lässt sich leicht skizzieren, doch zuverlässiges Frontier-Management braucht zusätzlich URL-Normalisierung, Redirect-Behandlung, Retries, Scope-Regeln, Drosselung und Wiederaufnahme nach Fehlern. Diese Schicht bauen Sie selbst — oder Sie nutzen ein Framework, das die Browser-Engine einbettet.
Installation und Setup in der Praxis
Die Installation erfolgt in zwei Schritten, und der zweite trägt den größten Teil des Aufwands in der Bereitstellung. npm install playwright installiert die Library; npx playwright install lädt zusätzlich die Browser-Builds herunter (in meinem Fall Chromium). Planen Sie Speicherplatz, Downloadzeit, Browser-Caching in CI und Prozessbereinigung mit ein, statt das npm-Paket als komplettes lauffähiges System zu betrachten.
Wenn Sie Playwright als Scraper installieren und dem Test-Tutorial folgen, landen Sie zunächst bei Testdateien und expect()-Assertions. Scraping-Code nutzt dagegen direkt die Library-API. Beides ist dokumentiert, aber der Unterschied ist wichtig, wenn man Beispiele sucht oder Deploy-Befehle auswählt.
In diesem Lauf waren die praktischen Vorteile konkret: Browser-Kontexte trennten den Session-Zustand sauber, asynchrone Aufrufe ließen sich gut kombinieren, ein Screenshot brauchte nur einen Aufruf, und ein HTTP-500 war über das Response-Objekt weiterhin inspizierbar. Die Reibung lag eher im Betrieb als in der Syntax: Der Browser-Build musste separat installiert und sein Lebenszyklus getrennt von der Library verwaltet werden.
Praxisergebnisse

Alle lokalen Zahlen stammen von einem Fixture-Server auf 127.0.0.1, dessen Ground Truth vor dem Crawl festgehalten wurde. Das exakte Test-Setup findet sich in run_playwright_material_tests.mjs, und die im Repo abgelegten Raw-Artefakte enthalten sowohl die Ground Truth als auch die Ausgaben pro Test. Das sind weiterhin vom Autor gemachte Beobachtungen von einem Rechner in einem einzigen Lauf; die Links dienen der Reproduzierbarkeit und machen daraus keinen breit angelegten Benchmark.
| Test | Ziel | Ergebnis |
|---|---|---|
| Statischer Katalog + Pagination | lokaler Fixture | 12/12 Produkte, Recall 1,0 |
| Artikelauslesung | lokaler Fixture | Titel + 3/3 Absätze, Boilerplate getrennt |
| Dynamische JS-Seite (native Rendering) | lokaler Fixture | 8/8, Recall 1,0, Vollbild-Screenshot gespeichert |
Dynamische JSON-API (page.request) | lokaler Fixture | 8/8, Recall 1,0, kein DOM gerendert |
| HTTP-500-Behandlung | lokaler Fixture | Status 500 inspizierbar, Navigation löste keinen Fehler aus |
| Crawl-Graph (manuell geschriebene BFS) | lokaler Fixture | 12 Seiten, Tiefen {0:1, 1:4, 2:7} |
| Books to Scrape | öffentliche Demo | 20 Produkte |
| Quotes JS (JS-gerendert) | öffentliche Demo | 10 Zitate, nativ gerendert |
Die Pagination-Schleife folgte dem nächsten Link explizit; Playwright entdeckte Seiten nicht von selbst. Der Artikel-Selektor hielt Navigation und Footer-Text aus dem Body-Ergebnis heraus. Beim Fehlerpfad lieferte die Navigation ein Response-Objekt mit Status 500 zurück, statt einen Fehler zu werfen, sodass der Aufrufer entscheiden konnte, ob er loggt, erneut versucht oder weitermacht. Die beiden öffentlichen Übungsziele lieferten die in der Tabelle gezeigten Zahlen.
Eine Grenze, die man klar benennen sollte: Alles hier lief auf Chromium, auf einem Rechner, einmal. Die Fähigkeits-Tabelle trennt dokumentierte Breite bewusst von tatsächlich getesteten Funktionen. Ich habe die Suite nicht mit einer anderen Playwright-Version erneut ausgeführt, daher folgt daraus keine versionenübergreifende Aussage. Auch einzelne Laufzeiten fehlen absichtlich als Benchmark; ein einmaliger Stoppuhr-Durchlauf auf einem Laptop trägt keinen belastbaren Geschwindigkeitsvergleich.
Bereitschaft ist Teil des Extraktionsvertrags
Die dynamischen Ergebnisse hingen von Wartebedingungen ab, die die gewünschten Daten repräsentieren, nicht bloß von der Browser-Navigation. Für den lokalen Katalog navigierte das Test-Setup mit waitUntil: 'domcontentloaded' und rief anschließend mit einem Timeout von 15 Sekunden waitForSelector('#dynamic-products article.product-card') auf. Der öffentliche Run für Quotes JS nutzte denselben Navigationszustand und wartete mit 20 Sekunden Timeout auf .quote. Erst nachdem diese Selektoren erschienen, wurde extrahiert.
Dieser Unterschied ist wichtig, wenn man das Skript anpasst. domcontentloaded sagt nur, dass das initiale Dokument geparst wurde; es sagt nicht, dass eine verzögerte API-Antwort angekommen ist, das Hydrating abgeschlossen wurde, eine unendliche Liste aufgehört hat zu wachsen oder eine virtualisierte Zeile in den Viewport gelangt ist. Ein Selektor ist dann hilfreich, wenn das Vorhandensein eines einzelnen passenden Elements genügt. Wenn Vollständigkeit von einer bekannten Antwort, einer Elementanzahl, einem Anwendungszustand oder einem ruhigen Netzwerkfenster abhängt, sollte man stattdessen genau auf diese Bedingung warten. Die Bedingung muss an den Output-Vertrag gekoppelt sein: „mindestens eine Karte existiert“ und „alle erwarteten Seiten sind geladen“ sind verschiedene Aussagen.

Auch das Timeout-Handling gehört zum Aufrufer. Der Test nutzte begrenzte Selector-Timeouts, untersuchte aber weder Retry-Policy noch unterschied er zwischen einer langsamen Seite und einem dauerhaft geänderten Selektor. Ein Produktions-Wrapper sollte festhalten, welche Ready-Bedingung fehlgeschlagen ist, genügend Seitenzustand zum Debuggen sichern und entscheiden, ob ein weiterer Navigationsversuch sicher ist. Playwright liefert Events und DOM; was „vollständige Daten“ für Ihren Anwendungsfall bedeutet, kann es nicht erraten.
Diese Grenze sollte neben jedem Extraktor dokumentiert werden und nicht als implizites Timeout im Raum stehen.
Der API-Pfad hat einen parallelen Vertrag. ctx.request.get war hier passend, weil der Browser-Kontext bereits existierte und Session-Sharing nützlich sein kann. Wenn ein Job feststellt, dass sein Daten-Endpunkt ohne Browser-Session funktioniert, ist ein eigenständiger Request-Kontext eine andere Architektur mit anderem Lebenszyklus und anderem Cookie-Verhalten. Dieser Lauf hat die beiden Ansätze nicht verglichen. Behandeln Sie „kein DOM gerendert“ als gemessene Tatsache und entscheiden Sie separat, ob der größere Workflow überhaupt einen Browser-Prozess braucht.
Die Crawl-Frage
Das Crawl-Graph-Ergebnis ist das, was die Einordnung von Playwright wirklich entscheidet. Zwölf Seiten, drei Tiefen, korrekt — und alles am Traversieren war mein eigener Code. Playwright lieferte den Teil „diese URL öffnen und lesen“; ich lieferte Queue, Visited-Set und Tiefenverwaltung.
Für kleine, klar begrenzte Aufgaben ist das kein Problem. Für Crawls in echter Größe bedeutet es, dass Sie entweder einen Crawler auf einer Browser-Library aufbauen oder Playwright mit etwas kombinieren, das diese Schicht bereits hat. Das dokumentierte Muster ist Crawlee, das Playwright (und Puppeteer) mit echter Request-Queue, Dataset-Speicherung und Auto-Throttling erweitert — Sie behalten das Rendering von Playwright und erhalten die Orchestrierung dazu. Wer die Queue lieber direkt im Framework statt nur als Zusatz haben möchte, findet genau das im Design von Scrapy, wobei Scrapy HTTP-first ist und JavaScript nicht selbst rendert. Der Punkt ist nicht, dass Playwright zu kurz greift; der Punkt ist, dass „Browser-Automatisierung“ und „Crawling“ zwei verschiedene Aufgaben sind und Playwright nur eine davon für sich beansprucht.

Die BFS mit zwölf Seiten macht die Zuständigkeitsgrenze konkret. Sie lieferte eine Queue, ein Visited-Set und Tiefen-Tracking für einen kontrollierten Graphen. Eine Produktions-Frontier muss zusätzlich URL-Kanonisierung, Redirect-Behandlung, erlaubte Hosts, Duplikatschlüssel, Retries, Parallelität, Verzögerungen pro Host, Persistenz und Neustart-Semantik definieren. Auch das Exportformat ist eine eigene Entscheidung: Das Fixture schrieb JSON und CSV, weil das Test-Setup das so vorgesehen hatte — nicht, weil Playwright eine Dataset-Abstraktion mitbringt.
Auch das Session-Design beeinflusst die Wrapper-Schicht. Ein Browser kann mehrere Kontexte mit isolierten Cookies und isoliertem Storage enthalten, doch diese Review hat weder Parallelität über mehrere Kontexte noch deren Fehlerisolation gemessen. Das Wiederverwenden eines Kontexts kann ein Login erhalten und Setup-Aufwand sparen; das Erzeugen separater Kontexte kann Zustandsleckagen zwischen Jobs verhindern. Das sind Crawler-Policies, auch wenn Playwright den Kontext als Primitive liefert. Benchmarken Sie den gewählten Lebenszyklus mit genau dem Browser-Build und der Deploy-Umgebung, die Sie später auch wirklich nutzen.
Vor- und Nachteile
Vorteile:
- JavaScript-Ausführung über eine echte Chromium-Engine; beide dynamischen Ziele erreichten die Selektoren, die als Readiness-Bedingungen dienten.
- Vollbild-Screenshot wurde beim ersten Aufruf erfasst.
- Selektoren extrahierten aus den kontrollierten Fixtures die erwarteten Felder des statischen Katalogs und des Artikels.
browserContext.requesterreichte den JSON-Endpunkt ohne Seiten-Rendering, während der bereits gestartete Browser-Prozess Teil des Setups blieb.- Robust bei einer fehlerhaften Antwort: HTTP 500 war inspizierbar und Navigation löste keinen Fehler aus.
- Dokumentierte Unterstützung für drei Engines (Chromium, Firefox, WebKit) über eine API sowie Python-, Java- und .NET-Clients (dokumentiert; hier nur Chromium tatsächlich genutzt).
- Apache-2.0 und gepflegt von Microsoft.
- Sehr angenehme Entwicklererfahrung im Library Mode: eine API für alle Engines, erstklassiges Async, triviale Screenshots.
Nachteile:
- Keine eingebaute Crawl-Queue, kein Dataset und kein Auto-Throttle — Crawl-Arbeit in echter Größe ist Ihr eigener Code oder ein Wrapper wie Crawlee.
- Browser-Gewicht: Der Download der Binärdateien und die Kosten pro Seite sind der echte Preis gegenüber einem HTTP-only-Tool.
- Das Standard-Frame ist der Test Runner; für Scraping muss man wissen, dass der Library Mode existiert, und vom beworbenen Pfad abweichen.
- Es wurden nur Playwright 1.56.0 und Chromium geprüft; Versionen- und Engine-Parität wurden nicht getestet.
- Keine strukturierte JSON-Ausgabe nach Schema aus dem Tool selbst; Selektoren und Datenform müssen selbst gebaut werden.
Für wen es passt — und wer lieber etwas anderes nimmt
Wenn Ihr Problem darin besteht, Seiten zu rendern, deren Daten erst nach JavaScript erscheinen, oder Screenshots zusammen mit DOM-Daten zu erfassen, ist Playwright ein sinnvoller Kandidat für einen eigenen Test gegen Ihre Ziele. Teams, die Playwright bereits für Tests einsetzen, können dieselben Konzepte und Selektor-Fähigkeiten im Library Mode weiterverwenden. Python-, Java- und .NET-Clients sind dokumentierte Optionen, aber diese Review hat nur Node und Chromium genutzt.
In drei Fällen sollten Sie eine andere Schicht in Betracht ziehen. Wenn die benötigten Daten bereits in einer HTTP-Antwort stecken, vermeidet ein HTTP-first-Tool Browser-Start und Rendering-Overhead; Colly ist ein Crawler in dieser Kategorie, während Trafilatura auf Artikelauszug spezialisiert ist. Wenn Sie Queueing, Persistenz und Throttling brauchen, nutzen Sie ein Crawler-Framework oder einen Playwright-Wrapper. Wenn Sie schemaförmige Ausgaben wollen, ohne Selektoren selbst zu pflegen, vergleichen Sie Managed-Extraction-Services. Keine dieser Alternativen wurde in dieser Review benchmarked.
Wenn Sie speziell zwischen Playwright und Puppeteer entscheiden, ist das ein eigenes Kopf-an-Kopf-Duell; unser direkter Vergleich führt beide durch dieselben Fixtures und zeigt, wo die Entscheidung wirklich landet.
Alternativen und die Rolle von Managed Extraction
Playwright ist kostenlos, Apache-2.0-lizenziert und selbst gehostet. Sie tragen Browser-Bereitstellung, Selektoren, Readiness-Bedingungen, Crawl-Code, Updates und Fehlerbehandlung selbst. Diese Review hat weder Anti-Bot-Leistung gemessen noch die Gesamtkosten mit einem Managed Service verglichen.
Innerhalb von Open Source lohnt sich der Vergleich nach Aufgabe. Für Crawling in Browser-Größe ergänzt Crawlee die Queue und das Dataset, die Playwright fehlen. Wenn das Ausgabeziel LLM-taugliches Markdown aus einem echten Browser ist statt manuell geformter Zeilen, Crawl4AI startet einen Browser und erzeugt dafür Markdown. Und wenn Sie mehrere dieser Tools gleichzeitig abwägen, ordnet unser Open-Source-Scraper-Überblick die Kategorien nebeneinander ein.
Hinweis: Thunderbit ist das Produkt des Herausgebers und wurde nicht mit diesem Playwright-Fixture ausgeführt. Es steht für die Kategorie Managed Extraction: Der Service übernimmt das Rendering und liefert Seitentext oder schemaförmige Datensätze zurück, während Playwright Browser-Betrieb und Selektorlogik beim Entwickler belässt. Der Vergleich betrifft daher Hosting-Modell, Ausgabeform und Kostenmodell — nicht ein Performance-Ergebnis aus dieser Review.
Thunderbit für Web-Datenextraktion testen
Fazit
Nutzen Sie Playwright, wenn Ihr Ziel eine Browser-Engine braucht und Sie bereit sind, Readiness-Bedingungen, Selektoren und Crawl-Orchestrierung selbst zu übernehmen. Die Ergebnistabelle zeigt, dass der Chromium-Library-Mode in diesem autorseitigen Durchlauf die kontrollierten statischen, dynamischen, API-, Screenshot- und Fehler-Fälle wie erwartet bewältigt hat.
Halten Sie die Evidenzgrenze sauber: Es wurden nur Chromium und Node geprüft, der 12-Seiten-Durchlauf hing von einer manuell geschriebenen BFS ab, browserContext.request umging das Rendern der Seite, aber nicht den bereits laufenden Browser-Prozess, und jede dynamische Extraktion nutzte einen ausdrücklich gesetzten Readiness-Selektor. Damit ist Playwright in dieser Review ein Browser-Primitiv, kein gemessenes End-to-End-Crawling-System.
Thunderbit für Web-Datenextraktion testen Get Started Free
FAQs
Brauche ich beim Scraping mit Playwright trotzdem Wartebedingungen?
Ja. Die Browser-Ausführung sagt Ihrem Skript nicht, wann die Anwendungsdaten wirklich bereit sind. Diese Tests navigierten bis domcontentloaded und warteten anschließend auf einen zielseitigen Selektor, bevor extrahiert wurde. Produktionsseiten benötigen möglicherweise ein anderes Signal, etwa eine Response, einen Locator-Zustand oder ein Anwendungsereignis.
Kann Playwright eine ganze Website allein crawlen? Nicht von Haus aus. Es gibt keine eingebaute Request-Queue, keinen Dataset-Writer und kein Auto-Throttle — mein Crawl-Graph-Test kam nur deshalb auf 12 Seiten mit den Tiefen {0:1, 1:4, 2:7}, weil ich die Breadth-First-Suche selbst geschrieben habe. Für Crawling in größerem Maßstab kombinieren Sie Playwright mit Crawlee, das eine echte Crawling-Schicht darum legt, oder verwenden Sie direkt ein Crawler-Framework.
Wann sollte ich browserContext.request statt eines eigenständigen Request-Kontexts verwenden?
Nutzen Sie browserContext.request, wenn HTTP-Aufrufe Cookies mit Seiten im bestehenden Browser-Kontext teilen sollen. Nutzen Sie playwright.request.newContext(), wenn Sie einen API-only-Kontext ohne Browser-Start wollen und keine automatische Cookie-Teilung mit Browser-Seiten brauchen. In dieser Review wurde nur der erste Weg getestet.
Wurden Firefox und WebKit hier getestet? Nein. Alle Tests liefen auf Chromium, auf einem Rechner, in einem Einzel-Lauf. Playwrights Unterstützung für drei Engines (Chromium, Firefox, WebKit) sowie die Python-, Java- und .NET-Clients sind dokumentierte Fähigkeiten, die ich als dokumentiert wiedergebe, nicht als verifiziert — Firefox-/WebKit-Parität, Proxying, Parallelität und Netzwerk-Interception liegen außerhalb dessen, was diese Zahlen abdecken.
Welche Umgebung deckte diese Review ab? Playwright 1.56.0, Node v22.22.3, macOS arm64 und nur Chromium. Firefox, WebKit, Proxying, Parallelität, Anti-Bot-Verhalten und spätere Playwright-Versionen lagen außerhalb des Laufs. Für die Installation waren die Library plus ein separater Browser-Build-Download nötig.


