Modalità headless di Chrome

Peter Kvitek
Peter Kvitek

Con la modalità headless di Chrome puoi eseguire il browser in un ambiente inattivo, senza UI visibile. Essenzialmente, puoi eseguire Chrome senza Chrome.

La modalità headless è una scelta popolare per l'automazione del browser, attraverso progetti come Puppeteer o ChromeDriver.

Usa la modalità headless

Per utilizzare la modalità headless, passa il flag della riga di comando --headless:

chrome --headless

Usa la vecchia modalità headless

In precedenza, la modalità headless era un'implementazione separata del browser che è stato fornito come parte dello stesso file binario di Chrome. Non ha condiviso qualsiasi codice del browser Chrome //chrome

Ora Chrome ha modalità headless e headful unificate.

La modalità headless condivide il codice con Chrome.

Per il momento, la vecchia modalità headless è ancora disponibile con:

chrome --headless=old

In un burattinaio

Per usare la modalità headless in Puppeteer:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
  headless: 'true', // (default) enables Headless
  // `headless: 'old'` enables old Headless
  // `headless: false` enables "headful" mode
});

const page = await browser.newPage();
await page.goto('https://developer.chrome.com/');

// …

await browser.close();

In Selenium-WebDriver

Per utilizzare la modalità headless in Selenium-WebDriver:

const driver = await env
  .builder()
  .setChromeOptions(options.addArguments('--headless'))
  .build();

await driver.get('https://developer.chrome.com/');

// …

await driver.quit();

Consulta il post del blog del team di Selenium per ulteriori informazioni, inclusi esempi che utilizzano associazioni di altre lingue.

Flag della riga di comando

I seguenti flag della riga di comando sono disponibili in modalità headless.

--dump-dom

Il flag --dump-dom stampa il DOM serializzato della pagina di destinazione su stdout. Ad esempio:

chrome --headless --dump-dom https://developer.chrome.com/

Questa operazione è diversa dalla stampa del codice sorgente HTML, che puoi utilizzare con curl. Per fornirti l'output di --dump-dom, Chrome prima analizza il codice HTML in un DOM, esegue qualsiasi elemento <script> che potrebbe alterare il DOM, trasforma quel DOM in una stringa serializzata di HTML.

--screenshot

Il flag --screenshot acquisisce uno screenshot della pagina di destinazione e lo salva come screenshot.png nella directory di lavoro attuale. Ciò è particolarmente utile combinato con il flag --window-size.

Ad esempio:

chrome --headless --screenshot --window-size=412,892 https://developer.chrome.com/

--print-to-pdf

Il flag --print-to-pdf salva la pagina di destinazione come PDF denominato output.pdf in nell'attuale directory di lavoro. Ad esempio:

chrome --headless --print-to-pdf https://developer.chrome.com/

Se vuoi, puoi aggiungere il flag --no-pdf-header-footer per omettere la stampa intestazione (con la data e ora correnti) e piè di pagina (con l'URL e la pagina ).

chrome --headless --print-to-pdf --no-pdf-header-footer https://developer.chrome.com/

No: la funzionalità dietro il flag --no-pdf-header-footer era in precedenza disponibili con il flag --print-to-pdf-no-header. Potresti dover ricorrere il vecchio nome del flag, se utilizzi una versione precedente.

--timeout

Il flag --timeout definisce il tempo di attesa massimo (in millisecondi) dopodiché i contenuti della pagina vengono acquisiti da --dump-dom, --screenshot e --print-to-pdf anche se la pagina è ancora in fase di caricamento.

chrome --headless --print-to-pdf --timeout=5000 https://developer.chrome.com/

Il flag --timeout=5000 indica a Chrome di attendere fino a 5 secondi prima di stampare il PDF. Pertanto, l'esecuzione di questo processo richiede al massimo 5 secondi.

--virtual-time-budget

Il --virtual-time-budget funge da "avanzamento veloce" per qualsiasi codice dipendente dal tempo (ad es. setTimeout/setInterval). Obbliga il browser a eseguire qualsiasi del codice della pagina il più velocemente possibile, facendo credere alla pagina che che passa effettivamente il tempo.

Per illustrarne l'utilizzo, consideriamo questa demo, incrementa, registra e visualizza un contatore al secondo utilizzando setTimeout(fn, 1000). Ecco il codice pertinente:

<output>0</output>
<script>
  const element = document.querySelector('output');
  let counter = 0;
  setInterval(() => {
    counter++;
    console.log(counter);
    element.textContent = counter;
  }, 1_000);
</script>

Dopo un secondo, la pagina contiene "1"; dopo due secondi, "2" e così via. Ecco come acquisire lo stato della pagina dopo 42 secondi e salvarlo come PDF:

chrome --headless --print-to-pdf --virtual-time-budget=42000 https://mathiasbynens.be/demo/time

--allow-chrome-scheme-url

Per accedere a chrome:// URL è necessario il flag --allow-chrome-scheme-url. Questo flag è disponibile a partire dalla versione 123 di Chrome. Ecco un esempio:

chrome --headless --print-to-pdf --allow-chrome-scheme-url chrome://gpu

Debug

Poiché Chrome è effettivamente invisibile in modalità headless, potrebbe sembrare difficile per risolvere un problema. È possibile eseguire il debug di Chrome headless in un modo molto in modo simile a Chrome headful.

Avvia Chrome in modalità headless con il Flag della riga di comando --remote-debugging-port.

chrome --headless --remote-debugging-port=0 https://developer.chrome.com/

Viene stampato un URL WebSocket univoco allo stdout, ad esempio:

DevTools listening on ws://127.0.0.1:60926/devtools/browser/b4bd6eaa-b7c8-4319-8212-225097472fd9

In un'istanza "headful" di Chrome, possiamo utilizzare Debug remoto di Chrome DevTools per connetterti al target headless e lo ispeziona.

  1. Vai a chrome://inspect e fai clic sul pulsante Configura....
  2. Inserisci l'indirizzo IP e il numero di porta dall'URL WebSocket.
    • Nell'esempio precedente, ho inserito 127.0.0.1:60926.
  3. Fai clic su Fine. Dovresti vedere un oggetto target remoto con tutte le sue schede e altri obiettivi elencati.
  4. Fai clic su inspect per accedere a Chrome DevTools e ispezionare il telecomando Target headless, inclusa una visualizzazione in tempo reale della pagina.

Chrome DevTools può esaminare una pagina di destinazione headless remota

Feedback

Non vediamo l'ora di ricevere il tuo feedback sulla modalità headless. Se problemi, segnala un bug.