Latenode

Headless Browser in C#: Einrichtung und Codebeispiele

Erfahren Sie, wie Sie Headless Browser in C# für Automatisierungsaufgaben einrichten und nutzen, einschließlich eines Vergleichs von PuppeteerSharp und Selenium WebDriver.

7 Min. Lesezeit
C#-Code zur Automatisierung eines Headless Browsers

Headless Browser ermöglichen die Automatisierung von Webaufgaben ohne grafische Benutzeroberfläche. In C# werden sie häufig für Tests, Web Scraping und Content-Management eingesetzt. Zwei beliebte Tools sind PuppeteerSharp (für Chrome/Chromium optimiert) und Selenium WebDriver (unterstützt mehrere Browser). Hier ist ihr Vergleich:

FunktionPuppeteerSharpSelenium WebDriver
Browser-UnterstützungChrome/ChromiumChrome, Firefox, Edge usw.
EinrichtungsaufwandEinfacher (automatischer Chromium-Download)Erfordert separate Treiber-Einrichtung
PerformanceSchneller für Chrome/ChromiumKonsistent über verschiedene Browser hinweg
API-DesignModern, Promise-basiertTraditionell, objektorientiert
SpeichernutzungGeringerJe nach Browser unterschiedlich

Wichtige Vorteile von Headless Browsern:

  • Geschwindigkeit: Schnellere Tests ohne GUI-Rendering.
  • Effizienz: Benötigt weniger Speicher und CPU.
  • Automatisierung: Übernimmt Aufgaben wie Daten-Scraping, Tests und Formularübermittlungen.

Für eine schnelle Einrichtung:

  1. Installieren Sie das .NET SDK und die erforderlichen Pakete (PuppeteerSharp oder 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 eignet sich ideal für Chrome-zentrierte Aufgaben, während Selenium in browserübergreifenden Einsatzszenarien überzeugt. Wählen Sie das Tool anhand der Anforderungen Ihres Projekts.

Selenium-Headless-Browser-Tests in C# mit PhantomJS

Anforderungen für die Einrichtung

Die Einrichtung eines Headless Browsers in C# erfordert bestimmte Tools und Konfigurationen. Hier finden Sie eine Übersicht über die erforderliche Software sowie einen Vergleich von PuppeteerSharp und Selenium WebDriver.

Installation der erforderlichen Software

Für den Einstieg benötigen Sie Folgendes:

  • .NET SDK: Installieren Sie es über eine dieser Methoden:
  • Pakete: Installieren Sie die erforderlichen Pakete für Ihr Projekt:
PaketInstallationsbefehlZweck
PuppeteerSharpdotnet add package PuppeteerSharpAutomatisiert und steuert Chrome/Chromium
Selenium WebDriverdotnet add package Selenium.WebDriver --version 4.29.0Ermöglicht browserübergreifende Automatisierung
Browser-TreiberLaden Sie die erforderlichen Treiber für Ihren Browser herunterStellt die Funktionalität von Selenium sicher

Sobald die Software bereit ist, sehen wir uns an, wie PuppeteerSharp und Selenium WebDriver im Vergleich abschneiden.

PuppeteerSharp vs. Selenium WebDriver

Beide Tools eignen sich hervorragend für die Headless-Browser-Automatisierung, dienen jedoch unterschiedlichen Zwecken. Hier ist ein kurzer Vergleich:

FunktionPuppeteerSharpSelenium WebDriver
Browser-UnterstützungAuf Chrome/Chromium beschränktFunktioniert mit Chrome, Firefox, Edge usw.
EinrichtungsaufwandUnkompliziert – automatischer Chromium-Download enthaltenErfordert eine separate Treiber-Installation
PerformanceFür Chrome/Chromium optimiertKonsistent über unterstützte Browser hinweg
API-DesignModern, Promise-basiertTraditionell, objektorientiert
SpeichernutzungGeringerer SpeicherverbrauchJe nach Browser unterschiedlich

Für C#-Entwickler ist PuppeteerSharp oft am schnellsten eingerichtet. Die automatische Chromium-Verwaltung und die benutzerfreundliche API machen es ideal für Projekte, die ausschließlich auf Chrome/Chromium ausgerichtet sind. Selenium WebDriver eignet sich dagegen besser für Projekte mit Anforderungen an browserübergreifende Kompatibilität, da es mehrere Browser über Betriebssystemereignisse und dedizierte Treiber unterstützt.

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

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

Diese Einrichtung stellt Ihnen die Tools für eine robuste Headless-Browser-Automatisierung bereit – 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#-Aufgaben zur Webautomatisierung.

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");

Nach dem Start des Browsers können Sie mit Webseiten interagieren und Daten erfassen.

Seitenaktionen und Datenerfassung

Mit PuppeteerSharp können Sie verschiedene Aktionen auf Webseiten durchfü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-Performance sollten Sie diese Techniken in Betracht ziehen:

TechnikUmsetzungVorteile
Request InterceptionUnnötige Ressourcen blockierenVerkürzt die Ladezeit
Asset-CachingEin benutzerdefiniertes Verzeichnis für Nutzerdaten verwendenBeschleunigt wiederholte Besuche
Rate LimitingVerzögerungen zwischen Anfragen hinzufügenReduziert die Serverlast

Arbeit mit dynamischen Inhalten

Statische Inhalte sind unkompliziert, dynamische Inhalte erfordern jedoch häufig zusätzliche Schritte, etwa das Warten auf das Laden von Elementen oder den Umgang mit durch 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;
}");

