Device-Emulation vs. echte Geräte: Wann was nötig ist
PASS
expect()
Testing · E2E · Cypress · Playwright
Device-Emulation vs. echte Geräte
Wann was wirklich nötig ist

Device-Emulation in Cypress und Playwright simuliert Viewport, User-Agent und Touch-Events in Sekundenschnelle und liefert damit schnelles Feedback in jeder CI-Pipeline. Was dabei unsichtbar bleibt, sind reale GPU- und CPU-Grenzen, echte Mobilfunk-Latenz und die Rendering-Eigenheiten von Safari auf iOS. Dieser Artikel zeigt konkret, wann Emulation genügt und wann Cloud-Testing mit echten Geräten wie BrowserStack oder Sauce Labs unverzichtbar wird.

14 Min. Lesezeit Cypress · Playwright · BrowserStack Emulation · Viewport · Touch Events

1. Was Device-Emulation im Browser tatsächlich simuliert

Device-Emulation in Chromium-basierten Browsern setzt an vier konkreten Stellen an: den Viewport-Dimensionen, dem User-Agent-String, der Touch-Event-Fähigkeit und dem Device Pixel Ratio (DPR). Cypress und Playwright nutzen dafür intern das Chrome DevTools Protocol (CDP), genauer den Befehl Emulation.setDeviceMetricsOverride, der dem Browser vorgaukelt, er würde auf einem Bildschirm mit anderen Maßen und einer anderen Pixeldichte laufen. Der User-Agent-String wird separat über Emulation.setUserAgentOverride gesetzt und ändert, was window.navigator.userAgent zurückgibt sowie welche serverseitige Content-Negotiation greift. Diese vier Werte reichen aus, um die meisten CSS-Media-Queries, JavaScript-Feature-Detections wie matchMedia('(hover: hover)') und responsive Layout-Berechnungen korrekt auszulösen.

Wichtig ist dabei: Die eigentliche Rendering-Engine bleibt unverändert. Ein als iPhone emuliertes Playwright-Setup rendert weiterhin mit der von Playwright mitgelieferten WebKit-Build oder mit Chromium, je nachdem welche Browser-Engine im Testlauf gewählt wurde, nicht mit dem tatsächlichen Betriebssystem-Stack eines iPhones. Für viele funktionale End-to-End-Tests wie Formularvalidierung, Warenkorb-Logik oder responsive Navigation ist das ausreichend, weil diese Tests primär auf DOM-Struktur und CSS-Verhalten reagieren, nicht auf plattformspezifische Rendering-Details. Wo die Grenze liegt, zeigt sich erst, wenn ein Test tatsächlich hardwarenahes oder engine-spezifisches Verhalten prüfen soll.

2. Emulation in Cypress und Playwright konfigurieren

Playwright setzt Emulation auf Browser-Context-Ebene: browser.newContext({ viewport, userAgent, deviceScaleFactor, isMobile, hasTouch }) erzeugt einen isolierten Kontext mit exakt definierten Geräte-Eigenschaften, der für die gesamte Testsuite oder einzelne Test-Dateien gilt. Cypress arbeitet pragmatischer: cy.viewport(width, height) setzt Breite und Höhe pro Test oder in einem beforeEach-Hook, während der User-Agent-String entweder über eine Plugin-Konfiguration in cypress.config.js oder per Header-Manipulation gesetzt wird, da Cypress diesen Wert nicht nativ pro Test überschreibt.

Ein praktischer Unterschied betrifft die Browser-Engine-Auswahl: Playwright bringt eigene, gebundlete Builds von Chromium, Firefox und WebKit mit und erlaubt echte Cross-Engine-Tests im selben Testlauf. Cypress läuft historisch primär auf Chromium-basierten Browsern und Electron, WebKit-Unterstützung ist experimentell und deutlich eingeschränkter. Für Teams, die neben Chrome auch Safari-ähnliches Rendering-Verhalten testen wollen, ist Playwrights WebKit-Build näher an echtem Safari-Verhalten als jede reine User-Agent-Emulation in Chromium, was aber, wie später gezeigt, immer noch nicht identisch mit echtem iOS Safari ist.


// Playwright: emulate viewport, user agent, touch and DPR in a browser context
import { chromium } from '@playwright/test';

const browser = await chromium.launch();
const context = await browser.newContext({
  viewport: { width: 390, height: 844 }, // iPhone 14 logical viewport
  userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
  deviceScaleFactor: 3,
  isMobile: true,
  hasTouch: true,
});
const page = await context.newPage();
await page.goto('https://shop.example.com/checkout');

