Eine Low-Code-Plattform, die die Einfachheit von No-Code mit der Leistung von Full-Code verbindet 🚀
Jetzt kostenlos starten
3. März 2025
9
min lesen

Java Headless Browser: Eine vollständige Anleitung

Georgi Miloradowitsch
Forscher, Texter und Usecase-Interviewer
Inhaltsverzeichnis

Die zentralen Thesen:

  • Was ist ein Headless-Browser? Ein Browser, der Webinhalte programmgesteuert ohne visuelle Schnittstelle verarbeitet.
  • Vorteile für Java-Projekte:
    • Geschwindigkeit: Läuft 2–15x schneller durch Überspringen der visuellen Darstellung.
    • Effizienz: Verwendet weniger Speicher und CPU, ideal für parallele Tests.
    • Automation: Ideal für Aufgaben wie Testen, Scraping und Leistungsüberwachung.
  • Beliebte Tools: Selenium WebDriver und HtmlEinheit werden häufig für die Java-Automatisierung verwendet.

Schneller Vergleich: Headless- und normale Browser

Merkmal Kopfloser Modus Normal Modus
Ausführungsgeschwindigkeit Schneller (2–15x) Standard
Memory Usage Senken Höher
Visuelles Debuggen Nicht verfügbar Verfügbare
CI/CD-Integration Gut geeignet Weniger flexibel

In diesem Handbuch erfahren Sie, wie Sie Java-Headless-Browser einrichten, Tools wie Selenium und HtmlUnit konfigurieren und Automatisierungs-Workflows für Geschwindigkeit und Zuverlässigkeit optimieren.

Headless-Browser-Tests in Selenium WebDriver mit Java

Selenium WebDriver

Erste Schritte mit Java Headless-Browsern

So können Sie mit den richtigen Tools und Konfigurationen einen Java-Headless-Browser einrichten.

Erforderliche Software

Für den Anfang benötigen Sie Folgendes:

  • Java-Entwicklungskit (JDK): Installieren Sie die neueste stabile Version und stellen Sie sicher, dass die Umgebungsvariablen richtig eingerichtet sind.
  • Selenium WebDriver: Laden Sie Version 4.6.0 oder höher von der offiziellen Selenium-Website herunter.
  • Browsertreiber: Laden Sie für Chrome den ChromeDriver herunter, der der Version Ihres Browsers entspricht. Legen Sie den Treiber für einfachen Zugriff in einem dedizierten Verzeichnis ab.

Sobald Sie diese haben, integrieren Sie sie in Ihr Projekt mit Maven or Gradle.

Einrichten Maven/Gradle

Maven

Wenn Sie Maven verwenden, erstellen Sie ein neues Projekt und schließen Sie die folgenden Abhängigkeiten in Ihr pom.xml Datei:

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>4.10.0</version>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.6.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Sie müssen in Ihrem Code auch die Systemeigenschaft für den ChromeDriver festlegen:

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

Dadurch wird sichergestellt, dass Selenium den ChromeDriver beim Ausführen von Tests finden kann.

Warum Headless-Browser verwenden?

Headless-Browser eignen sich perfekt für automatisierte Tests und Web Scraping. Zum Beispiel: Optimizely konnten ihre Testzeit drastisch verkürzen - von 8 Stunden auf nur 1 Stunde - durch parallele Tests mit Tools wie BrowserStack Automate.

„Selenium automatisiert Browser. Das ist alles!“ - Selenium

"HtmlUnit ist ein ‚GUI-loser Browser für Java-Programme‘. Er modelliert HTML-Dokumente und bietet eine API, mit der Sie Seiten aufrufen, Formulare ausfüllen, Links anklicken usw. können, genau wie in Ihrem ‚normalen‘ Browser." - HtmlUnit

Selenium WebDriver-Setup-Handbuch

Das Einrichten von Selenium WebDriver im Headless-Modus kann die Testleistung erheblich verbessern. Der in Version 59 eingeführte Headless-Modus von Chrome ermöglicht automatisiertes Testen ohne grafische Benutzeroberfläche und ist dadurch schneller und effizienter.