Bei komplexeren Interaktionen, etwa mit Anwendungen wie Bing Maps, können Sie Aktionen verketten, um anspruchsvolle 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 Ressourcen ordnungsgemäß bereinigen:

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

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

sbb-itb-23997f1

Selenium WebDriver verwenden

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

Headless-Modus einrichten

Um Selenium WebDriver für den Headless-Modus zu konfigurieren, benötigen Sie browserspezifische Einstellungen. So richten Sie ihn 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 Browser im Headless-Modus ausgeführt werden, können Sie Aufgaben wie die Interaktion mit Seitenelementen ohne sichtbare Benutzeroberfläche erledigen.

„Durch die Einstellung der Komfortmethode und ihre Entfernung in Selenium 4.10.0 erhalten Nutzer die volle Kontrolle darüber, welchen Headless-Modus sie verwenden möchten.“ – Diego Molina, Selenium [2]

Erweiterte Seiteninteraktionen

Selenium WebDriver verarbeitet detaillierte Webinteraktionen mühelos. 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();

Gängige Element-Selektoren:

SelektortypOptimaler AnwendungsfallBeispiel
IDEindeutige ElementeBy.Id("login-button")
CSSKomplexe MusterBy.CssSelector(".nav > .item")
XPathDynamische InhalteBy.XPath("//div[contains(@class, 'dynamic')]")

Optionen für den Seitenexport

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);

Zeitkonfigurationen sind für eine reibungslose Automatisierung entscheidend:

// 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 Ressourcen nach Abschluss ordnungsgemäß bereinigt werden:

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 berücksichtigen:

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 außerdem unnötige Ressourcen wie Bilder oder Stylesheets blockieren, um Speicher 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();
};

Leitfaden zur Fehlerbehebung

Die Performance zu verbessern ist wichtig, doch ebenso essenziell ist die Behebung häufiger Fehler für eine reibungslose Automatisierung. Hier ist ein kurzer Leitfaden:

FehlertypHäufige UrsacheLösung
Timeout-AusnahmenLangsames Laden der SeiteWebDriverWait mit längeren Timeouts verwenden
Element nicht gefundenDynamische InhalteExplizite Waits und präzise Selektoren verwenden
Nicht übereinstimmende TreiberversionVeraltete KomponentenWebDriver- und Browserversionen aufeinander abstimmen

Beispielsweise können Sie diesen Code verwenden, um langsam ladende Seiten zu 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 Aspekte des Renderings nicht sichtbar sind.“ – ClimbingLion [3]

Anmelde- und Sicherheitsschritte

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

// 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:

  • Verwenden Sie IP-basiertes Rate Limiting, um Missbrauch zu verhindern.
  • Speichern Sie sensible Informationen wie Zugangsdaten in Umgebungsvariablen.
  • Stellen Sie eine ordnungsgemäße Sitzungsverwaltung sicher.
  • Führen Sie regelmäßige Sicherheitsprüfungen durch.

