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

Headless Browser in C#: Setup und Codebeispiele

Georgi Miloradowitsch
Forscher, Texter und Usecase-Interviewer
Inhaltsverzeichnis

Mit Headless-Browsern können Sie Webaufgaben ohne grafische Benutzeroberfläche automatisieren. In C# werden sie häufig zum Testen, Web Scraping und Content Management verwendet. Zwei beliebte Tools sind PuppenspielerSharp (optimiert für Chrome/Chromium) und Selenium WebDriver (unterstützt mehrere Browser). Hier ein Vergleich:

Merkmal PuppenspielerSharp Selenium WebDriver
Browser-Unterstützung Chrom / Chrom Chrome, Firefox, Edge usw.
Komplexität des Setups Einfach (automatischer Chromium-Download) Erfordert separate Treiberinstallation
Kennzahlen Schneller für Chrome/Chromium Browserübergreifend konsistent
API-Design Modernes, versprechensbasiertes Traditionell, objektorientiert
Memory Usage Senken Variiert je nach Browser

Hauptvorteile von Headless-Browsern:

  • Geschwindigkeit: Schnelleres Testen ohne GUI-Rendering.
  • Effizienz: Verbraucht weniger Speicher und CPU.
  • Automation: Bewältigt Aufgaben wie Datenscraping, Tests und Formularübermittlungen.

Zur schnellen Einrichtung:

  1. Installieren Sie das .NET-SDK und erforderliche Pakete (PuppeteerSharp or Selenium.WebDriver).
  2. Verwenden Sie PuppeteerSharp für Chrome-spezifische Automatisierung oder Selenium für browserübergreifende Unterstützung.
  3. Schreiben Sie C#-Skripte, um mit Webseiten zu interagieren, Daten zu extrahieren oder automatisierte Tests durchzuführen.

Beide Tools sind leistungsstark. PuppeteerSharp ist ideal für Chrome-zentrierte Aufgaben, während Selenium in browserübergreifenden Szenarien brilliert. Wählen Sie basierend auf den Anforderungen Ihres Projekts.

Selenium Headless Browser Testing in C# mit PhantomJS

PhantomJS

Setup-Anforderungen

Das Einrichten eines Headless-Browsers in C# erfordert bestimmte Tools und Konfigurationen. Hier finden Sie eine Aufschlüsselung der erforderlichen Software und einen Vergleich von PuppeteerSharp und Selenium WebDriver.

Erforderliche Softwareinstallation

Für den Anfang benötigen Sie Folgendes:

  • .NET-SDK: Installieren Sie es mit einer der folgenden Methoden:
  • Angebote: Installieren Sie die erforderlichen Pakete für Ihr Projekt:
Paket Installationsbefehl Sinn
PuppenspielerSharp dotnet add package PuppeteerSharp Automatisiert und steuert Chrome/Chromium
Selenium WebDriver dotnet add package Selenium.WebDriver --version 4.29.0 Ermöglicht die Automatisierung mehrerer Browser
Browsertreiber Laden Sie die erforderlichen Treiber für Ihren Browser herunter Stellt die Funktionalität von Selenium sicher

Sobald die Software bereit ist, wollen wir untersuchen, wie PuppeteerSharp und Selenium WebDriver im Vergleich abschneiden.

PuppenspielerSharp vs Selenium WebDriver

PuppenspielerSharp

Beide Tools eignen sich hervorragend für die Headless-Browserautomatisierung, dienen aber unterschiedlichen Zwecken. Hier ein kurzer Vergleich:

Merkmal PuppenspielerSharp Selenium WebDriver
Browser-Unterstützung Beschränkt auf Chrome/Chromium Funktioniert mit Chrome, Firefox, Edge usw.
Komplexität des Setups Unkompliziert – inklusive automatischem Chromium-Download Erfordert separate Treiberinstallation
Kennzahlen Optimiert für Chrome/Chromium Einheitlich in allen unterstützten Browsern
API-Design Modernes, versprechensbasiertes Traditionell, objektorientiert
Memory Usage Geringere Speichernutzung Variiert je nach Browser

Für C#-Entwickler ist PuppeteerSharp oft am schnellsten einzurichten. Seine automatische Chromium-Verwaltung und die benutzerfreundliche API machen es ideal für Projekte, die sich ausschließlich auf Chrome/Chromium konzentrieren. Andererseits ist Selenium WebDriver besser für Projekte geeignet, die eine Browser-übergreifende Kompatibilität erfordern, da es mehrere Browser durch Ereignisse auf Betriebssystemebene und dedizierte Treiber unterstützt.

Um Chromium für PuppeteerSharp herunterzuladen, verwenden Sie den folgenden Code:

