Preguntas frecuentes

¿Cuál es el estado de la compatibilidad entre navegadores?

La compatibilidad oficial de Firefox es experimental. El objetivo de la colaboración continua con Mozilla es admitir casos de uso de prueba comunes de extremo a extremo, para los que los desarrolladores esperan una cobertura en varios navegadores. El equipo de Puppeteer necesita la participación de los usuarios para estabilizar la compatibilidad con Firefox y llamar la atención sobre las API faltantes.

A partir de la versión 2.1.0 de Puppeteer, puedes especificar puppeteer.launch({product: 'firefox'}) para que ejecute tus secuencias de comandos de Puppeteer en Firefox Nightly, sin ningún parche
personalizado adicional. Si bien un experimento anterior requería una versión con parche de Firefox, el enfoque actual funciona con Firefox "stock".

Continuamos colaborando con otros proveedores de navegadores para ofrecer compatibilidad con Puppeteer en navegadores, como Safari. Este esfuerzo incluye la exploración de un estándar para ejecutar comandos entre navegadores (en lugar de depender del protocolo no estándar de Herramientas para desarrolladores que usa Chrome).

¿Cuáles son los objetivos y principios de Puppeteer?

Los objetivos del proyecto son los siguientes:

  • Proporciona una biblioteca delgada y canónica que destaque las capacidades del protocolo DevOps.
  • Proporciona una implementación de referencia para bibliotecas de prueba similares. Finalmente, estos otros frameworks podrían adoptar Puppeteer como su capa de base.
  • Aumentar la adopción de pruebas de navegadores automatizados o sin interfaz gráfica
  • Ayude a hacer una prueba interna de las nuevas funciones del protocolo de Herramientas para desarrolladores... y a detectar errores.
  • Obtén más información sobre los puntos débiles de las pruebas automatizadas de navegadores y ayuda a llenar esos vacíos.

Adaptamos los principios de Chromium para ayudarnos a impulsar las decisiones de productos:

  • Velocidad: Puppeteer casi no tiene una sobrecarga de rendimiento en comparación con una página automatizada.
  • Seguridad: Puppeteer opera fuera del proceso con respecto a Chromium, por lo que es seguro automatizar páginas potencialmente maliciosas.
  • Estabilidad: Puppeteer no debe ser inestable y no debe perder memoria.
  • Simplicidad: Puppeteer proporciona una API de alto nivel que es fácil de usar, comprender y depurar.

¿Puppeteer reemplazará a Selenium/WebDriver?

No. Ambos proyectos son valiosos por razones muy diferentes:

  • Selenium/WebDriver se centra en la automatización entre navegadores. Su propuesta de valor es una única API estándar que funciona en todos los navegadores principales.
  • Puppeteer se centra en Chromium y su propuesta de valor es funciones enriquecidas y una mayor confiabilidad.

Dicho esto, puedes usar Puppeteer para ejecutar pruebas en Chromium, como usar jest-puppeteer, basado en la comunidad. Si bien esta probablemente no debería ser tu única solución de pruebas, cuenta con algunos buenos puntos en comparación con WebDriver:

  • Puppeteer no requiere configuración y viene incluido con la versión de Chromium con la que funciona mejor. Es mejor realizar algunas pruebas solo en Chromium que no realizar ninguna prueba.
  • Puppeteer tiene una arquitectura basada en eventos, lo que quita una gran cantidad de posibles inestabilidades. No hay necesidad de llamadas malvadas de "sleep(1000)" en los guiones de titero.
  • Puppeteer se ejecuta sin interfaz gráfica de forma predeterminada, lo que hace que se ejecute rápidamente. La versión 1.5.0 de Puppeteer también expone contextos del navegador, lo que permite paralelizar de manera eficiente la ejecución de pruebas.
  • Puppeteer se destaca cuando se trata de depuración: gira el bit "headless" a falso, agrega "slowMo" y verás lo que hace el navegador. Incluso puedes abrir las Herramientas para desarrolladores de Chrome para inspeccionar el entorno de pruebas.

¿Por qué Puppeteer v.XXX no funciona con Chromium v.YYY?

Consideramos a Puppeteer como una entidad indivisible con Chromium. Cada versión de Puppeteer incluye una versión específica de Chromium, que es la única versión garantizada para funcionar.

Esta no es una restricción artificial. En realidad, hay mucho trabajo en Puppeteer en el repositorio de Chromium. Esta es una historia típica:

  1. Se informa un error de Puppeteer
  2. Este es un problema con el protocolo de Herramientas para desarrolladores, así que lo corrigimos en Chromium.
  3. Una vez que llega la corrección ascendente, actualizamos Chromium a Puppeteer.

Sin embargo, a menudo se recomienda usar Puppeteer con la versión oficial de Google Chrome en lugar de Chromium. Para que esto funcione, debes instalar una versión de puppeteer-core que corresponda a la versión de Chrome.

