Häufig gestellte Fragen

Wie ist der Status der browserübergreifenden Unterstützung?

Der offizielle Firefox-Support befindet sich in der Testphase. Die fortlaufende Zusammenarbeit mit Mozilla zielt darauf ab, häufige End-to-End-Testanwendungsfälle zu unterstützen, für die Entwickler eine browserübergreifende Abdeckung erwarten. Das Puppeteer-Team benötigt Input von Nutzern, um die Firefox-Unterstützung zu stabilisieren und uns auf fehlende APIs aufmerksam zu machen.

Ab Puppeteer Version 2.1.0 können Sie puppeteer.launch({product: 'firefox'}) angeben, um Ihre Puppeteer-Skripts in Firefox Nightly ohne zusätzliche benutzerdefinierte
-Patches auszuführen. Für einen älteren Test war zwar eine Patchversion von Firefox erforderlich, die aktuelle Vorgehensweise funktioniert jedoch mit Standard-Firefox.

Wir arbeiten weiterhin mit anderen Browseranbietern zusammen, um die Puppeteer-Unterstützung für Browser wie Safari bereitzustellen. Dazu gehört die Erkundung eines Standards für die Ausführung browserübergreifender Befehle, anstatt sich auf das nicht standardmäßige DevTools-Protokoll von Chrome zu verlassen.

Was sind die Ziele und Prinzipien von Puppeteer?

Die Ziele des Projekts sind:

  • Stellen Sie eine schlanke, kanonische Bibliothek bereit, die die Funktionen des DevTools-Protokolls hervorhebt.
  • Stelle eine Referenzimplementierung für ähnliche Testbibliotheken bereit. Letztendlich könnte Puppeteer in diesen anderen Frameworks als Grundlage verwendet werden.
  • Steigern Sie den Einsatz von monitorlosen/automatisierten Browsertests.
  • Hilf dabei, neue Funktionen des DevTools-Protokolls als Dogfood zu testen, und erkenne Programmfehler.
  • Erfahren Sie mehr über die Probleme automatisierter Browsertests und helfen Sie dabei, diese Lücken zu schließen.

Wir passen die Chromium-Prinzipien an, um Produktentscheidungen zu treffen:

  • Geschwindigkeit: Puppeteer hat fast keinen Leistungsaufwand im Vergleich zu einer automatisierten Seite.
  • Sicherheit: Puppeteer arbeitet in Bezug auf Chromium außerhalb des Prozesses, sodass potenziell schädliche Seiten sicher automatisiert werden können.
  • Stabilität: Puppeteer sollte nicht instabil sein und keine Speicherlecks verursachen.
  • Einfachheit: Puppeteer bietet eine API auf übergeordneter Ebene, die leicht zu verwenden, zu verstehen und zu debuggen ist.

Ersetzt Puppeteer Selenium/WebDriver?

Nein. Beide Projekte sind aus sehr unterschiedlichen Gründen wertvoll:

  • Selenium/WebDriver konzentriert sich auf die browserübergreifende Automatisierung. Sein Wertversprechen ist eine einzelne Standard-API, die in allen gängigen Browsern funktioniert.
  • Puppeteer konzentriert sich auf Chromium; sein Wertversprechen bietet mehr Funktionen und höhere Zuverlässigkeit.

Allerdings können Sie Puppeteer verwenden, um Tests für Chromium auszuführen, zum Beispiel mit dem Community-gesteuerten Puppenspieler. Auch wenn dies nicht Ihre einzige Testlösung sein sollte, hat sie im Vergleich zu WebDriver einige gute Punkte:

  • Puppeteer erfordert keine Einrichtung und ist in der Chromium-Version enthalten, mit der es am besten funktioniert. Es ist besser, ein paar Tests durchzuführen, die nur Chromium ausführen, als überhaupt keine Tests.
  • Puppeteer hat eine ereignisgesteuerte Architektur, die viele potenzielle Schwachstellen beseitigt. Es gibt keine Notwendigkeit für böse „Schlaf(1000)“-Aufrufe in Puppenspiel-Skripten.
  • Puppeteer läuft standardmäßig monitorlos, wodurch es schnell ausgeführt werden kann. Puppeteer Version 1.5.0 stellt auch Browserkontexte bereit, wodurch die Testausführung effizient parallelisiert werden kann.
  • Puppeteer glänzt beim Debugging: Setzen Sie das "headless"-Bit auf "false", fügen Sie "slowMo" hinzu und Sie werden sehen, was der Browser tut. Sie können sogar die Chrome-Entwicklertools öffnen, um die Testumgebung zu prüfen.