Chrome für den Headless-Modus konfigurieren

Um den Headless-Modus in Chrome zu aktivieren, verwenden Sie den ChromeOptions Klasse. Nachfolgend finden Sie zwei Möglichkeiten zur Einrichtung:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
WebDriver driver = new ChromeDriver(options);

Oder alternativ:

ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
WebDriver driver = new ChromeDriver(options);

Wichtige Unterschiede: Headless-Browser vs. normale Browser

Sobald Ihr Headless-Browser bereit ist, können Sie mit der Automatisierung von Aufgaben beginnen. Hier ist ein kurzer Vergleich zwischen Headless- und normalen Browsern:

Merkmal Kopfloser Modus Normal Modus
Ausführungsgeschwindigkeit 2–15x schneller Standard
Memory Usage Senken Höher
Ressourcenverbrauch Senken Höher
Visuelles Debuggen Nicht verfügbar Verfügbare
CI/CD-Integration Gut geeignet Weniger flexibel

Dieser Vergleich verdeutlicht, warum Headless-Browser ideal für Automatisierungs-Workflows sind, insbesondere in CI/CD-Pipelines.

Tipps für effektives Headless-Testing

Beachten Sie beim Arbeiten mit Headless-Browsern die folgenden Tipps:

  • Stellen Sie die richtigen Fensterabmessungen ein und verwenden Sie explizite Wartezeiten, um sicherzustellen, dass die Elemente richtig geladen werden und AJAX-Aufrufe effektiv verarbeitet werden.
  • Verwenden Sie Screenshots zur Validierung, da visuelles Debuggen keine Option ist.
  • Beachten Sie, dass im Headless-Modus möglicherweise visuelle Probleme nicht erkannt werden.

"Obwohl PhantomJs selbst kein Testframework ist, ist es ein wirklich guter Kanarienvogel in einer Kohlemine, der Ihnen ein gewisses Maß an Vertrauen gibt. Wenn Ihre Tests erfolgreich sind, können Sie ein hohes Maß an Vertrauen haben, dass Ihr Code in Ordnung ist." - Rob Friesel, Autor von PhantomJS-Kochbuch

Kernbefehle für die Automatisierung

Hier sind einige wichtige Befehle für den Einstieg in die Selenium-Automatisierung:

// Navigate to a URL
driver.get("https://your-website.com");

// Locate and interact with elements
WebElement element = driver.findElement(By.id("elementId"));
element.sendKeys("test input");

// Capture a screenshot
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("./screenshot.png"));

Für stabile Tests maximieren Sie das Browserfenster nach dem Laden der Seite und stellen die Zoomstufe auf 100 % ein. Dadurch wird eine konsistente Elementplatzierung sichergestellt und die Testzuverlässigkeit verbessert.

sbb-itb-23997f1

HtmlEinheit Implementierungshandbuch

HtmlEinheit

HtmlUnit ist ein leichtgewichtiges Tool für Java-Automatisierungsaufgaben, bei denen keine visuelle Darstellung erforderlich ist. Es ist eine solide Option zur Optimierung von Prozessen, die keine vollständige Browseroberfläche erfordern.

HtmlUnit-Funktionen

HtmlUnit bringt eine Reihe von Funktionen mit und ist daher eine praktische Wahl für die Headless-Automatisierung:

Feature-Kategorie Unser
Protokollunterstützung Verarbeitet HTTP, HTTPS und vollständiges SSL
Authentifizierung Unterstützt Basic- und NTLM-Authentifizierung
JavaScript Funktioniert mit erweiterten AJAX-Bibliotheken und Ereignisbehandlung
Bearbeitung von Anfragen Unterstützt Methoden wie POST, GET, HEAD und DELETE
Netzwerkoptionen Beinhaltet Proxyserver-Unterstützung und benutzerdefinierte Header-Einstellungen
Browser-Emulation Simuliert Browser wie Chrome, Firefox und Edge