// Cypress: viewport is set per test, user agent via plugin or header override
describe('Checkout on emulated mobile viewport', () => {
  beforeEach(() => {
    cy.viewport(390, 844); // width, height in CSS pixels
  });

  it('renders the sticky checkout button', () => {
    cy.visit('/checkout');
    cy.get('[data-testid="checkout-submit"]').should('be.visible');
  });
});

3. Playwright Device Descriptors im Detail

Playwright liefert unter devices ein kuratiertes Dictionary vorkonfigurierter Geräteprofile mit, das Viewport, User-Agent, Device Pixel Ratio, Touch-Fähigkeit und die bevorzugte Standard-Engine in einem Objekt bündelt. test.use({ ...devices['iPhone 14 Pro'] }) setzt all diese Werte in einer Zeile, statt sie manuell zusammenzustellen und dabei versehentlich inkonsistente Kombinationen zu erzeugen, etwa einen Mobile-User-Agent mit deaktiviertem Touch-Flag.

Die Profile werden von Playwright regelmäßig aus echten Geräte-Spezifikationen aktualisiert, sind aber weiterhin ein statischer Snapshot und keine Live-Verbindung zu einem realen Gerät. In einer playwright.config.ts lassen sich mehrere Profile als projects definieren, sodass dieselbe Testsuite automatisch gegen mehrere Viewport-Klassen läuft, iPhone, Pixel, iPad und Desktop-Chrome parallel, ohne die Testlogik zu duplizieren. Das ist der Kern einer effizienten Emulation-Matrix für schnelles CI-Feedback.


{
  "iPhone 14 Pro": {
    "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",
    "viewport": { "width": 393, "height": 852 },
    "deviceScaleFactor": 3,
    "isMobile": true,
    "hasTouch": true,
    "defaultBrowserType": "webkit"
  }
}

4. Netzwerk-Emulation: Chrome DevTools Protocol Throttling

Netzwerk-Emulation setzt beim Chrome DevTools Protocol an: Network.emulateNetworkConditions erlaubt, Latenz in Millisekunden sowie Download- und Upload-Durchsatz in Bytes pro Sekunde fest vorzugeben, etwa ein "Slow 3G"-Profil mit 400 Kilobit pro Sekunde und 150 Millisekunden Latenz. Playwright greift über eine direkte CDP-Session (context.newCDPSession(page)) auf diesen Befehl zu, Cypress simuliert Verzögerung deklarativ über res.setDelay() innerhalb eines cy.intercept-Handlers.

Der entscheidende Unterschied zu einem echten Mobilfunknetz: Diese Emulation ist vollständig deterministisch. Jede Anfrage bekommt exakt dieselbe Latenz, ohne Jitter, ohne Paketverlust, ohne die Signalschwankungen eines Funkzellenwechsels während einer Zugfahrt. Für das Testen von Ladeindikatoren, Timeout-Handling und Skeleton-Screens ist diese kontrollierte Umgebung sogar von Vorteil, weil Tests reproduzierbar bleiben. Für die Beurteilung, wie sich eine App unter realer Netzwerkvarianz tatsächlich anfühlt, ist sie aber blind.


// Playwright: attach a raw CDP session to throttle network like a real 3G connection
const client = await context.newCDPSession(page);
await client.send('Network.emulateNetworkConditions', {
  offline: false,
  latency: 150,                       // ms round-trip time, fixed and deterministic
  downloadThroughput: (400 * 1024) / 8,
  uploadThroughput: (400 * 1024) / 8,
});

await page.goto('/checkout');

// Cypress: delay and throttle via cy.intercept, not a real network stack
cy.intercept('GET', '/api/cart', (req) => {
  req.reply((res) => {
    res.setDelay(150); // simulated latency only, no jitter or packet loss
  });
});

5. Die Grenzen der Emulation: GPU, CPU und echte Rechenleistung

Ein emuliertes Mittelklasse-Smartphone läuft trotz identischem Viewport und User-Agent weiterhin auf der Hardware des Test-Runners, in der Praxis meist eine leistungsstarke Cloud-VM mit mehreren vCPU-Kernen und einer virtualisierten oder gar keiner echten GPU. JavaScript-Ausführungszeit, Layout-Reflow-Kosten und die Geschwindigkeit von CSS-Animationen unterscheiden sich dadurch fundamental von einem tatsächlichen Gerät mit ARM-Prozessor, begrenztem Arbeitsspeicher und thermischem Throttling nach wenigen Minuten Dauerlast.

