PDF-Dokumente mit Playwright und KI testen

PDF-Dateien gehören zu den Dingen, die in der Testautomatisierung gerne vergessen werden – dabei lassen sie sich mit den richtigen Tools erstaunlich unkompliziert automatisieren. Gerade im behördlichen Umfeld, in dem Bescheide, Formulare oder Urkunden häufig als PDF bereitgestellt werden, ist deren automatisierte Prüfung jedoch unverzichtbar.

In diesem Beitrag zeige ich, wie man mit Playwright und dem npm-Paket pdf-parse sowohl statische PDF-Dokumente als auch dynamisch heruntergeladene PDF-Dateien testen kann.

Als Testobjekt verwende ich ein PDF-Dokument der IHK. Genauer gesagt eine Beispielrechnung, die ihr unter folgender URL einsehen könnt: hier. Viel Spaß! 🙂

Kurz: Worum geht es in diesem Beitrag?

Wir gehen zwei typische Szenarien durch:

  • Ein bereits vorhandenes PDF auslesen und den Inhalt gezielt validieren.
  • Ein PDF, das der Nutzer erst per Download-Button herunterlädt, direkt im Testlauf abfangen und prüfen – ganz ohne die Datei lokal zu speichern.

Für beide Fälle nutzen wir das npm-Paket pdf-parse sowie KI-Unterstützung, um passende reguläre Ausdrücke zu erzeugen.

Installation: pdf-parse einbinden

Ich gehe davon aus, dass bereits ein Playwright-Projekt existiert. Falls nicht, lässt sich eines mit npm init playwright@latest anlegen.

Die Installation von pdf-parse ist mit einem einzigen Befehl im Projektverzeichnis erledigt:

npm install pdf-parse --save-dev

Damit wird das Paket automatisch in die package.json eingetragen.

Anschließend wird das Modul im Test importiert:

import pdf from 'pdf-parse';

💡 Hinweis: Node-Version beachten

Beim Testen ist mir aufgefallen, dass pdf-parse in Version 2.x eine neuere Node.js-Version voraussetzt (>=20.16.0). Falls du beim Test-Lauf Fehler wie DOMMatrix is not defined oder process.getBuiltinModule is not a function bekommst, liegt das fast immer an einer älteren Node-Version. Kein Grund zur Sorge – zwei Optionen:

  • Node über nvm auf mindestens 20.16.0 aktualisieren, oder
  • alternativ die ältere, stabile Version pdf-parse@1.1.1 verwenden (dafür ändert sich nur die Import-Syntax leicht)

Da für dieses Tutorial nur das grundlegende Auslesen von PDF-Text benötigt wird, verwende ich hier bewusst Variante zwei:

Siehe danach auch die Package.json:

Die restlichen Code-Beispiele in diesem Beitrag beziehen sich auf diese Version.

PDF-Inhalt auslesen

Der erste Test dafür ist schnell aufgesetzt: Wir öffnen das PDF per fetch(), wandeln die Antwort in einen Buffer um und übergeben diesen an pdf-parse.

import { test, expect } from '@playwright/test';
import pdf from 'pdf-parse';

test('PDF-Inhalt auslesen', async () => {
  const response = await fetch('https://www.ihk.de/blueprint/servlet/resource/blob/5581278/1cafa7f203df9d83e050d9f01677ffe6/rechnung-kleinunternehmer-data.pdf');
  const buffer = await response.arrayBuffer();
  const data = await pdf(Buffer.from(buffer));

  console.log(data.text);
});

Als Beispiel verwende ich die Musterrechnung für Kleinunternehmer der IHK – ein öffentlich zugängliches PDF, das sich ideal zum Üben eignet, da es typische Rechnungsfelder wie Rechnungsnummer, Rechnungsbetrag und IBAN enthält.
Führt man den Test aus, wird der komplette Textinhalt des PDFs in der Konsole ausgegeben.

Damit ist das Auslesen erledigt – die halbe Miete ist geschafft.

Präzise validieren: Reguläre Ausdrücke mit KI generieren

Der reine Textinhalt ist erst mal nur ein langer String. Eine einfache Prüfung könnte also so aussehen:

expect(data.text).toContain('2022-10001');