Seine Headless-Natur beschleunigt die Testausführung und macht es ideal für kontinuierliche Integrationspipelines.

"HtmlUnit ist ein ‚GUI-loser Browser für Java-Programme‘. Er modelliert HTML-Dokumente und bietet eine API, mit der Sie Seiten aufrufen, Formulare ausfüllen, Links anklicken usw. können, genau wie in Ihrem ‚normalen‘ Browser." - HtmlUnit

Schritte zur Einrichtung des HtmlUnitDrivers

Der Einstieg in HtmlUnitDriver ist einfach:

  1. Abhängigkeiten hinzufügen Schließen Sie für Maven-Projekte die folgende Abhängigkeit ein:
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit3-driver</artifactId>
        <version>4.29.0</version>
    </dependency>
    
  2. Treiber konfigurieren und JavaScript aktivieren Hier ist ein Beispiel für die Einrichtung von HtmlUnitDriver mit JavaScript-Unterstützung:
    final HtmlUnitDriverOptions driverOptions = new HtmlUnitDriverOptions(BrowserVersion.FIREFOX);
    driverOptions.setCapability(HtmlUnitOption.optThrowExceptionOnScriptError, false);
    HtmlUnitDriver driver = new HtmlUnitDriver(driverOptions);
    

Dieses Setup ist schnell und effizient und damit eine intelligente Wahl für Tests, bei denen die Leistung und nicht die vollständige Browseremulation im Mittelpunkt steht.

Obwohl HtmlUnit nicht ideal zum Testen komplexer Frontend-Anwendungen mit viel JavaScript ist, glänzt es bei Aufgaben wie einfachem Web Scraping, API-Tests und automatisierten Formularübermittlungen. Die neueste Version (Version 4.10.0 vom 22. Februar 2025) verbessert die JavaScript-Verarbeitung und fügt weitere Funktionen hinzu, sodass HtmlUnit auch in modernen Automatisierungs-Workflows relevant bleibt.

Erweiterte Funktionen und Methoden

Mit erweiterten Tools und Techniken können Sie die Automatisierung Ihres Java-Headless-Browsers auf die nächste Ebene bringen und Test- und Scraping-Aufgaben effizienter und effektiver gestalten.

Screenshots machen

Das Aufnehmen von Screenshots ganzer Seiten ist ein häufiger Bedarf für das Debuggen oder die Dokumentation. Tools wie ein Schuss vereinfachen diesen Prozess und liefern qualitativ hochwertige Ergebnisse.

// Using Selenium WebDriver with aShot  
WebDriver driver = new ChromeDriver(options);  
Screenshot screenshot = new AShot()  
  .shootingStrategy(ShootingStrategies.viewportPasting(1000))  
  .takeScreenshot(driver);  
ImageIO.write(screenshot.getImage(), "PNG", new File("full-page-screenshot.png"));

Hier sind einige empfohlene Einstellungen, um Konsistenz sicherzustellen:

Parameter Empfohlener Wert Sinn
Bildschirmbreite 1920px Standard-Desktopauflösung
Bildschirmhöhe 1080px Gewährleistet eine konsistente Erfassung
Format des Bildes PNG Behält verlustfreie Qualität bei
DPI 96 Standard-Bildschirmdichte

Sobald die Screenshots eingerichtet sind, besteht der nächste Schritt darin, Sitzungen für reibungslosere automatisierte Arbeitsabläufe zu verwalten.

Verwalten von Anmeldesitzungen

Die Sitzungsverwaltung ist wichtig, um den Status bei automatisierten Interaktionen aufrechtzuerhalten, insbesondere in Szenarien, die eine Authentifizierung erfordern. Sie können Cookies speichern und wiederverwenden, um diesen Prozess zu optimieren:

// Save cookies after successful login  
Set<Cookie> cookies = driver.manage().getCookies();  
FileWriter writer = new FileWriter("cookies.json");  
new Gson().toJson(cookies, writer);  
writer.close();