Warum funktioniert Puppeteer v.XXX nicht mit Chromium v.YYY?

Wir betrachten Puppeteer als unteilbare Einheit mit Chromium. Jede Version von Puppeteer bündelt eine bestimmte Version von Chromium – die einzige Version, mit der sie garantiert funktioniert.

Dies ist keine künstliche Einschränkung. Bei Puppeteer wird tatsächlich viel im Chromium-Repository gearbeitet. Hier ist eine typische Story:

  1. Ein Puppeteer-Bug wird gemeldet
  2. Da dieses Problem mit dem Entwicklertools-Protokoll auftritt, beheben wir es in Chromium
  3. Sobald die Upstream-Bearbeitung abgeschlossen ist, führen wir das aktualisierte Chromium in Puppeteer ein.

Häufig ist es jedoch wünschenswert, Puppeteer mit der offiziellen Google Chrome-Version statt mit Chromium zu verwenden. Damit dies funktioniert, sollten Sie eine puppeteer-core-Version installieren, die der Chrome-Version entspricht.

Wenn Sie beispielsweise Chrome 101 mit Puppeteer-Core ausführen möchten, verwenden Sie das npm-Tag chrome-101:

npm install puppeteer-core@chrome-101

Welche Chromium-Version verwendet Puppeteer?

Suchen Sie mit einer der folgenden Methoden nach der Version:

  • Suchen Sie unter revisions.ts nach dem Eintrag chromium. Um das entsprechende Chromium-Commit und die Versionsnummer zu finden, suchen Sie im Abschnitt „Find Releases“ von OmahaProxy nach der Überarbeitung mit dem Präfix r.
  • Suchen Sie in versions.js nach der versionsPerRelease-Karte, die Zuordnungen zwischen den Chromium- und Puppeteer-Versionen enthält. Hinweis: Die Datei enthält nur Puppeteer-Versionen, bei denen Chromium aktualisiert wird. Es werden nicht alle Puppeteer-Versionen aufgeführt.

Welche Firefox-Version verwendet Puppeteer?

Da die Unterstützung von Firefox experimentell ist, lädt Puppeteer die aktuelle Version von Firefox Nightly herunter, wenn die Umgebungsvariable PUPPETEER_PRODUCT auf firefox gesetzt ist. Deshalb ist der Wert von firefox in revisions.ts latest, da Puppeteer nicht an eine bestimmte Firefox-Version gebunden ist.

So rufen Sie Firefox Nightly als Teil der Puppeteer-Installation ab:

PUPPETEER_PRODUCT=firefox npm i puppeteer
# or "yarn add puppeteer"

Was ist eine Navigation?

Aus Sicht von Puppeteer ist "Navigation" alles, was die URL einer Seite ändert. Neben der regulären Navigation, bei der der Browser auf das Netzwerk klickt, um ein neues Dokument vom Webserver abzurufen, umfasst dies Ankernavigationen und die Nutzung der History API.

Mit dieser Definition von "Navigation" funktioniert Puppeteer nahtlos mit Single-Page-Anwendungen.

Was ist der Unterschied zwischen einem vertrauenswürdigen und einem vertrauenswürdigen Eingabeereignis?