await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);

Dieses Setup stattet Sie mit den Tools aus, die Sie für eine robuste Headless-Browserautomatisierung benötigen, unabhängig davon, ob Sie an Test-Frameworks, Web Scraping oder der Automatisierung von Workflows arbeiten.

Erste Schritte mit PuppeteerSharp

PuppeteerSharp bietet eine leistungsstarke API zur Steuerung von Chrome oder Chromium im Headless-Modus und ist damit eine solide Wahl für C#-Web-Automatisierungsaufgaben.

Erster Browserstart

Nachdem Sie PuppeteerSharp über NuGet installiert haben, können Sie den Browser wie folgt einrichten und starten:

// Ensure Chromium is downloaded using BrowserFetcher
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);

// Launch the browser in headless mode
var launchOptions = new LaunchOptions {
    Headless = true,
    Args = new[] { "--no-sandbox", "--disable-setuid-sandbox" }
};

using var browser = await Puppeteer.LaunchAsync(launchOptions);
using var page = await browser.NewPageAsync();

// Navigate to a webpage
await page.GoToAsync("https://example.com");

Nachdem Sie den Browser gestartet haben, können Sie mit der Interaktion mit Webseiten und dem Sammeln von Daten beginnen.

Seitenaktionen und Datenerfassung

Mit PuppeteerSharp können Sie verschiedene Aktionen auf Webseiten ausführen und Informationen extrahieren:

// Enter text into an input field
await page.TypeAsync("#search-input", "search term");

// Click a button
await page.ClickAsync("#submit-button");

// Get text content from an element
var content = await page.EvaluateExpressionAsync<string>("document.querySelector('.content').textContent");

// Capture a screenshot
await page.ScreenshotAsync("page-capture.png");

Für eine bessere Scraping-Leistung sollten Sie die folgenden Techniken in Betracht ziehen:

Technik Wie umsetzen? Das bringt das Programm
Abfangen von Anfragen Blockieren Sie unnötige Ressourcen Reduziert die Ladezeit
Zwischenspeichern von Assets Verwenden eines benutzerdefinierten Benutzerdatenverzeichnisses Beschleunigt wiederholte Besuche
Rate Limiting Fügen Sie Verzögerungen zwischen Anfragen hinzu Reduziert die Serverbelastung

Arbeiten mit dynamischen Inhalten

Statischer Inhalt ist unkompliziert, dynamischer Inhalt erfordert jedoch häufig zusätzliche Schritte, z. B. das Warten auf das Laden von Elementen oder die Verarbeitung von in JavaScript gerenderten Daten:

// Wait for a specific element to appear
await page.WaitForSelectorAsync(".dynamic-content");

// Wait for navigation to complete with network idle
await page.WaitForNavigationAsync(new NavigationOptions {
    WaitUntil = new[] { WaitUntilNavigation.NetworkIdle0 }
});

// Extract text from dynamically loaded content
var dynamicContent = await page.EvaluateFunctionAsync<string>(@"() => {
    return document.querySelector('.js-content').innerText;
}");

Für komplexere Interaktionen, etwa beim Arbeiten mit Anwendungen wie Bing Maps, können Sie Aktionen verketten, um erweiterte, mit JavaScript gerenderte Inhalte zu verarbeiten.

Vergessen Sie nicht, Fehler zu behandeln und Timeouts festzulegen, um unerwartete Probleme zu vermeiden:

try {
    await page.WaitForSelectorAsync(".dynamic-element", new WaitForSelectorOptions {
        Timeout = 5000
    });
} catch (WaitTaskTimeoutException) {
    Console.WriteLine("Element did not appear within 5 seconds");
}

Stellen Sie abschließend sicher, dass Sie die Ressourcen ordnungsgemäß bereinigen:

await page.CloseAsync();
await browser.CloseAsync();

Dieser Ansatz hält Ihre Automatisierung effizient und verhindert Speicherlecks.

sbb-itb-23997f1

Verwenden von Selenium WebDriver

Selenium WebDriver ist ein leistungsstarkes Tool zur Browserautomatisierung in C#. Im Gegensatz zu PuppeteerSharp, das sich auf Chrome konzentriert, unterstützt Selenium mehrere Browser und ist daher eine vielseitige Wahl für Tests.

Einrichten des Headless-Modus

Um Selenium WebDriver für den Headless-Modus zu konfigurieren, benötigen Sie browserspezifische Einstellungen. So richten Sie es für Chrome, Firefox und Edge ein:

// Chrome setup
var chromeOptions = new ChromeOptions();
chromeOptions.AddArgument("--headless=new");
var chromeDriver = new ChromeDriver(chromeOptions);