// Load cookies for subsequent sessions  
FileReader reader = new FileReader("cookies.json");  
Cookie[] cookies = new Gson().fromJson(reader, Cookie[].class);  
for (Cookie cookie : cookies) {  
  driver.manage().addCookie(cookie);  
}

Bei Anwendungen mit Zwei-Faktor-Authentifizierung (2FA) kann die programmgesteuerte Generierung von Einmalkennwörtern (OTPs) den Vorgang vereinfachen:

// Generate OTP using secret key  
Authenticator authenticator = new Authenticator();  
String otp = authenticator.getTOTPCode(System.getenv("2FA_SECRET_KEY"));

Tipps für Geschwindigkeit und Effizienz

Um die Leistung zu verbessern und die Ausführungszeit zu verkürzen, sollten Sie die folgenden Strategien in Betracht ziehen:

  • Ressourcenmanagement: Deaktivieren Sie unnötige Funktionen, um Speicher zu sparen und die Ausführung zu beschleunigen.
ChromeOptions options = new ChromeOptions();  
options.addArguments("--disable-gpu");  
options.addArguments("--disable-dev-shm-usage");  
options.addArguments("--no-sandbox");
  • Umgang mit AJAX-Inhalten: Verwenden Sie explizite Wartezeiten, um sicherzustellen, dass dynamische Elemente vollständig geladen sind, bevor Sie mit ihnen interagieren.
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));  
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamic-content")));
  • Parallele Ausführung: Führen Sie Tests gleichzeitig aus, um Zeit zu sparen.
@Test(threadPoolSize = 3, invocationCount = 10)  
public void parallelTest() {  
  // Your test code here  
}

Für JavaScript-lastige Anwendungen, HtmlEinheit bietet eine schnellere Alternative zur vollständigen Browseremulation. Benchmarks zeigen, dass HtmlUnit bei grundlegenden Web Scraping-Aufgaben bis zu 60 % schneller Aufgaben verarbeiten kann als Headless Chrome.

Diese fortschrittlichen Methoden erweitern nicht nur Ihre Möglichkeiten, sondern helfen Ihnen auch, effizienter zu arbeiten.

Leitfaden zur Problemlösung

Häufige Probleme und Lösungen

So bewältigen Sie häufige Automatisierungsprobleme mit expliziten Wartezeiten und den richtigen Browsereinstellungen.

Probleme bei der Elementinteraktion

Begegnung ElementClickInterceptedException? Dies passiert häufig, wenn Elemente ausgeblendet oder nicht vollständig geladen sind. Beheben Sie es, indem Sie die Browseroptionen anpassen und explizite Wartezeiten verwenden:

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--window-size=1920,1200");
options.addArguments("--ignore-certificate-errors");

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(By.id("target-element")));

Dynamische Inhaltsverarbeitung

Erhöhen Sie bei JavaScript-lastigen Anwendungen die Wartezeiten, um AJAX-Antworten zu berücksichtigen. Insbesondere bei Single-Page-Anwendungen kann es beim ersten Rendern bis zu 30 Sekunden dauern, bis der gesamte Inhalt geladen ist.

Debugging-Strategien

Wenn Sie im Headless-Modus ohne visuelle Schnittstelle arbeiten, können Sie sich zum effektiven Debuggen auf diese Methoden verlassen:

  • Screenshot-Aufnahme: Benutzen driver.getScreenshotAs(OutputType.FILE) um den aktuellen Stand festzuhalten.
  • Seitenquellenanalyse: Rufen Sie die Seitenquelle ab mit driver.getPageSource().
  • Konsolenprotokollerfassung: Zugriff auf Browser-Konsolenprotokolle mit driver.manage().logs().get(LogType.BROWSER).

Integrieren Sie diese Debugging-Tools in Ihre CI/CD-Pipeline, um Ihren Testautomatisierungsprozess zu stärken.

Schritte zur CI/CD-Integration