Chrome DevTools bieten zwar eine CPU-Throttling-Option, die die Ausführung künstlich um einen festen Faktor verlangsamt, etwa das Vierfache, doch das ist eine lineare Verlangsamung, kein realistisches Abbild der tatsächlichen Prozessorarchitektur, des Cache-Verhaltens oder der GPU-Treiber eines echten Geräts. Performance-Messungen wie Time to Interactive oder Interaction to Next Paint, die auf einem emulierten Profil gut aussehen, fallen auf echter Hardware regelmäßig deutlich schlechter aus, gerade bei JavaScript-lastigen Checkout-Flows oder umfangreichen Produktfiltern.

6. OS-Level Browser-Engine-Quirks: Safari iOS und WebKit

Ein User-Agent-String, der Safari vortäuscht, ändert nichts an der tatsächlich verwendeten Rendering-Engine. Playwrights WebKit-Build ist eine Desktop-Annäherung an Safari und kommt echtem Safari-Verhalten näher als eine reine Chromium-Emulation, bleibt aber dennoch nicht identisch mit der Mobile-Safari-Engine, die auf einem echten iPhone unter iOS läuft. Das gilt umso mehr für Firefox oder ältere Android-System-WebViews, für die es in Playwright oder Cypress überhaupt keine native Engine gibt.

Konkrete Beispiele für Abweichungen: Das elastische Overscroll-Verhalten am Seitenende, die Berechnung von 100vh in Gegenwart der dynamischen Safari-Adressleiste, das Rendering nativer Formularelemente wie select-Dropdowns und date-Inputs sowie das Verhalten der visualViewport-API bei eingeblendeter virtueller Tastatur unterscheiden sich zwischen echtem iOS Safari und jeder Desktop-Emulation spürbar. Gerade bei Checkout-Formularen mit Adress- und Zahlungsfeldern sind das keine kosmetischen Details, sondern Ursache für reale Conversion-Verluste, die in der Emulation unsichtbar bleiben.

7. Echtes Touch- und Hardware-Verhalten

Emulierte Touch-Events werden über das CDP synthetisch als touchstart, touchmove und touchend beziehungsweise als Pointer-Events mit pointerType: 'touch' ausgelöst. Das reicht, um zu prüfen, ob ein Touch-Handler im Code überhaupt registriert ist und reagiert, bildet aber nicht die physische Realität eines Fingers auf einem kapazitiven Display ab: Druckempfindlichkeit, Kontaktfläche, Multi-Touch-Gesten wie Pinch-to-Zoom mit zwei Fingern und das Zusammenspiel von Hover- und Touch-Zuständen bleiben in der Emulation vereinfacht oder fehlen ganz.

Besonders das Hover-Problem ist in der Praxis relevant: Auf einem Desktop-Browser mit emuliertem Touch-Flag bleibt der Mauszeiger trotzdem verfügbar, wodurch :hover-Zustände anders ausgelöst werden als auf einem echten Touchscreen ohne Maus. Zusätzlich lassen sich hardwarenahe APIs wie DeviceOrientation, echte GPS-Koordinaten, Kamera-Zugriff für Produktvisualisierung per Augmented Reality oder biometrische Authentifizierung in der Emulation nur grob mocken, nicht mit dem tatsächlichen Verhalten eines physischen Sensors nachbilden.

8. Wann Emulation für schnelle CI-Feedback-Loops ausreicht

Für den überwiegenden Teil funktionaler End-to-End-Tests, etwa Warenkorb-Logik, Formularvalidierung, responsive Navigation oder das korrekte Umschalten zwischen Mobile- und Desktop-Layout, ist Emulation nicht nur ausreichend, sondern die richtige Wahl. Sie liefert reproduzierbare Ergebnisse in Sekunden, lässt sich beliebig parallelisieren und erzeugt keine Abhängigkeit von externer Cloud-Infrastruktur oder deren Verfügbarkeit und Kosten. Eine Playwright-Projektmatrix mit vier bis sechs Geräteprofilen, die bei jedem Pull Request läuft, deckt die meisten Layout-Regressionen zuverlässig ab.

Die Empfehlung für die Praxis: Emulation als schnelle erste Verteidigungslinie bei jedem Commit, mit einem überschaubaren, bewusst kuratierten Set an Viewport- und Engine-Kombinationen, die die wichtigsten Zielgruppen-Geräte grob abdecken. Sobald Tests fehlschlagen oder ein Feature besonders hardware- oder engine-sensitiv ist, etwa eine Produktgalerie mit Swipe-Gesten oder ein AR-Try-on, lohnt sich die gezielte Ergänzung durch echte Geräte, statt die komplette Suite unnötig zu verlangsamen.


