in Architettura Software, Informatica

Automazione Browser in .NET: Guida Completa a Puppeteer Sharp

Nel panorama moderno dello sviluppo web, l’automazione del browser è diventata una necessità imprescindibile. Che si tratti di test end-to-end, web scraping dinamico o generazione di report PDF da applicazioni web complesse, gli sviluppatori hanno bisogno di strumenti robusti e affidabili.

Se lavori nell’ecosistema .NET, la risposta a queste esigenze è Puppeteer Sharp.

Cos’è Puppeteer Sharp?

Puppeteer Sharp è il porting ufficiale in .NET di Puppeteer, la celebre libreria Node.js sviluppata da Google. Si tratta di una libreria “headless” che permette di controllare istanze di Chromium (o Chrome) direttamente tramite codice C#.

A differenza di altri strumenti storici come Selenium, Puppeteer Sharp comunica direttamente con il browser tramite il protocollo DevTools, garantendo una velocità superiore, una minore latenza e un controllo capillare su ogni aspetto del browser: dal rendering del JavaScript all’intercettazione del traffico di rete.

Perché scegliere Puppeteer Sharp rispetto a Selenium?

Molti team si chiedono se valga la pena migrare da Selenium a Puppeteer Sharp. Ecco i vantaggi principali:

  1. Installazione Zero-Config: Puppeteer Sharp può scaricare automaticamente la versione corretta di Chromium necessaria per l’esecuzione.
  2. Performance: Essendo ottimizzato per il protocollo Chrome DevTools, è intrinsecamente più veloce nell’esecuzione dei comandi.
  3. Modernità: Gestisce nativamente le Single Page Application (SPA) basate su React, Angular o Vue, attendendo correttamente il caricamento dei componenti asincroni.
  4. Affidabilità: Riduce drasticamente i test “flaky” (instabili) grazie a meccanismi di attesa intelligenti.

Implementazione Pratica

Vediamo ora come integrare Puppeteer Sharp in un progetto .NET e come affrontare i casi d’uso più comuni.

1. Configurazione Iniziale

Per iniziare, è sufficiente installare il pacchetto NuGet:

Bash

dotnet add package PuppeteerSharp

2. Generazione di un PDF da una Pagina HTML

Uno degli usi più frequenti è la trasformazione di dashboard web o fatture HTML in documenti PDF pronti per la stampa.

using PuppeteerSharp;
using System.Threading.Tasks;

public async Task GenerateWebPagePdfAsync()
{
    // Scarica Chromium se non è già presente
    using var browserFetcher = new BrowserFetcher();
    await browserFetcher.DownloadAsync();

    // Avvia il browser in modalità headless
    await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
    {
        Headless = true
    });

    // Apri una nuova pagina e naviga verso l'URL
    await using var page = await browser.NewPageAsync();
    await page.GoToAsync("https://www.google.com");

    // Genera il PDF con opzioni di formattazione
    await page.PdfAsync("output_google.pdf", new PdfOptions
    {
        Format = PaperFormat.A4,
        PrintBackground = true
    });
}

3. Web Scraping di Contenuti Dinamici

Molti siti moderni caricano i dati tramite chiamate API dopo il caricamento iniziale della pagina. Puppeteer Sharp eccelle nel catturare questi dati “invisibili” agli scraper tradizionali.

public async Task ScrapeDynamicContentAsync()
{
    using var browserFetcher = new BrowserFetcher();
    await browserFetcher.DownloadAsync();

    await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
    await using var page = await browser.NewPageAsync();

    await page.GoToAsync("https://example.com/dynamic-charts");

    // Attendi che un elemento specifico sia renderizzato nel DOM
    await page.WaitForSelectorAsync(".data-loaded-indicator");

    // Estrai i dati eseguendo JavaScript nel contesto della pagina
    var content = await page.EvaluateExpressionAsync<string>("document.querySelector('#data-container').innerText");

    Console.WriteLine($"Dati estratti: {content}");
}

4. Catturare Screenshot per Visual Regression Testing

Il monitoraggio dell’interfaccia utente è cruciale per evitare bug grafici.

await page.ScreenshotAsync("screenshot_full.png", new ScreenshotOptions
{
    FullPage = true
});

Considerazioni Avanzate: Performance e Scalabilità

Quando si utilizza Puppeteer Sharp in ambienti di produzione (come Azure Functions o microservizi Docker), è fondamentale gestire correttamente il ciclo di vita del browser:

  • Pool di Istanze: Non aprire un nuovo browser per ogni richiesta. È preferibile mantenere un’istanza del browser attiva e aprire nuovi “BrowserContext” o “Pages” per isolare le sessioni.
  • Gestione Risorse: Assicurarsi sempre di implementare l’interfaccia IAsyncDisposable (usando await using) per chiudere correttamente i processi di Chromium ed evitare memory leak.
  • Linux e Docker: Puppeteer Sharp funziona perfettamente su Linux, ma richiede l’installazione di alcune dipendenze di sistema per Chromium. Assicuratevi che il vostro Dockerfile includa le librerie necessarie (come libx11, libxss, etc.).

Conclusione

Adottare Puppeteer Sharp oggi significa investire in una soluzione moderna, supportata da una community attiva e perfettamente allineata con l’evoluzione del web.