Sobald Sie allgemeine Probleme gelöst haben, integrieren Sie Ihre Headless-Tests in einen CI/CD-Workflow für nahtlose Qualitätsprüfungen.

Umgebungskonfiguration

Richten Sie Ihre Testumgebung mit optimierten Chrome-Einstellungen ein:

ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));

Strategie zur Testausführung

Führen Sie parallele Tests durch, um die Effizienz zu verbessern:

@Test(threadPoolSize = 3, invocationCount = 10)
public void parallelTests() {
    ThreadLocal<WebDriver> driver = new ThreadLocal<>();
    driver.set(new ChromeDriver(options));
    try {
        // Test implementation
    } finally {
        driver.get().quit();
    }
}

Ressourcenmanagement

Verhindern Sie Speicherlecks, indem Sie nach jedem Test eine ordnungsgemäße Bereinigung sicherstellen:

@AfterMethod
public void cleanup() {
    if (driver != null) {
        driver.quit();
        driver = null;
    }
}

Fügen Sie zur besseren Fehlerbehebung detaillierte Protokollierung hinzu:

private static final Logger logger = LoggerFactory.getLogger(TestClass.class);

try {
    // Test execution
} catch (Exception e) {
    logger.error("Test failed: " + e.getMessage());
    File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(screenshot, new File("error-" + System.currentTimeMillis() + ".png"));
    throw e;
}

Diese Schritte helfen Ihnen beim Aufbau eines zuverlässigen und effizienten Frameworks für die Testautomatisierung.

Schlussfolgerung

Zusammenfassung

Headless-Browser haben das Java-Testen revolutioniert, indem sie die Infrastrukturkosten um 40 % gesenkt und die Testzeit von 3 Tagen auf nur 8 Stunden verkürzt haben. Ihre Kombination aus Geschwindigkeit, Effizienz und Zuverlässigkeit hat sie zu einem wichtigen Bestandteil moderner Entwicklungsabläufe gemacht.

Hier sind einige herausragende Vorteile:

  • Kennzahlen: Läuft 2–15× schneller als herkömmliche Browser.
  • Ressourceneffizienz: Verwendet weniger Speicher und CPU und ermöglicht parallele Tests.
  • CI/CD-Integration: Identifiziert 15 % mehr Fehler vor der Bereitstellung in der Produktion.

Wenn Sie Ihr Verständnis vertiefen möchten, sehen Sie sich die folgenden Ressourcen an.

Weitere Informationen

Erweitern Sie Ihr Wissen mit diesen hilfreichen Tools und Anleitungen:

Offizielle Dokumentation

  • Selenium WebDriver-Dokumentation – Schritt-für-Schritt-Anleitungen zur Browser-Automatisierung.
  • HtmlUnit-Benutzerhandbuch – Detaillierte API-Verwendung und Beispiele.
  • Chrome DevTools-Protokoll – Einblicke in die Headless-Funktionen von Chrome.

Erweiterte Tools und Bibliotheken

  • unentdeckter Chrome-Treiber – Hilft, die Bot-Erkennung zu umgehen.
  • Selen-Stealth – Ermöglicht anspruchsvolle Fingerabdruckmanipulation.
  • Webtreibermanager – Vereinfacht die Automatisierung der Treiberverwaltung.

Eine erwähnenswerte Erfolgsgeschichte ist die eines Fintech-Startups, das Puppeteer für die Automatisierung seiner Tests einsetzte. Ihre Ergebnisse? Eine Steigerung der Testabdeckung um 60 % und eine massive Verkürzung der Testzeit – von 3 Tagen auf nur 8 Stunden pro Release.

Sowohl Selenium WebDriver als auch HtmlUnit bieten zuverlässige und skalierbare Optionen für die Java-Automatisierung. Mit den nativen Headless-Modi, die jetzt in Chrome (seit Version 59) und Firefox (seit Version 56) verfügbar sind, war das Einrichten automatisierter Tests und Web Scraping noch nie so einfach.

Ähnliche Blog-Beiträge

Verwandte Blogs

Anwendungsfall

Unterstützt von