Por ejemplo, para impulsar Chrome 101 con puppeteer-core, usa la etiqueta npm chrome-101:

npm install puppeteer-core@chrome-101

¿Qué versión de Chromium usa Puppeteer?

Puedes buscar la versión de una de las siguientes maneras:

  • Busca la entrada chromium en revisions.ts. Para encontrar la confirmación y el número de versión de Chromium correspondientes, busca la revisión con el prefijo r en la sección "Buscar versiones" de OmahaProxy.
  • Busca el mapa versionsPerRelease en versions.js, que contiene la asignación entre las versiones de Chromium y Puppeteer. Nota: El archivo solo contiene las versiones de Puppeteer en las que se actualiza Chromium. No se muestran todas las versiones de Puppeteer.

¿Qué versión de Firefox usa Puppeteer?

Dado que la compatibilidad con Firefox es experimental, Puppeteer descarga la versión más reciente de Firefox Nightly cuando la variable de entorno PUPPETEER_PRODUCT se establece en firefox. También es el motivo por el que el valor de firefox en revisions.ts es latest: Puppeteer no está vinculado a una versión específica de Firefox.

Para recuperar Firefox Nightly como parte de la instalación de Puppeteer, haz lo siguiente:

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

¿Qué se considera una navegación?

Desde el punto de vista de Puppeteer, "navegación" es cualquier cosa que cambie la URL de una página. Además de la navegación habitual en la que el navegador accede a la red para recuperar un documento nuevo del servidor web, esto incluye el uso de las navegaciones de anclaje y de la API de History.

Con esta definición de "navegación", Puppeteer funciona sin problemas con aplicaciones de una sola página.

¿Cuál es la diferencia entre un evento de entrada “confiable” y “no confiable”?

En los navegadores, los eventos de entrada podrían dividirse en dos grandes grupos: confiables y no confiables.

  • Eventos de confianza: Eventos generados por los usuarios que interactúan con la página, como cuando usan un mouse o un teclado.
  • Evento no confiable: Eventos que generan las APIs web, como los métodos document.createEvent o element.click()

Los sitios web pueden distinguir entre estos dos grupos:

  • Con una marca de evento Event.isTrusted
  • o sniffing de los eventos que la acompañan. Por ejemplo, cada evento de confianza 'click' está precedido por eventos de 'mousedown' y 'mouseup'.

Para la automatización, es importante generar eventos de confianza. Todos los eventos de entrada generados con Puppeteer son confiables y activan eventos que los acompañen.

Si, por algún motivo, uno necesita un evento que no es de confianza, siempre es posible acceder al contexto de una página con page.evaluate y generar un evento falso:

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

¿Qué funciones no admite Puppeteer?

Es posible que Puppeteer no se comporta como se espera cuando controlas páginas que incorporan audio y video. Por ejemplo, es probable que fallen la reproducción de video y las capturas de pantalla). Existen dos motivos para ello:

  • Puppeteer está incluido en Chromium (no en Chrome). Por lo tanto, hereda todas las limitaciones relacionadas con los medios de Chromium de forma predeterminada. Esto significa que Puppeteer no admite formatos con licencia como AAC o H.264.
    • Es posible forzar a Puppeteer a usar una versión de Chrome instalada por separado en lugar de Chromium con la opción executablePath a puppeteer.launch. Solo debes usar esta configuración si necesitas una versión oficial de Chrome que admita estos formatos multimedia.
  • Dado que Puppeteer (en todas las configuraciones) controla una versión de escritorio de Chromium o Chrome, las funciones que solo son compatibles con la versión para dispositivos móviles de Chrome no son compatibles. Esto significa que Puppeteer no es compatible con HTTP Live Streaming (HLS).

Tengo problemas para instalar o ejecutar Puppeteer en mi entorno de pruebas. ¿Dónde debo buscar ayuda?

Tenemos una guía de solución de problemas para varios sistemas operativos que enumera las dependencias necesarias.

Chromium se descarga cada npm ci ejecución. ¿Cómo puedo almacenar la descarga en caché?

La ruta de descarga predeterminada es node_modules/puppeteer/.local-chromium. Sin embargo, puedes cambiar esa ruta con la variable de entorno PUPPETEER_DOWNLOAD_PATH.

Puppeteer usa esa variable para resolver la ubicación ejecutable de Chromium durante el inicio, por lo que no es necesario especificar PUPPETEER_EXECUTABLE_PATH también.

Por ejemplo, para mantener la descarga de Chromium en ~/.npm/chromium, haz lo siguiente:

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

Tengo más preguntas. ¿Dónde pregunto?

Hay muchas formas de obtener ayuda en Puppeteer:

Asegúrate de buscar en estos canales antes de publicar tu pregunta.