name: e2e-emulated
on: [pull_request]
jobs:
  playwright:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        project: [iphone-14, pixel-7, ipad-mini, desktop-chrome]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - run: npx playwright install --with-deps
      # Fast feedback: emulated devices only, no cloud dependency
      - run: npx playwright test --project=${{ matrix.project }}

9. Cloud-Testing mit echten Geräten: BrowserStack und Sauce Labs im Vergleich

BrowserStack und Sauce Labs betreiben Farmen aus physischen Smartphones und Tablets, auf die Testsuites über eine Cloud-API zugreifen. Der Testcode bleibt weitgehend identisch zu einem lokalen Playwright- oder Cypress-Setup, nur die Verbindung läuft über einen Remote-WebDriver- oder CDP-Endpunkt statt gegen einen lokalen Browser-Prozess. Das ermöglicht, exakt die Geräte zu testen, die laut Analytics-Daten den größten Traffic-Anteil ausmachen, inklusive spezifischer OS-Versionen und Hersteller-Anpassungen wie Samsungs One UI.

Der Preis dafür ist Geschwindigkeit und Kosten: Ein Testlauf gegen ein physisches Gerät in der Cloud dauert durch Warteschlangen, Geräte-Provisionierung und Netzwerklatenz zur Test-Session spürbar länger als ein lokal emulierter Lauf, und die Abrechnung erfolgt nach Parallelität und Nutzungsminuten. Sinnvoll eingesetzt wird das daher selten bei jedem Commit, sondern nächtlich, vor Releases oder gezielt zur Reproduktion eines konkreten, gemeldeten Gerätebugs, den Emulation nicht abbilden konnte.


name: e2e-real-devices
on:
  schedule:
    - cron: '0 3 * * *'  # nightly, not on every commit
jobs:
  browserstack:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      # Real device matrix, provisioned in BrowserStack's device farm
      - name: Run Playwright against BrowserStack Automate
        env:
          BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
          BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
        run: |
          npx browserstack-node-sdk playwright test --config=browserstack.yml
      # browserstack.yml selects real hardware, not emulated profiles:
      # platforms:
      #   - deviceName: iPhone 14
      #     osVersion: 17
      #     realMobile: true
      #   - deviceName: Samsung Galaxy S23
      #     osVersion: 13
      #     realMobile: true
Kriterium Emulation Echtes Gerät
Viewport Exakt, pixelgenau Exakt
User-Agent-String Frei konfigurierbar Authentisch
Touch Events Synthetisch, kein Multi-Touch Nativ
GPU/CPU-Durchsatz Läuft auf Host-Hardware Reale Geräte-Performance
Netzwerkbedingungen Deterministisches CDP-Profil Reale Mobilfunk-Varianz
OS-Rendering-Eigenheiten Nicht abbildbar (Chromium/WebKit-Build) Safari/WebKit exakt
Sensoren & Hardware-APIs Grob gemockt Echtes Verhalten
Kosten Niedrig, lokal/CI Hoch, Cloud-Abo
Geschwindigkeit Sekunden, parallelisierbar Langsamer, Geräte-Warteschlange

Die Tabelle macht deutlich, dass Emulation und echte Geräte keine Konkurrenten sind, sondern unterschiedliche Stufen derselben Teststrategie. Wer beide Ebenen bewusst kombiniert, bekommt schnelles Feedback bei jedem Commit und trotzdem verlässliche Aussagen über reales Nutzerverhalten vor jedem Release.

Mironsoft

E2E-Testautomatisierung mit Cypress und Playwright für Magento- und Hyvä-Shops

Testing-Strategie für Emulation und echte Geräte?

Wir bauen eure E2E-Test-Pipeline mit Cypress oder Playwright auf, kalibrieren die Emulation-Matrix für schnelles CI-Feedback und binden BrowserStack oder Sauce Labs für kritische Release-Checks auf echten Geräten ein.

Cypress/Playwright-Setup

Testsuite, CI-Integration und Geräteprofile von Grund auf einrichten

Emulation-Strategie

Sinnvolle Viewport- und Engine-Matrix für schnelles Pull-Request-Feedback

Cloud-Device-Pipeline

BrowserStack- oder Sauce-Labs-Anbindung für nächtliche Real-Device-Läufe

10. Zusammenfassung

