Playwright: Web-Scraping & Testing
Meistern Sie die Browserautomatisierung für Tests und Web-Scraping
Playwright ist ein leistungsstarkes, modernes Browser-Automatisierungs-Framework, das das Web-Scraping und End-to-End-Testing revolutioniert.
Entwickelt von Microsoft, bietet es eine einheitliche API zur Automatisierung von Chromium-, Firefox- und WebKit-Browsern mit beispielloser Zuverlässigkeit und Geschwindigkeit.

Was ist Playwright?
Playwright ist ein Open-Source-Browser-Automatisierungs-Framework, das Entwicklern ermöglicht, zuverlässige End-to-End-Tests zu schreiben und anspruchsvolle Web-Scraping-Lösungen zu erstellen. Im Gegensatz zu traditionellen Automatisierungstools wurde Playwright von Grund auf entwickelt, um moderne Webanwendungen mit dynamischen Inhalten, Single-Page-Anwendungen (SPAs) und komplexen JavaScript-Frameworks zu handhaben.
Das Framework löst das Kernproblem, das frühere Automatisierungstools plagte: Unzuverlässigkeit. Playwright führt Auto-Waiting-Mechanismen ein, die automatisch warten, bis Elemente für Aktionen bereit sind, bevor Operationen durchgeführt werden. Dadurch entfällt die Notwendigkeit willkürlicher Timeouts und Sleep-Anweisungen, die Tests unzuverlässig machten.
Wichtige Funktionen
Cross-Browser-Unterstützung: Playwright unterstützt alle wichtigen Browser-Engines - Chromium (einschließlich Chrome und Edge), Firefox und WebKit (Safari). Dies bedeutet, dass Sie Ihr Automatisierungsskript einmal schreiben und auf verschiedenen Browsern ausführen können, ohne Änderungen vorzunehmen, und so sicherstellen, dass Ihre Webanwendungen überall konsistent funktionieren.
Auto-Waiting: Eine der mächtigsten Funktionen von Playwright ist sein eingebauter Auto-Waiting-Mechanismus. Bevor eine Aktion durchgeführt wird, wartet Playwright automatisch, bis Elemente sichtbar, aktiviert, stabil und nicht verdeckt sind. Dies eliminiert Race Conditions und macht Tests im Vergleich zu Tools wie Selenium, bei denen explizite Wartezeiten oft notwendig sind, deutlich zuverlässiger.
Netzwerk-Interception: Playwright ermöglicht es Ihnen, Netzwerkanfragen und -antworten abzufangen, zu modifizieren und zu simulieren. Dies ist unschätzbar für das Testen von Randfällen, das Simulieren langsamer Netzwerke, das Blockieren unnötiger Ressourcen beim Scraping oder das Simulieren von API-Antworten ohne Backend.
Mobile Emulation: Testen Sie mobile Webanwendungen, indem Sie verschiedene mobile Geräte mit spezifischen Viewport-Größen, Benutzeragenten und Touch-Ereignissen emulieren. Playwright enthält Gerätebeschreibungen für beliebte Telefone und Tablets.
Mächtige Selektoren: Neben CSS- und XPath-Selektoren unterstützt Playwright Textselektoren, rollenbasierte Selektoren für Barrierefreiheitstests und sogar experimentelle React- und Vue-Selektoren für komponentenbasierte Frameworks.
Installation und Einrichtung
Die Einrichtung von Playwright ist in verschiedenen Programmiersprachen einfach.
Python-Installation
Für Python-Projekte kann Playwright über pip installiert werden und umfasst sowohl synchrone als auch asynchrone APIs. Wenn Sie nach einem schnelleren, moderneren Python-Paketmanager suchen, werfen Sie einen Blick auf unsere Anleitung zu uv - Python Package, Project, and Environment Manager:
# Playwright-Paket installieren
pip install playwright
# Browser installieren (Chromium, Firefox, WebKit)
playwright install
# Nur für einen bestimmten Browser
playwright install chromium
Für eine umfassende Referenz der Python-Syntax und häufig verwendeter Befehle bei der Arbeit mit Playwright, siehe unseren Python Cheatsheet.
JavaScript/TypeScript-Installation
Für Node.js-Projekte installieren Sie Playwright über npm oder yarn:
# Mit npm
npm init playwright@latest
# Mit yarn
yarn create playwright
# Manuelle Installation
npm install -D @playwright/test
npx playwright install
Der Befehl npm init playwright bietet eine interaktive Einrichtung, die Ihr Projekt mit Beispieltests, Konfigurationsdateien und GitHub Actions-Workflows konfiguriert.
Grundlegende Konfiguration
Erstellen Sie eine playwright.config.ts (TypeScript) oder playwright.config.js (JavaScript) Datei:
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
timeout: 30000,
retries: 2,
workers: 4,
use: {
headless: true,
viewport: { width: 1280, height: 720 },
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
],
});
Web-Scraping mit Playwright
Playwright glänzt beim Web-Scraping, insbesondere für moderne Websites mit dynamischen Inhalten, mit denen traditionelle Scraping-Bibliotheken Schwierigkeiten haben.
Grundlegendes Scraping-Beispiel
Hier ist ein umfassendes Python-Beispiel, das die grundlegenden Scraping-Konzepte demonstriert:
from playwright.sync_api import sync_playwright
import json
def scrape_website():
with sync_playwright() as p:
# Browser starten
browser = p.chromium.launch(headless=True)
# Kontext für Isolation erstellen
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
)
# Neue Seite öffnen
page = context.new_page()
# Zu URL navigieren
page.goto('https://example.com/products')
# Warten, bis der Inhalt geladen ist
page.wait_for_selector('.product-item')
# Daten extrahieren
products = page.query_selector_all('.product-item')
data = []
for product in products:
title = product.query_selector('h2').inner_text()
price = product.query_selector('.price').inner_text()
url = product.query_selector('a').get_attribute('href')
data.append({
'title': title,
'price': price,
'url': url
})
# Aufräumen
browser.close()
return data
# Scraper ausführen
results = scrape_website()
print(json.dumps(results, indent=2))
Umgang mit dynamischen Inhalten
Moderne Websites laden Inhalte oft dynamisch über JavaScript. Playwright handelt dies nahtlos:
async def scrape_dynamic_content():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto('https://example.com/infinite-scroll')
# Scrollen, um mehr Inhalte zu laden
for _ in range(5):
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.wait_for_timeout(2000)
# Warten, bis das Netzwerk inaktiv ist
await page.wait_for_load_state('networkidle')
# Alle geladenen Elemente extrahieren
items = await page.query_selector_all('.item')
await browser.close()
Umwandlung von gescrapeten Inhalten in Markdown
Nach dem Extrahieren von HTML-Inhalten mit Playwright müssen Sie diese oft in ein nutzbareres Format umwandeln. Für umfassende Anleitungen zur Umwandlung von HTML in Markdown, sehen Sie unsere Artikel zu Konvertierung von HTML zu Markdown mit Python: Eine umfassende Anleitung, die 6 verschiedene Python-Bibliotheken vergleicht, und Konvertierung von HTML-Inhalten in Markdown mit LLM und Ollama für KI-gestützte Umwandlung. Wenn Sie stattdessen mit Word-Dokumenten arbeiten, werfen Sie einen Blick auf unsere Anleitung zu Konvertierung von Word-Dokumenten in Markdown.
Authentifizierung und Sitzungsverwaltung
Wenn das Scraping eine Authentifizierung erfordert, macht Playwright es einfach, den Browserzustand zu speichern und wiederzuverwenden:
def login_and_save_session():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
# Anmeldung
page.goto('https://example.com/login')
page.fill('input[name="username"]', 'your_username')
page.fill('input[name="password"]', 'your_password')
page.click('button[type="submit"]')
# Warten auf Navigation nach der Anmeldung
page.wait_for_url('**/dashboard')
# Authentifizierten Zustand speichern
context.storage_state(path='auth_state.json')
browser.close()
def scrape_with_saved_session():
with sync_playwright() as p:
browser = p.chromium.launch()
# Wiederverwendung des gespeicherten Authentifizierungszustands
context = browser.new_context(storage_state='auth_state.json')
page = context.new_page()
# Bereits authentifiziert!
page.goto('https://example.com/protected-data')
# ... geschützte Inhalte scrapen
browser.close()
Dieser Ansatz ist besonders nützlich, wenn Sie mit APIs arbeiten oder MCP-Server für KI-Integrationen erstellen. Für eine vollständige Anleitung zur Implementierung von Web-Scraping in KI-Tool-Integrationen, sehen Sie unseren Artikel zu Erstellung von MCP-Servern in Python: WebSearch & Scrape.
End-to-End-Testing
Playwrights primärer Anwendungsfall ist das Schreiben robuster End-to-End-Tests für Webanwendungen.
Erstellen Ihres ersten Tests
Hier ist ein vollständiges Testbeispiel in TypeScript:
import { test, expect } from '@playwright/test';
test('Benutzer kann Artikel in den Warenkorb legen', async ({ page }) => {
// Navigieren zur Startseite
await page.goto('https://example-shop.com');
// Produkt suchen
await page.fill('[data-testid="search-input"]', 'laptop');
await page.press('[data-testid="search-input"]', 'Enter');
// Auf Suchergebnisse warten
await expect(page.locator('.product-card')).toBeVisible();
// Erstes Produkt anklicken
await page.locator('.product-card').first().click();
// Überprüfen, ob Produktseite geladen wurde
await expect(page).toHaveURL(/\/product\/.+/);
// Zum Warenkorb hinzufügen
await page.click('[data-testid="add-to-cart"]');
// Überprüfen, ob Warenkorb aktualisiert wurde
const cartCount = page.locator('[data-testid="cart-count"]');
await expect(cartCount).toHaveText('1');
});
Page Object Model
Für größere Test-Suiten verwenden Sie das Page Object Model-Muster, um die Wartbarkeit zu verbessern:
// pages/LoginPage.ts
export class LoginPage {
constructor(private page: Page) {}
async navigate() {
await this.page.goto('/login');
}
async login(username: string, password: string) {
await this.page.fill('[name="username"]', username);
await this.page.fill('[name="password"]', password);
await this.page.click('button[type="submit"]');
}
async getErrorMessage() {
return await this.page.locator('.error-message').textContent();
}
}
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
test('Anmeldung mit ungültigen Anmeldedaten zeigt Fehler', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.navigate();
await loginPage.login('invalid@email.com', 'wrongpass');
const error = await loginPage.getErrorMessage();
expect(error).toContain('Ungültige Anmeldedaten');
});
Erweitete Funktionen
Codegen - Automatische Testgenerierung
Playwrights Codegen-Tool generiert Tests durch Aufzeichnen Ihrer Interaktionen mit einer Webseite:
# Codegen öffnen
playwright codegen example.com
# Mit spezifischem Browser
playwright codegen --browser firefox example.com
# Mit gespeichertem Authentifizierungsstatus
playwright codegen --load-storage=auth.json example.com
Während Sie mit der Seite interagieren, generiert Codegen Code in Echtzeit. Dies ist unglaublich nützlich, um Tests schnell zu prototypisieren oder Playwrights Selektor-Syntax zu erlernen.
Trace Viewer für Debugging
Wenn Tests fehlschlagen, kann es schwierig sein, den Grund zu verstehen. Playwrights Trace Viewer bietet eine Zeitachse der Testausführung:
// Tracing in der Konfiguration aktivieren
use: {
trace: 'on-first-retry',
}
Nach einem fehlgeschlagenen Test und einem erneuten Versuch, sehen Sie die Spur:
playwright show-trace trace.zip
Der Trace Viewer zeigt Screenshots bei jeder Aktion, Netzwerkaktivität, Konsolenprotokolle und DOM-Snapshots, was das Debugging vereinfacht.
Netzwerk-Interception und Mocking
Erfassen und ändern Sie Netzwerkverkehr zum Testen von Randfällen:
def test_with_mocked_api():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# API-Antwort mocken
def handle_route(route):
if 'api/products' in route.request.url:
route.fulfill(
status=200,
body=json.dumps({
'products': [
{'id': 1, 'name': 'Test Produkt', 'price': 99.99}
]
})
)
else:
route.continue_()
page.route('**/*', handle_route)
page.goto('https://example.com')
# Seite verwendet nun gemockte Daten
browser.close()
Mobile Testing
Testen Sie Ihre responsiven Designs auf verschiedenen Geräten:
from playwright.sync_api import sync_playwright
def test_mobile():
with sync_playwright() as p:
# Gerätebeschreibung verwenden
iphone_13 = p.devices['iPhone 13']
browser = p.webkit.launch()
context = browser.new_context(**iphone_13)
page = context.new_page()
page.goto('https://example.com')
# Als mobiler Benutzer interagieren
page.locator('#mobile-menu-button').click()
browser.close()
Best Practices
Für Web Scraping
- Headless-Modus in der Produktion verwenden: Headless-Browsing ist schneller und verbraucht weniger Ressourcen
- Rate Limiting implementieren: Respektieren Sie Zielwebsites mit Verzögerungen zwischen Anfragen
- Fehler elegant behandeln: Netzwerkprobleme, Timeouts und Selektoränderungen treten auf
- User Agents rotieren: Vermeiden Sie Erkennung durch Variation von Browser-Fingerabdrücken
- Respektieren Sie robots.txt: Prüfen und befolgen Sie die Scraping-Richtlinien der Website
- Verwenden Sie Context Isolation: Erstellen Sie separate Browser-Kontexte für paralleles Scraping
Beim Konvertieren von gescrapten Inhalten in Markdown-Format sollten Sie LLM-basierte Konvertierungstools oder Python-Bibliotheken für eine sauberere HTML-zu-Markdown-Konvertierung in Betracht ziehen.
Für Testing
- Verwenden Sie Data-testid-Attribute: Stabiler als CSS-Klassen, die sich häufig ändern
- Vermeiden Sie harte Wartezeiten: Verwenden Sie stattdessen Playwrights eingebaute Warten-Mechanismen anstelle von
sleep() - Halten Sie Tests unabhängig: Jeder Test sollte in Isolation ausgeführt werden können
- Verwenden Sie Fixtures: Teilen Sie Setup-Code effizient zwischen Tests
- Führen Sie Tests parallel aus: Nutzen Sie Playwrights Worker-Threads für Geschwindigkeit
- Aufzeichnen von Spuren bei Fehlern: Aktivieren Sie die Spuraufzeichnung für einfacheres Debugging
Performance-Optimierung
# Deaktivieren Sie unnötige Ressourcen
def fast_scraping():
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
# Blockieren Sie Bilder und Stylesheets, um das Scraping zu beschleunigen
async def block_resources(route):
if route.request.resource_type in ['image', 'stylesheet', 'font']:
await route.abort()
else:
await route.continue_()
page.route('**/*', block_resources)
page.goto('https://example.com')
browser.close()
Playwright im Vergleich zu Alternativen
Playwright vs Selenium
Vorteile von Playwright:
- Integriertes Auto-Waiting eliminiert flüchtige Tests
- Schnellere Ausführung aufgrund moderner Architektur
- Bessere Netzwerk-Interception und Mocking
- Überlegene Debugging-Tools (Trace Viewer)
- Einfachere API mit weniger Boilerplate
- Mehrere Browser mit einer Installation
Vorteile von Selenium:
- Reifere Ökosysteme mit umfangreicher Community
- Unterstützt mehr Programmiersprachen
- Breitere Browserkompatibilität einschließlich älterer Versionen
Playwright vs Puppeteer
Vorteile von Playwright:
- Echte Cross-Browser-Unterstützung (Firefox, WebKit, Chromium)
- Bessere API-Entwicklung basierend auf Puppeteer-Erfahrungen
- Leistungsfähigere Debugging-Tools
- Microsoft-Unterstützung und aktive Entwicklung
Vorteile von Puppeteer:
- Etwas kleinerer Fußabdruck
- Chrome DevTools Protocol-Expertise
Für die meisten neuen Projekte ist Playwright die empfohlene Wahl aufgrund seiner modernen Architektur und umfassenden Funktionspalette. Wenn Sie mit Go anstatt Python oder JavaScript arbeiten und Web-Scraping-Funktionen benötigen, werfen Sie einen Blick auf unsere Anleitung zu Beautiful Soup Alternativen für Go für vergleichbare Scraping-Tools im Go-Ökosystem.
Häufige Anwendungsfälle
Datenextraktion für KI/LLM-Anwendungen
Playwright eignet sich hervorragend zum Sammeln von Trainingsdaten oder zum Erstellen von Web-Suchfunktionen für KI-Modelle. Beim Aufbau von MCP (Model Context Protocol)-Servern kann Playwright die Web-Scraping-Komponente übernehmen, während LLMs die extrahierten Inhalte verarbeiten.
Automatisiertes Testing in CI/CD
Integrieren Sie Playwright-Tests in Ihre Continuous-Integration-Pipeline:
# .github/workflows/playwright.yml
name: Playwright Tests
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- name: Abhängigkeiten installieren
run: npm ci
- name: Playwright-Browser installieren
run: npx playwright install --with-deps
- name: Playwright-Tests ausführen
run: npx playwright test
- uses: actions/upload-artifact@v3
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
Website-Monitoring
Überwachen Sie Ihre Produktionswebsites auf Verfügbarkeit und Funktionalität:
import schedule
import time
def monitor_website():
with sync_playwright() as p:
try:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://your-site.com', timeout=30000)
# Kritische Elemente überprüfen
assert page.is_visible('.header')
assert page.is_visible('#main-content')
print("✓ Website ist gesund")
except Exception as e:
print(f"✗ Website-Problem erkannt: {e}")
# Alarm senden
finally:
browser.close()
# Alle 5 Minuten ausführen
schedule.every(5).minutes.do(monitor_website)
while True:
schedule.run_pending()
time.sleep(1)
Fehlerbehebung bei häufigen Problemen
Browser-Installationsprobleme
Wenn Browser nicht heruntergeladen werden können:
# Setzen Sie einen benutzerdefinierten Download-Pfad
PLAYWRIGHT_BROWSERS_PATH=/custom/path playwright install
# Cache leeren und neu installieren
playwright uninstall
playwright install
Timeout-Fehler
Erhöhen Sie Timeouts für langsame Netzwerke oder komplexe Seiten:
page.goto('https://slow-site.com', timeout=60000) # 60 Sekunden
page.wait_for_selector('.element', timeout=30000) # 30 Sekunden
Selektor nicht gefunden
Verwenden Sie den Playwright-Inspector, um die richtigen Selektoren zu identifizieren:
PWDEBUG=1 pytest test_file.py
Dies öffnet den Inspector, in dem Sie über Elemente fahren können, um deren Selektoren zu sehen.
Fazit
Playwright repräsentiert den neuesten Stand der Browser-Automatisierungstechnologie, indem es leistungsstarke Funktionen mit einer hervorragenden Entwicklererfahrung kombiniert. Ob Sie eine Web-Scraping-Pipeline erstellen, umfassende Testabdeckung implementieren oder automatisierte Workflows erstellen - Playwright bietet die Tools und Zuverlässigkeit, die Sie benötigen.
Seine Auto-Waiting-Mechanismen eliminieren instabile Tests, die Cross-Browser-Unterstützung stellt sicher, dass Ihre Anwendungen überall funktionieren, und leistungsstarke Debugging-Tools machen die Fehlerbehebung einfach. Da Webanwendungen weiterhin an Komplexität zunehmen, machen die moderne Architektur und die aktive Entwicklung von Playwright es zu einer hervorragenden Wahl für alle Anforderungen an die Browser-Automatisierung.
Für Python-Entwickler, die an Datenpipelines oder Web-Scraping-Projekten arbeiten, integriert sich Playwright nahtlos in moderne Paketmanager und funktioniert hervorragend neben pandas, requests und anderen Data-Science-Tools. Die Fähigkeit, strukturierte Daten aus komplexen modernen Websites zu extrahieren, macht es unverzichtbar für KI-Anwendungen, Forschungsprojekte und Business Intelligence. In Kombination mit HTML-zu-Markdown-Umwandlungstools und einer ordnungsgemäßen Inhaltsverarbeitung wird Playwright zu einer vollständigen Lösung für die Extraktion, Transformation und Nutzung von Webdaten im großen Stil.
Nützliche Links
- Python Cheatsheet
- uv - Python Package, Project, and Environment Manager
- Convert HTML content to Markdown using LLM and Ollama
- Converting Word Documents to Markdown: A Complete Guide
- Converting HTML to Markdown with Python: A Comprehensive Guide
- Building MCP Servers in Python: WebSearch & Scrape
- Beautiful Soup Alternatives for Go