// Firefox setup
var firefoxOptions = new FirefoxOptions();
firefoxOptions.Headless = true;
var firefoxDriver = new FirefoxDriver(firefoxOptions);

// Edge setup
var edgeOptions = new EdgeOptions();
edgeOptions.Headless = true;
var edgeDriver = new EdgeDriver(edgeOptions);

Wenn Sie Browser im Headless-Modus ausführen, können Sie Aufgaben wie die Interaktion mit Seitenelementen ohne sichtbare Benutzeroberfläche ausführen.

„Durch die Abschaffung der Convenience-Methode (und ihre Entfernung in Selenium 4.10.0) haben Benutzer die volle Kontrolle darüber, welchen Headless-Modus sie verwenden möchten.“ – Diego Molina, Selenium

Erweiterte Seiteninteraktionen

Selenium WebDriver bewältigt mühelos detaillierte Webinteraktionen. Hier ist ein Beispiel für die Automatisierung gängiger Aufgaben:

// Initialize WebDriverWait for explicit waits
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

// Wait for an element to become visible and interact with it
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("dynamicElement")));
element.Click();

// Handle alerts
var alert = driver.SwitchTo().Alert();
alert.Accept();

// Work with frames
driver.SwitchTo().Frame("frameId");
var frameElement = driver.FindElement(By.CssSelector(".frame-content"));
driver.SwitchTo().DefaultContent();

Allgemeine Elementselektoren:

Selektortyp Bester Anwendungsfall Beispiel
ID Einzigartige Elemente By.Id("login-button")
CSS Komplexe Muster By.CssSelector(".nav > .item")
XPath Dynamischer Inhalt By.XPath("//div[contains(@class, 'dynamic')]")

Seitenexportoptionen

Selenium bietet mehrere Möglichkeiten, Seiteninhalte zu erfassen und zu exportieren. Hier sind einige Beispiele:

// Take a full page screenshot
var screenshot = ((ITakesScreenshot)driver).GetScreenshotAs(ScreenshotImageFormat.Png);
screenshot.SaveAsFile("page.png");

// PDF export
var printOptions = new PrintOptions()
{
    Orientation = PrintOrientation.Portrait,
    Scale = 1.0
};
driver.SavePrintPage(printOptions).SaveAsFile("page.pdf");

// Get page source
var htmlContent = driver.PageSource;
File.WriteAllText("page.html", htmlContent);

Für eine reibungslose Automatisierung sind Timing-Konfigurationen unerlässlich:

// Custom wait condition for page load
wait.Until(driver => ((IJavaScriptExecutor)driver)
    .ExecuteScript("return document.readyState").Equals("complete"));

// Wait for a specific element to be present before exporting
wait.Until(ExpectedConditions.ElementExists(By.CssSelector(".content-loaded")));

Stellen Sie abschließend sicher, dass die Ressourcen ordnungsgemäß bereinigt werden, wenn Sie fertig sind:

driver.Quit();
driver.Dispose();

Fehlerbehebung und Tipps

Geschwindigkeits- und Speicherverwaltung

Headless-Browser, wie sie in PuppeteerSharp verwendet werden, überspringen das Laden von CSS und sind dadurch schneller als herkömmliche Browser. Um diese Geschwindigkeit optimal zu nutzen und den Ressourcenverbrauch zu reduzieren, sollten Sie diese Optimierungen in Betracht ziehen:

var launchOptions = new LaunchOptions
{
    Headless = true,
    Args = new[]
    {
        "--disable-gpu",
        "--disable-dev-shm-usage",
        "--disable-setuid-sandbox",
        "--no-sandbox",
        "--window-size=1920,1080"
    }
};

// Set a custom cache directory
launchOptions.UserDataDir = "C:\\BrowserCache";

Sie können auch unnötige Ressourcen wie Bilder oder Stylesheets blockieren, um Speicherplatz zu sparen:

await page.SetRequestInterceptionAsync(true);
page.Request += async (sender, e) =>
{
    if (e.Request.ResourceType == ResourceType.Document)
        await e.Request.ContinueAsync();
    else
        await e.Request.AbortAsync();
};

Anleitung zur Fehlerbehebung

Eine Leistungsverbesserung ist großartig, aber für eine reibungslose Automatisierung ist es genauso wichtig, häufige Fehler zu beheben. Hier ist eine Kurzanleitung:

Fehlertyp Gemeinsame Ursache Die Lösung
Timeout-Ausnahmen Langsames Laden der Seite Verwende WebDriverWait mit längeren Timeouts
Element nicht gefunden Dynamischer Inhalt Verwenden Sie explizite Wartezeiten und genaue Selektoren
Nichtübereinstimmung der Treiberversion Veraltete Komponenten Halten Sie WebDriver- und Browserversionen auf dem gleichen Stand