In Browsern lassen sich Eingabeereignisse in zwei große Gruppen unterteilen: vertrauenswürdige und nicht vertrauenswürdige.

  • Vertrauenswürdige Ereignisse: Ereignisse, die von Nutzern generiert werden, die mit der Seite interagieren, z. B. Verwendung der Maus oder Tastatur.
  • Nicht vertrauenswürdiges Ereignis: Ereignisse, die von Web APIs generiert werden, z. B. die Methoden document.createEvent oder element.click().

Websites können zwischen diesen beiden Gruppen unterscheiden:

  • mit einem Event.isTrusted-Ereignis-Flag
  • nach Begleitveranstaltungen schnüffeln. Beispielsweise gehen jedem vertrauenswürdigen 'click'-Ereignis 'mousedown'- und 'mouseup'-Ereignisse voraus.

Für die Automatisierung ist es wichtig, vertrauenswürdige Ereignisse zu generieren. Alle mit Puppeteer generierten Eingabeereignisse sind vertrauenswürdig und lösen ordnungsgemäße Begleitereignisse aus.

Wenn ein Nutzer aus irgendeinem Grund ein nicht vertrauenswürdiges Ereignis benötigt, ist es immer möglich, mit page.evaluate in einen Seitenkontext zu wechseln und ein falsches Ereignis zu generieren:

await page.evaluate(() => {
  document.querySelector('button[type=submit]').click();
});

Welche Funktionen unterstützt Puppeteer nicht?

Es kann vorkommen, dass sich Puppeteer bei der Steuerung von Seiten, die Audio und Video enthalten, nicht wie erwartet verhält. Das ist beispielsweise bei der Videowiedergabe und bei Screenshots wahrscheinlich nicht der Fall. Dafür gibt es zwei Gründe:

  • Puppeteer ist in Chromium (nicht Chrome) integriert. Standardmäßig übernimmt es also alle medienbezogenen Einschränkungen von Chromium. Dies bedeutet, dass Puppeteer keine lizenzierten Formate wie AAC oder H.264 unterstützt.
    • Sie können Puppeteer mit der Option executablePath für puppeteer.launch dazu zwingen, eine separat installierte Chrome-Version anstelle von Chromium zu verwenden. Sie sollten diese Konfiguration nur verwenden, wenn Sie eine offizielle Chrome-Version benötigen, die diese Medienformate unterstützt.
  • Da Puppeteer (in allen Konfigurationen) eine Desktopversion von Chromium oder Chrome steuert, werden Funktionen, die nur von der mobilen Version von Chrome unterstützt werden, nicht unterstützt. Dies bedeutet, dass Puppeteer kein HTTP Live Streaming (HLS) unterstützt.

Ich habe Probleme, Puppeteer in meiner Testumgebung zu installieren bzw. auszuführen. Wo kann ich nach Hilfe suchen?

In unserer Anleitung zur Fehlerbehebung für verschiedene Betriebssysteme sind die erforderlichen Abhängigkeiten aufgeführt.

Chromium wird bei jeder Ausführung von npm ci heruntergeladen. Wie kann ich den Download im Cache speichern?

Der Standard-Downloadpfad ist node_modules/puppeteer/.local-chromium. Sie können diesen Pfad jedoch mit der Umgebungsvariable PUPPETEER_DOWNLOAD_PATH ändern.

Puppeteer verwendet diese Variable, um den Speicherort der ausführbaren Chromium-Datei während des Starts aufzulösen, sodass Sie PUPPETEER_EXECUTABLE_PATH nicht angeben müssen.

So kannst du beispielsweise den Chromium-Download in ~/.npm/chromium belassen:

export PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium
npm ci

# by default the Chromium executable path is inferred
# from the download path
npm test

# a new run of npm ci will check for the existence of
# Chromium in ~/.npm/chromium
npm ci

Ich habe weitere Fragen! Wo kann ich Fragen stellen?

Es gibt viele Möglichkeiten, Hilfe zu Puppeteer zu erhalten:

Suche in diesen Kanälen, bevor du deine Frage postest.