Das funktioniert, ist aber ungenau: Man prüft nur, ob die Zeichenfolge irgendwo im Dokument vorkommt – nicht, ob sie tatsächlich zur Rechnungsnummer gehört. In der IHK-Musterrechnung steht die Nummer im Format Rechnung Nr. 2022-10001 – genau dieses Muster wollen wir gezielt validieren.

Für präzisere Prüfungen eignen sich reguläre Ausdrücke deutlich besser. Da das manuelle Erstellen von Regex-Mustern oft mühsam ist, lohnt es sich, ein KI-Tool wie GitHub Copilot, ChatGPT oder Cursor damit zu beauftragen. Ein Prompt könnte etwa so aussehen:

Erstelle einen Regex für einen String, um in diesem Text ein Feld mit dem Label 'Rechnung Nr.' und der zugehörigen Nummer zu validieren.

Klingt gut, oder ? 🙂

Das Ergebnis lässt sich direkt in den Test übernehmen.  Optional lässt sich auf die gleiche Weise natürlich auch der Rechnungsbetrag oder die IBAN prüfen.

Im Ergebnis entstehen nun folgende zwei Tests um die Rechnungsnummer- und den Betrag zu validieren:

Praxisbeispiel: Heruntergeladenes PDF testen

Bisher haben wir ein bereits vorhandenes PDF ausgelesen. In der Praxis lädt man ein PDF aber oft erst per Klick in der Anwendung herunter. Für dieses Szenario braucht es einen etwas anderen Ansatz.

Zunächst navigiert man zur entsprechenden Seite der eigenen Anwendung:

await page.goto('https://deine-anwendung.de/download-seite');

Der Trick beim Testen von Downloads: Man muss das download-Event abfangen, ohne den richtigen Zeitpunkt zu verpassen. Dafür kombiniert man das Warten auf das Event und den Klick auf den Download-Button in einem Promise.all:

const [download] = await Promise.all([
  page.waitForEvent('download'),
  page.getByRole('button', { name: 'Download PDF' }).click(),
]);

Die Download-Daten auslesen

Jetzt wird es spannend und ich hatte vorab auch keine Erfahrung mit dieser Lösung: Anstatt die heruntergeladene Datei physisch zu speichern und erneut einzulesen, liest man den Datenstream direkt aus – das erspart unnötigen Datenmüll auf dem eigenen System. Dazu genügt eine kleine Hilfsfunktion, die den Download-Stream in einen Buffer überführt:

Da die PDF-Datei von einer fremden Domain (Cross-Origin) stammt, wird sie zunächst im Browserkontext per fetch() als Blob geladen und daraus eine Blob-URL erzeugt. Über einen unsichtbaren Download-Link mit dieser Blob-URL löst man dann gezielt das download-Event aus:

Den entstandenen Buffer übergibt man anschließend direkt an pdf-parse:

Führt man den Test jetzt aus, wird das PDF wie erwartet per Blob-URL heruntergeladen, der Stream direkt in einen Buffer gelesen und der Inhalt erfolgreich validiert.

Tipps für bessere Ergebnisse

  • 1. Regex nicht manuell schreiben: Ein KI-Tool liefert in Sekunden ein passendes Muster – Zeit, die man sich sparen sollte.
  • 2. Keine physischen Dateien anlegen: Bei Downloads immer den Datenstream direkt verarbeiten statt Dateien im Testsystem zu erzeugen.
  • 3. Präzise statt pauschal validieren: toContain reicht für schnelle Checks, für belastbare Tests sind Regex-Muster die bessere Wahl.
  • 4. Promise.all nutzen: So verpasst man beim Abfangen von Download-Events keinen Timing-Fehler.

Fazit: Einfacher als gedacht

Die Eingangsfrage war: Lässt sich das Testen von PDF-Dokumenten in Playwright wirklich einfach automatisieren?

Die Antwort: Ja. :- ) Mit pdf-parse, ein paar Zeilen Code und KI-generierten Regex-Mustern lassen sich sowohl statische als auch dynamisch heruntergeladene PDF-Dateien zuverlässig in die eigene Playwright-Testsuite integrieren – ganz ohne unnötigen Aufwand.

Weiterführende Links

Dieser Beitrag wurde veröffentlicht .