Mit diesem Code können Sie beispielsweise langsam ladende Seiten verarbeiten:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(driver => ((IJavaScriptExecutor)driver)
    .ExecuteScript("return document.readyState").Equals("complete"));

„Der Headless-Modus kann sich manchmal anders verhalten, da Rendering-Aspekte nicht sichtbar sind.“ – ClimbingLion

Anmelde- und Sicherheitsschritte

Sobald die Fehler behoben sind, konzentrieren Sie sich auf eine sichere und zuverlässige Authentifizierung. Hier ist ein Beispiel für den sicheren Umgang mit Anmeldeinformationen:

// Use environment variables for credentials
var username = Environment.GetEnvironmentVariable("AUTH_USERNAME");
var password = Environment.GetEnvironmentVariable("AUTH_PASSWORD");

// Apply rate limiting
private static readonly SemaphoreSlim _rateLimiter = new(1, 1);
await _rateLimiter.WaitAsync();
try
{
    await page.TypeAsync("#username", username);
    await page.TypeAsync("#password", password);
    await Task.Delay(1000); // Respect rate limits
}
finally
{
    _rateLimiter.Release();
}

Wichtige Sicherheitspraktiken, die Sie befolgen sollten:

  • Verwenden Sie eine IP-basierte Ratenbegrenzung, um Missbrauch zu verhindern.
  • Speichern Sie vertrauliche Informationen wie Anmeldeinformationen in Umgebungsvariablen.
  • Stellen Sie eine ordnungsgemäße Sitzungsverwaltung sicher.
  • Führen Sie regelmäßige Sicherheitsüberprüfungen durch.

Implementieren Sie zur Behandlung von Authentifizierungsfehlern eine Wiederholungslogik wie die folgende:

try
{
    await page.WaitForSelectorAsync(".login-success", 
        new WaitForSelectorOptions { Timeout = 5000 });
}
catch (WaitTaskTimeoutException)
{
    // Log the failed attempt and retry
    await page.ReloadAsync();
}

Schlussfolgerung

Zusammenfassung

Die Headless-Browserautomatisierung in C# bietet leistungsstarke Optionen mit PuppenspielerSharp und Selenium WebDriver. Während PuppeteerSharp für seine Geschwindigkeit und Effizienz mit Chrome/Chromium bekannt ist, zeichnet sich Selenium durch seine plattformübergreifende Kompatibilität und Integrationen auf Unternehmensebene aus.

Hier ist eine kurze Aufschlüsselung:

  • PuppenspielerSharp: Ideal für die Chrome/Chromium-Automatisierung, wenn Geschwindigkeit und Ressourceneffizienz Priorität haben.
  • Selen: Am besten geeignet für Aufgaben, die Kompatibilität mit mehreren Browsern und umfassendere Sprachunterstützung erfordern.

„Puppeteer ist die bessere Wahl, wenn Geschwindigkeit und feinkörnige Browsersteuerung wichtig sind. Selenium unterstützt mehr Sprachen und ist besser geeignet, wenn Sie Ihre Scraping-Aufgaben über mehrere Browser hinweg ausführen müssen.“ – ZenRows

Wenn Sie die Stärken dieser Tools kennen, können Sie das richtige für Ihre spezifischen Anforderungen und Projekte auswählen.

Weiteres Lernen

Wenn Sie Ihr Wissen über Headless-Browser in C# erweitern möchten, können diese Ressourcen hilfreich sein:

  • TRETEN SIE DEM #puppenspieler-scharf Slack-Kanal für Unterstützung in Echtzeit.
  • Entdecken Sie auch das PuppeteerSharp.Beitrag Bibliothek für zusätzliche Funktionen.
  • Tauchen Sie ein in die offizielle API-Dokumentation um sich mit der gesamten Bandbreite an Möglichkeiten vertraut zu machen.

Zu den praktischen Anwendungsgebieten dieser Werkzeuge gehören:

  • Testen in CI/CD-Pipelines.
  • Scraping dynamischer Webinhalte.
  • Überwachung der Website-Leistung.
  • Durchführen von UI-Tests in verschiedenen Browsern.

Die Headless-Browser-Landschaft entwickelt sich ständig weiter. Bleiben Sie auf dem Laufenden, indem Sie sich an GitHub-Projekten und Entwicklerforen beteiligen, um neue Updates und aufkommende Best Practices optimal zu nutzen.

Ähnliche Blog-Beiträge

Verwandte Blogs

Anwendungsfall

Unterstützt von