Für die Verarbeitung von Authentifizierungsfehlern können Sie eine Wiederholungslogik wie diese implementieren:

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

Fazit

Zusammenfassung

Die Headless-Browser-Automatisierung in C# bietet mit PuppeteerSharp und Selenium WebDriver leistungsstarke Optionen. Während PuppeteerSharp für seine Geschwindigkeit und Effizienz mit Chrome/Chromium bekannt ist, zeichnet sich Selenium durch browserübergreifende Kompatibilität und Integrationen auf Enterprise-Niveau aus [5].

Hier ist eine kurze Übersicht:

  • PuppeteerSharp: Ideal für die Chrome/Chromium-Automatisierung, wenn Geschwindigkeit und Ressourceneffizienz Priorität haben [1].
  • Selenium: Bestens geeignet für Aufgaben, die Kompatibilität mit mehreren Browsern und umfassendere Sprachunterstützung erfordern [4].

„Puppeteer ist die bessere Wahl, wenn Geschwindigkeit und präzise Browsersteuerung entscheidend sind. Selenium unterstützt mehr Sprachen und eignet sich besser, wenn Sie Ihre Scraping-Aufgaben über mehrere Browser hinweg ausführen müssen.“ – ZenRows [5]

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

Weiterführende Ressourcen

Wenn Sie Ihr Wissen über Headless Browser in C# erweitern möchten, helfen Ihnen diese Ressourcen:

  • Treten Sie dem Slack-Kanal #puppeteer-sharp bei, um Unterstützung in Echtzeit zu erhalten [6].
  • Sehen Sie sich die Bibliothek PuppeteerSharp.Contrib für zusätzliche Funktionen an [7].
  • Lesen Sie die offizielle API-Dokumentation, um sich mit dem gesamten Funktionsumfang vertraut zu machen [6].

Praktische Anwendungsfälle für diese Tools sind:

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

Die Landschaft der Headless Browser entwickelt sich kontinuierlich weiter. Bleiben Sie durch GitHub-Projekte und Entwicklerforen auf dem Laufenden, um neue Updates und aufkommende Best Practices bestmöglich zu nutzen.

References

FAQ

Frequently Asked Questions

Headless Browser automatisieren Webaufgaben ohne grafische Benutzeroberfläche. In C# werden sie häufig für automatisierte Tests, Web Scraping, Content-Management, Tests von CI/CD-Pipelines, Performance-Monitoring und Formularübermittlungen eingesetzt. Sie laufen schneller und benötigen weniger Arbeitsspeicher als vollständige Browserfenster.

War das hilfreich? Teile es →

Geschrieben von

Vasiliy Datsenko

Leiter des Kundensupports

Vasiliy Datsenko ist Leiter des Kundensupports bei Latenode und ein produktorientierter Autor zum Thema Automatisierung. Seine Arbeit verbindet Kundengespräche, Workflow-Automatisierungsforschung, KI-Anwendungsfälle und praktische Produktschulungen für Teams, die echte Geschäftsprozesse automatisieren möchten.

Autorenprofil →

Faktencheck von

Oleg Zankov

CEO Latenode, No-code-Experte

Mit einer Philosophie, die auf Innovation, Problemlösung und Benutzererfahrung basiert, konzentriere ich mich darauf, Teams zu befähigen, maßgeschneiderte Integrationen zu erstellen und Arbeitsabläufe einfach und effizient zu automatisieren. Mit umfangreicher Erfahrung in den Bereichen Geschäftsentwicklung, Technologieunternehmertum und Softwareentwicklung erkannte ich den Bedarf an einer zugänglicheren, skalierbareren und anpassungsfähigeren Integrationslösung. So entstand Latenode.com. Mit unserer Plattform können Unternehmen die Macht der Technologie nutzen, ohne umfassende Programmierkenntnisse zu benötigen. Leidenschaftlich daran interessiert, eine Zukunft zu fördern, in der Technologie uns dient und nicht umgekehrt, ist es meine Mission, komplexe Prozesse zu vereinfachen. Ich glaube an die Demokratisierung der Technologie und daran, Teams mit den Werkzeugen auszustatten, um in einer zunehmend digitalen Welt zu innovieren, zu wachsen und erfolgreich zu sein.

Autorenprofil →

Weiterlesen