Zum Inhalt

Puppeteer vs. Selenium: Was ist besser für die Automatisierung?

Automatisierte Tests sind zu einem wesentlichen Bestandteil der modernen Webentwicklung geworden. Da Webanwendungen immer komplexer werden, ist es nicht mehr möglich, alle Funktionen manuell zu testen. Mit automatisierten Testtools können Entwickler Tests schreiben, die Benutzerinteraktionen simulieren und überprüfen, ob die Anwendung wie erwartet funktioniert.

Zwei der beliebtesten Tools für automatisierte Browsertests sind Puppeteer und Selenium. Beide können einen Browser starten, zu Webseiten navigieren, mit Elementen auf einer Seite interagieren und Aussagen über den Seiteninhalt treffen. Es gibt jedoch einige wesentliche Unterschiede, die jedes Tool für bestimmte Testszenarien besser geeignet machen.

In diesem umfassenden Leitfaden vergleichen wir Puppeteer und Selenium, um Ihnen dabei zu helfen, die richtige Wahl für Ihre Bedürfnisse zu finden.

Was ist Puppenspieler?

Puppenspieler ist eine vom Chrome-Team entwickelte Node-Bibliothek. Es bietet eine High-Level-API zur Steuerung von Headless Chrome über das DevTools-Protokoll.

Puppeteer läuft standardmäßig Headless, kann aber so konfiguriert werden, dass es vollständig (nicht Headless) Chrome oder Chromium ausführt.

Einige Hauptfunktionen von Puppeteer:

  • Erzeugt Screenshots und PDFs von Seiten
  • Crawlt eine Website, um Inhalte zu extrahieren
  • Automatisiert Formularübermittlung, UI-Tests und Tastatureingaben
  • Ermöglicht reaktionsfähige Tests durch Festlegen der Geräteemulation
  • Ermöglicht die Ausführung von Browser-JavaScript
  • API für Browserereignisse wie Navigation und Konsolenprotokolle
  • Unterstützt die Installation von Erweiterungen

Puppeteer unterstützt nur Chromium-basierte Browser wie Chrome und Microsoft Edge. Es funktioniert nicht mit Firefox oder Safari.

Was ist Selen?

Selenium ist eine Open-Source-Suite von Tools zur Automatisierung von Webbrowsern. Es gibt es schon länger als Puppeteer und es gibt Unterstützer von mehreren Browser-Anbietern.

Selenium unterstützt mehrere Sprachen, darunter Java, C#, Python, JavaScript und Ruby. Es kann Chrome, Firefox, Edge und Safari auf Desktop-Plattformen automatisieren. Selenium unterstützt auch mobile Browser für Android- und iOS-Tests.

Eigenschaften von Selen:

  • Cross-Browser-Kompatibilität
  • Mobile Testfunktionen
  • IDE für Aufnahme und Wiedergabe
  • Raster zum Verteilen von Tests auf mehrere Maschinen
  • Integrationen mit verschiedenen Testläufern wie JUnit, TestNG, Mocha
  • Große Benutzergemeinschaft aus allen Branchen

Im Gegensatz zu Puppeteer erlaubt Selenium nicht die Ausführung von Browser-JavaScript oder die direkte Arbeit mit DevTools.

Syntaxvergleich

Puppeteer verwendet eine prägnante API, die sich wie Pseudocode liest. Zum Beispiel:

// Navigate to a URL
await page.goto(‘https://www.example.com‘);

// Get an element 
const button = await page.$(‘#submit-button‘); 

// Click the button  
await button.click();

Selenium verwendet eine ausführlichere API:

// Launch browser
WebDriver driver = new ChromeDriver();

// Navigate to URL
driver.get("https://www.example.com");

// Find element
WebElement button = driver.findElement(By.id("submit-button"));

// Click element  
button.click(); 

Die API von Puppeteer fühlt sich benutzerfreundlicher und leichter lesbar an. Die Verwendung der Async/Await-Syntax reduziert die Verschachtelung von Rückrufen. Insgesamt benötigt Puppeteer weniger Boilerplate-Code als Selenium.

Browser starten

Um eine Browserinstanz zu starten, verwendet Puppeteer:

const browser = await puppeteer.launch();

Bei Selenium müssen Sie eine bestimmte Treiberklasse initialisieren:

// Launch Chrome  
WebDriver driver = new ChromeDriver();

// Launch Firefox
WebDriver driver = new FirefoxDriver(); 

Puppeteer startet nur Chromium, während Selenium mehrere Browser unterstützt. Für browserübergreifende Tests ist Selenium die bessere Wahl.

Lokalisieren von Elementen

Puppeteer findet Elemente mit:

// Get element by CSS selector
const el = await page.$(‘.className‘);

// Get element by XPath  
const el = await page.$x(‘//xpath‘); 

Selenium findet Elemente über WebDriver-Locators:

// Find by CSS
WebElement el = driver.findElement(By.cssSelector(".className"));

// Find by XPath
WebElement el = driver.findElement(By.xpath("//xpath"));

Beide Tools bieten eine breite Palette von Locator-Strategien wie ID, Klasse, Text und DOM-Hierarchie. Insgesamt ist die Elementauswahl in beiden Fällen unkompliziert.

Interaktion mit Elementen

Um mit Elementen auf einer Seite zu interagieren, verwendet Puppeteer:

// Type into an input  
await page.type(‘#input‘, ‘Hello world‘);

// Click a button
await button.click(); 

// Select an option
await page.select(‘#dropdown‘, ‘option2‘);

Der entsprechende Selenium-Code lautet:

// Type text  
driver.findElement(By.id("input")).sendKeys("Hello world");

// Click button
button.click();

// Select option
Select dropdown = new Select(driver.findElement(By.id("dropdown")));
dropdown.selectByVisibleText("option2");

Die API von Puppeteer fühlt sich kompakter und ausdrucksvoller an. Selenium erfordert für einige Interaktionen wie die Auswahl von Dropdowns zusätzliche Boilerplate.

Um zu Seiten zu navigieren, verwendet Puppeteer:

// Navigate to URL 
await page.goto(‘https://example.com‘);

// Click a link
await page.click(‘a.page2‘); 

// Go back
await page.goBack();

Und in Selen:

// Open URL
driver.get("https://example.com");

// Click link
driver.findElement(By.cssSelector("a.page2")).click();

// Go back  
driver.navigate().back();

Die Navigationsmethoden der beiden Tools sind sehr ähnlich. Puppeteer entfernt einen Teil der Ausführlichkeit rund um die verschachtelten Treiberbefehle von Selenium.

JavaScript ausführen

Ein großer Vorteil von Puppeteer ist die Möglichkeit, Browser-JavaScript direkt auszuführen:

// Set a cookie 
await page.evaluate(() => {
  document.cookie = "foo=bar"; 
});

// Get an element‘s text 
const text = await page.evaluate(el => el.textContent, element);

Selenium bietet keine Methoden zum direkten Ausführen von JavaScript. Sie müssen Umgehungstechniken wie das Einfügen von Skripten in Seiten verwenden.

Warten auf Elemente

Bei Web-Apps kann das dynamische Laden von Inhalten mit JavaScript einige Zeit in Anspruch nehmen. Automatisierte Tests müssen warten, bis Elemente bereit sind, bevor sie mit ihnen interagieren.

Mit Puppeteer können Sie Wartezeiten manuell schreiben:

// Wait for selector to be visible
await page.waitForSelector(‘.element‘); 

// Wait for navigation to complete
await page.waitForNavigation();

Selenium verfügt über integrierte explizite und implizite Wartezeiten:

// Implicit wait 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

// Explicit wait  
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".element")));

Konfigurierbare integrierte Wartezeiten erleichtern die Bewältigung von Zeitproblemen in Selenium. Puppeteer erfordert manuelle Skripterstellungswartezeiten.

Screenshots erstellen

Beide Tools können während des Tests Screenshots von Seiten erfassen.

Beispiel für einen Puppenspieler:

// Take a screenshot 
await page.screenshot({path: ‘page.png‘});

Beispiel für Selen:

// Capture screenshot
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

Die Screenshot-Funktionen sind sehr ähnlich. Die API von Puppeteer ist etwas einfacher.

PDF erstellen

Zusätzlich zu Screenshots kann Puppeteer PDFs von Seiten generieren:

// Generate PDF
await page.pdf({path: ‘page.pdf‘});

Diese Funktion ist nicht in Selenium integriert. Sie benötigen ein benutzerdefiniertes Dienstprogramm, um Seiten mit Selenium als PDF zu drucken.

Umgang mit Popups

Um Warnungen, Eingabeaufforderungen und Browser-Popups zu verarbeiten, stellt Puppeteer die Seiten bereit dialog Veranstaltung:

page.on(‘dialog‘, dialog => {
  console.log(dialog.message());
  dialog.accept(); 
});

Selenium verwendet die Alert-Schnittstelle, um mit Popups zu interagieren:

// Switch to alert
Alert alert = driver.switchTo().alert();  

// Get text
String text = alert.getText();

// Accept alert
alert.accept();

Beide Tools können JS-Popups während der Automatisierung verarbeiten. Die API von Selenium fühlt sich für die Arbeit mit Popups ausgefeilter an.

Paralleles Testen

Die parallele Ausführung von Tests kann die Testausführung erheblich beschleunigen.

Puppeteer unterstützt parallele Tests nicht direkt. Sie müssen die parallele Ausführung über einen separaten Testläufer orchestrieren.

Selenium Grid ermöglicht die parallele Verteilung von Tests auf mehrere Maschinen. Dies erleichtert die Skalierung von Selenium-Tests.

Browserprotokolle

Der Zugriff auf Browserprotokolle kann zum Debuggen von Tests und zum Überprüfen der Netzwerkaktivität nützlich sein.

Puppeteer ermöglicht die Erfassung der Browserkonsole und Netzwerkprotokolle:

// Listen for console logs
page.on(‘console‘, msg => {
  console.log(‘Page Log:‘, msg.text()); 
}); 

// Get network request logs
const requests = browser.on(‘request‘, request => {
  request.url(); // Log URLs
});

Selenium bietet keine Methoden für den direkten Zugriff auf Browserprotokolle. Sie müssten Problemumgehungen finden, um Konsolen- oder Netzwerkprotokolle zu erhalten.

Benutzer-Agent-Simulation

Es ist wichtig zu testen, wie eine Website auf verschiedene Geräte und Benutzeragenten reagiert.

Puppeteer macht es einfach, Benutzeragentenzeichenfolgen zu fälschen:

await page.setUserAgent(‘Custom User Agent‘);

Selenium erlaubt das direkte Festlegen von Benutzeragenten nicht. Dies würde die Konfiguration von Browserprofilen erfordern.

Leistungsaudits

Puppeteer integriert Tools zur Analyse der Seitenleistung:

// Audit performance 
const metrics = await page.audit({
  disableJavaScript: true // Test without JavaScript 
});

// Log metrics
metrics.totalByteWeight; // Total page weight

Für die Leistungsprüfung wäre die Einführung zusätzlicher Tools mit Selenium erforderlich. Puppeteer baut es direkt ein.

Preisvergleich

Einer der Hauptunterschiede zwischen Puppeteer und Selenium sind kommerzielle Nutzungsbeschränkungen.

Puppeteer ist Open Source und kann kostenlos verwendet werden. Sie können es ohne Einschränkungen kommerziell nutzen.

Selenium ist ebenfalls Open Source. Die offiziellen Selenium WebDriver-Binärdateien sind jedoch nur für die nichtkommerzielle Nutzung lizenziert. Für die kommerzielle Nutzung benötigen Sie eine Lizenz vom Selenium-Anbieter BrowserStack.

Dies kann Puppeteer für Teams attraktiv machen, die eine Automatisierungslösung ohne Lizenzkosten kommerziell nutzen möchten.

Headless-Tests

Headless-Testing bezieht sich auf die Ausführung eines Browsers ohne sichtbare Benutzeroberfläche. Es bietet eine einfache Umgebung zum Testen.

Puppeteer startet Chrome standardmäßig im Headless-Modus und eignet sich daher ideal für Headless-Tests.

Selenium kann mit folgenden Optionen auch so konfiguriert werden, dass es kopflos läuft:

chromeOptions.addArguments("--headless"); 

Daher ermöglichen beide Tools Headless-Tests, wobei Puppeteer es zum standardmäßigen Out-of-Box-Erlebnis macht.

Kontinuierliche Integration

Die CI/CD-Integration ist wichtig für die Automatisierung der Testausführung bei Codeänderungen.

Puppeteer allein bietet keine integrierten CI/CD-Funktionen. Sie müssen es mit CI-Tools wie Jenkins, CircleCI usw. verbinden.

Selenium bietet eine native Integration mit CI/CD-Pipelines über Selenium-Grid. Dies ermöglicht eine einfache Verteilung von Tests auf der CI-Infrastruktur.

Mobiles Testen

Während sich beide Tools auf Webtests konzentrieren, bietet Selenium zusätzlich Unterstützung für mobile Tests.

Das Selenium Appium-Projekt ermöglicht die Automatisierung nativer mobiler Apps auf Android- und iOS-Plattformen. Puppeteer unterstützt das Testen mobiler Apps nicht.

Lernkurve

Für Entwickler, die mit JavaScript und Node.js vertraut sind, ist die Verwendung von Puppeteer sehr intuitiv. Das API-Design spiegelt weitgehend die DOM-API-Konzepte wider.

Selenium hat eine steilere Lernkurve, da Sie die Selenium-spezifische WebDriver-API erlernen müssen. Aber Java-Erfahrung hilft dabei, schneller voranzukommen.

Insgesamt ist Puppeteer einfacher und für diejenigen mit Webentwicklungshintergrund leichter zu erlernen.

Debugging-Funktionen

Die Fehlerbehebung bei fehlgeschlagenen Tests ist ein wichtiger Bestandteil der Testautomatisierung.

Puppeteer ermöglicht das Setzen von Haltepunkten und das Debuggen direkt in Chrome DevTools für ein einfaches Debuggen:

await page.pause(); // Pause execution

Selenium verfügt nicht über ein integriertes Debugging. Sie müssen sich auf Protokollanweisungen oder externe Debugging-Tools verlassen.

Browser-Unterstützung

Die Haupteinschränkung von Puppeteer besteht darin, dass es nur Chromium-basierte Browser unterstützt. Sie können es also nicht zum Testen in Firefox oder Safari verwenden.

Selenium unterstützt Chrome, Firefox, Edge und Safari und ermöglicht echte browserübergreifende Tests. Wenn die Testabdeckung über alle Browser hinweg Priorität hat, ist Selenium wahrscheinlich die bessere Wahl.

Open-Source-Community

Selenium gibt es schon seit über einem Jahrzehnt und es hat eine große Community hinter sich. Es gibt Konferenzen, Benutzergruppen und ein aktives Frage-und-Antwort-Forum, das Selenium gewidmet ist.

Als neueres Projekt hat Puppeteer eine viel kleinere Community. Aber seine Entwicklerergonomie und die von Google vorangetriebene Dynamik könnten es ihm ermöglichen, im Laufe der Zeit aufzuholen.

Sollten Sie Puppenspieler oder Selen verwenden?

Nachdem wir nun die beiden Tools verglichen haben, wie entscheiden Sie, ob Sie Puppeteer oder Selenium verwenden?

Hier sind einige wichtige Faktoren, die Sie berücksichtigen sollten:

  • Browser-Unterstützung – Wenn Sie Tests mit mehreren Browsern benötigen, ist Selenium die beste Option. Für reine Chrome-Tests ist Puppeteer eine gute Wahl.

  • Mobiles Testen – Selenium unterstützt mobile Web- und native App-Tests. Puppeteer ist nur für den Desktop verfügbar.

  • Fehlerbeseitigung – Die integrierte DevTools-Integration von Puppeteer erleichtert das Debuggen.

  • Plattformübergreifende – Für die Java- und C#-Testautomatisierung bietet Selenium eine bessere Unterstützung. Puppeteer ist JS/Node-fokussiert.

  • Anwendungstyp – Puppeteer eignet sich gut zum Testen von SPAs und kleineren Web-Apps. Selenium lässt sich besser für größere Unternehmensanwendungen mit umfangreichen Backend-Integrationen skalieren.

  • Kommerzielle Nutzung – Teams, die Automatisierung ohne Lizenzbeschränkungen kommerziell nutzen möchten, können von Puppeteer profitieren.

  • Programmierkomfort – Für Tester mit DevOps- und JavaScript-Hintergrund kann Puppeteer eine geringere Lernkurve haben. Java-Benutzer können Selenium schneller nutzen.

  • Legacy-Investition – Wenn Sie bereits über eine beträchtliche Anzahl von Selenium-Tests verfügen, ist es wahrscheinlich sinnvoll, diese weiter zu verbessern, anstatt mit Puppeteer ganz von vorne zu beginnen.

Für viele Testautomatisierungsanforderungen können beide Tools ihre Aufgabe erfüllen. Jedes verfügt über einzigartige Stärken, die es für bestimmte Anwendungsfälle geeignet machen. Wir hoffen, dass dieser detaillierte Vergleich Klarheit darüber verschafft, ob Puppeteer oder Selenium die richtige Wahl für Ihre Bedürfnisse ist.

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *