Domande frequenti

Qual è lo stato del supporto tra browser?

Il supporto ufficiale di Firefox è sperimentale. La costante collaborazione con Mozilla mira a supportare casi d'uso di test end-to-end comuni, per i quali gli sviluppatori si aspettano una copertura tra browser. Il team di Puppeteer ha bisogno del contributo degli utenti per stabilizzare il supporto di Firefox e per richiamare la nostra attenzione sulle API mancanti.

A partire dalla versione 2.1.0 di Puppeteer, puoi specificare puppeteer.launch({product: 'firefox'}) per eseguire i tuoi script Puppeteer in Firefox Nightly, senza ulteriori patch
personalizzate. Mentre un esperimento meno recente richiedeva una versione con patch di Firefox, l'approccio attuale funziona con Firefox "di serie".

Continuiamo a collaborare con altri fornitori di browser per supportare Puppeteer in browser come Safari. Questa iniziativa include l'esplorazione di uno standard per l'esecuzione di comandi tra browser (anziché fare affidamento sul protocollo non standard di DevTools utilizzato da Chrome).

Quali sono gli obiettivi e i principi di Puppeteer?

Gli obiettivi del progetto sono:

  • Offrire una libreria sottile e canonica che evidenzia le funzionalità del protocollo DevTools.
  • Fornisci un'implementazione di riferimento per librerie di test simili. In un secondo momento, questi altri framework potrebbero adottare Puppeteer come livello di base.
  • Aumenta l'adozione dei test del browser headless/automatici.
  • Aiuta a utilizzare la versione sperimentale delle nuove funzionalità del protocollo DevTools...e rileva i bug!
  • Scopri di più sulle criticità dei test automatici del browser e contribuisci a colmare queste lacune.

Adattiamo i principi di Chromium per aiutarci a prendere decisioni sui prodotti:

  • Velocità: burattinaio ha un overhead in termini di rendimento quasi pari a zero rispetto a una pagina automatizzata.
  • Sicurezza: Puppeteer opera fuori processo rispetto a Chromium, rendendo sicuro l'automazione delle pagine potenzialmente dannose.
  • Stabilità: il burattino non deve essere irregolare e non deve far perdere memoria.
  • Semplicità: Puppeteer fornisce un'API di alto livello facile da usare, comprendere ed eseguire il debug.

Puppeteer sostituirà selenio/WebDriver?

No. Entrambi i progetti sono preziosi per motivi molto diversi:

  • Selenium/WebDriver si concentra sull'automazione cross-browser; la sua proposta di valore è una singola API standard che funziona su tutti i principali browser.
  • Puppeteer si concentra su Chromium; la sua proposta di valore è più ricca di funzionalità e affidabilità.

Detto questo, puoi usare Puppeteer per eseguire test su Chromium, ad esempio utilizzando lo jest-puppeteer gestito dalla community. Anche se questa probabilmente non dovrebbe essere la tua unica soluzione di test, ha alcuni punti positivi rispetto a WebDriver:

  • Puppeteer non richiede nessuna configurazione e viene fornito con la versione di Chromium che funziona meglio. È preferibile eseguire alcuni test solo su Chromium, anziché nessun test.
  • Puppeteer ha un'architettura basata sugli eventi, che rimuove molte potenziali irregolarità. Non c'è bisogno di chiamate malvagie "sleep(1000)" negli script burattinaio.
  • Per impostazione predefinita, Puppeteer è senza testa, il che ne velocizza l'esecuzione. Puppeteer v1.5.0 espone anche i contesti del browser, consentendo di parallelizzare in modo efficiente l'esecuzione del test.
  • Puppeteer eccelle quando si tratta di debug: inverti il bit "headless" in false, aggiungi "slowMo" e vedrai cosa sta facendo il browser. Puoi anche aprire Chrome DevTools per esaminare l'ambiente di test.

Perché Puppeteer v.XXX non funziona con Chromium v.YYY?

Consideriamo Puppeteer come un'entità indivisibile con Chromium. Ogni versione di Puppeteer include una versione specifica di Chromium, l'unica versione con cui è garantito il funzionamento.

Non si tratta di un vincolo artificiale. Molto lavoro su Puppeteer si sta svolgendo nel repository di Chromium. Ecco una storia tipica:

  1. È stato segnalato un bug di Puppeteer
  2. Si tratta di un problema con il protocollo DevTools, pertanto lo correggiamo in Chromium
  3. Quando ricevi la correzione upstream, implementiamo Chromium aggiornato in Puppeteer

Tuttavia, spesso è preferibile utilizzare Puppeteer con la versione ufficiale di Google Chrome anziché Chromium. Affinché questo comando funzioni, devi installare una versione di puppeteer-core corrispondente a quella di Chrome.

Ad esempio, per guidare Chrome 101 con puppeteer-core, utilizza il tag chrome-101 npm:

npm install puppeteer-core@chrome-101

Quale versione di Chromium utilizza Puppeteer?

Trova la versione in uno dei seguenti modi:

  • Cerca la voce chromium in revisions.ts. Per trovare il commit e il numero di versione di Chromium corrispondenti, cerca la revisione preceduta da un r nella sezione "Trova release" di OmahaProxy.
  • Cerca la mappa versionsPerRelease in versions.js che contiene la mappatura tra le versioni di Chromium e Puppeteer. Nota: il file contiene solo le versioni Puppeteer a cui è stato aggiornato Chromium. Non sono elencate tutte le versioni di Puppeteer.

Quale versione di Firefox utilizza Puppeteer?

Il supporto di Firefox è sperimentale, pertanto Puppeteer scarica l'ultima versione di Firefox per notte quando la variabile di ambiente PUPPETEER_PRODUCT è impostata su firefox. Questo è anche il motivo per cui il valore di firefox in revisions.ts è latest: Puppeteer non è legato a una particolare versione di Firefox.

Per recuperare Firefox Nightly come parte dell'installazione di Puppeteer:

PUPPETEER_PRODUCT=firefox npm i puppeteer
# or "yarn add puppeteer"

Cosa si intende per navigazione?

Dal punto di vista di Puppeteer, la "navigazione" è tutto ciò che cambia l'URL di una pagina. Oltre alla normale navigazione in cui il browser accede alla rete per recuperare un nuovo documento dal server web, sono inclusi le navigazioni ancorate e l'utilizzo dell'API History.

Con questa definizione di "navigazione", Puppeteer si integra perfettamente con le applicazioni a pagina singola.

Qual è la differenza tra un evento di input "attendibile" e "non attendibile"?

Nei browser, gli eventi di input potrebbero essere suddivisi in due grandi gruppi: attendibili e non attendibili.

  • Eventi attendibili: eventi generati dagli utenti che interagiscono con la pagina, ad esempio utilizzando un mouse o una tastiera.
  • Evento non attendibile: eventi generati dalle API web, ad esempio i metodi document.createEvent o element.click().

I siti web sono in grado di distinguere tra questi due gruppi:

  • Utilizzare un flag evento Event.isTrusted
  • sniffare per gli eventi correlati. Ad esempio, ogni evento 'click' attendibile è preceduto dagli eventi 'mousedown' e 'mouseup'.

Ai fini dell'automazione è importante generare eventi attendibili. Tutti gli eventi di input generati con Puppeteer sono considerati attendibili e attivano eventi associati appropriati.

Se, per qualche motivo, serve un evento non attendibile, è sempre possibile accedere al contesto di una pagina con page.evaluate e generare un evento falso:

await page.evaluate(() => {
  document.querySelector('button[type=submit]').click();
});

Quali funzionalità non sono supportate da Puppeteer?

Potresti scoprire che Puppeteer non si comporta come previsto quando controlli le pagine che incorporano audio e video. Ad esempio, è probabile che la riproduzione del video e gli screenshot non vadano a buon fine). I motivi sono due:

  • Puppeteer è integrato in Chromium (non in Chrome). Pertanto, per impostazione predefinita, eredita tutte le limitazioni relative ai contenuti multimediali di Chromium. Ciò significa che Puppeteer non supporta i formati concessi in licenza come AAC o H.264.
    • È possibile forzare Puppeteer a utilizzare una versione di Chrome installata separatamente anziché Chromium con l'opzione executablePath per puppeteer.launch. Utilizza questa configurazione solo se ti serve una release ufficiale di Chrome che supporti questi formati multimediali.
  • Poiché Puppeteer (in tutte le configurazioni) controlla una versione desktop di Chromium o Chrome, le funzionalità supportate soltanto dalla versione per dispositivi mobili di Chrome non sono supportate. Ciò significa che Puppeteer non supporta HTTP Live Streaming (HLS).

Ho problemi a installare / eseguire Puppeteer nel mio ambiente di test. Dove posso cercare assistenza?

È disponibile una guida per la risoluzione dei problemi per vari sistemi operativi che elenca le dipendenze richieste.

Chromium viene scaricato ogni npm ci esecuzione. Come faccio a memorizzare il download nella cache?

Il percorso di download predefinito è node_modules/puppeteer/.local-chromium. Tuttavia, puoi modificare il percorso con la variabile di ambiente PUPPETEER_DOWNLOAD_PATH.

Puppeteer utilizza questa variabile per risolvere la posizione dell'eseguibile di Chromium durante l'avvio, quindi non è necessario specificare anche PUPPETEER_EXECUTABLE_PATH.

Ad esempio, per mantenere il download di Chromium in ~/.npm/chromium:

export PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium
npm ci

# by default the Chromium executable path is inferred
# from the download path
npm test

# a new run of npm ci will check for the existence of
# Chromium in ~/.npm/chromium
npm ci

Ho altre domande. Dove posso chiedere?

Esistono molti modi per ricevere assistenza su Puppeteer:

Assicurati di effettuare una ricerca in questi canali prima di pubblicare la tua domanda.