Device-Emulation in Cypress und Playwright simuliert Viewport, User-Agent, Touch-Flag und Device Pixel Ratio zuverlässig und reicht für die meisten funktionalen End-to-End-Tests und responsive Layout-Prüfungen völlig aus. Was sie nicht abbilden kann, sind reale GPU- und CPU-Grenzen, die tatsächliche Varianz mobiler Netzwerke, engine-spezifische Rendering-Eigenheiten wie die von Mobile Safari auf iOS und das physische Verhalten von Touchscreens. Diese Lücken sind kein Argument gegen Emulation, sondern eine Leitplanke für ihren sinnvollen Einsatzbereich.

Die wirtschaftlich sinnvolle Strategie kombiniert beide Ansätze: Emulation als schnelle, kostenlose erste Verteidigungslinie bei jedem Pull Request, echte Geräte über BrowserStack oder Sauce Labs gezielt nächtlich, vor Releases oder zur Reproduktion konkreter Gerätebugs. Wer diese Aufteilung sauber zieht, bekommt sowohl schnelles CI-Feedback als auch belastbare Aussagen über echtes Nutzerverhalten, ohne für jeden Commit eine teure Cloud-Geräte-Warteschlange zu blockieren.

Device-Emulation vs. echte Geräte - Das Wichtigste auf einen Blick

Viewport & User-Agent

Über CDP präzise setzbar, deckt die meisten Layout- und Responsive-Tests zuverlässig ab.

Netzwerk-Emulation

Deterministisches CDP-Throttling, aber ohne Jitter und Paketverlust echter Mobilfunknetze.

Grenzen der Emulation

Keine echte GPU/CPU-Leistung, keine Mobile-Safari-Engine, keine physischen Touch-Gesten.

Wann echte Geräte zählen

Bei Gerätebugs, Release-Checks und gesten-lastigen Features über BrowserStack/Sauce Labs.

11. FAQ: Device-Emulation vs. echte Geräte

1Was ist der Unterschied zwischen Device-Emulation und einem echten Gerät?
Emulation ändert Viewport, User-Agent, Touch-Flag und DPR im Desktop-Browser. Ein echtes Gerät bringt zusätzlich echte Hardware, natives OS und die tatsächliche Rendering-Engine mit.
2Kann Emulation die Touch-Bedienung eines Smartphones wirklich testen?
Nur teilweise. Synthetische Touch-Events prüfen, ob Handler reagieren, aber Multi-Touch-Gesten und Druckempfindlichkeit bilden sie nicht realistisch ab.
3Warum reicht Emulation für die meisten CI-Pipelines aus?
Die meisten Regressionen betreffen Layout und Funktionslogik, nicht Hardware. Emulation liefert dafür reproduzierbare Ergebnisse in Sekunden.
4Was simuliert der Device Pixel Ratio (DPR) in der Emulation?
Das Verhältnis zwischen physischen und logischen Pixeln. Emulation setzt den Wert korrekt, bildet aber nicht die reale Pixeldichte-Wahrnehmung eines Displays nach.
5Wie emuliert man Netzwerkbedingungen in Playwright/Cypress?
Playwright über CDP mit Network.emulateNetworkConditions, Cypress via cy.intercept mit setDelay. Beide liefern ein festes, deterministisches Profil.
6Warum ist Safari iOS in der Emulation nicht testbar?
Playwrights WebKit-Build ist eine Desktop-Annäherung, nicht die echte Mobile-Safari-Engine. Overscroll, 100vh und Formularrendering weichen ab.
7Wann lohnt sich BrowserStack oder Sauce Labs trotz höherer Kosten?
Bei konkreten Gerätebugs, vor Major Releases oder bei gesten-lastigen Features. Für den täglichen CI-Lauf lohnt sich der Aufwand meist nicht.
8Beeinflusst Emulation die CPU/GPU-Performance-Messung?
Ja, erheblich. Emulierte Geräte laufen auf Runner-Hardware, meist deutlich stärker als reale Smartphones. Performance-Werte sehen dadurch besser aus als in der Realität.
9Wie kombiniert man Emulation und echte Geräte sinnvoll in einer Teststrategie?
Emulation bei jedem Pull Request, ein kuratiertes Set echter Geräte nächtlich oder vor Releases für Engine-Quirks und gerätespezifische Bugs.
10Was kostet Cloud-Testing mit echten Geräten im Vergleich zu Emulation?
Emulation ist praktisch kostenlos. Cloud-Geräte-Farmen berechnen nach Parallelität und Nutzungsminuten, oft mehrere hundert Euro pro Monat.