Réparation de l'erreur Chrome de Puppeteer « Impossible de trouver (ver. 130.0.6723.116) » lors du déploiement de Vercel

Temp mail SuperHeros
Réparation de l'erreur Chrome de Puppeteer « Impossible de trouver (ver. 130.0.6723.116) » lors du déploiement de Vercel
Réparation de l'erreur Chrome de Puppeteer « Impossible de trouver (ver. 130.0.6723.116) » lors du déploiement de Vercel

Pourquoi le déploiement de votre marionnettiste échoue sur Vercel (et comment y remédier)

L’exécution d’un outil de scraping Web ou de capture d’écran sur une configuration locale se déroule généralement sans problème, jusqu’au moment du déploiement. J'ai récemment été confronté à ce problème précis en essayant de lancer mon Marionnettiste script sur Vercel. 🚀 Alors que tout fonctionnait parfaitement sur ma machine locale, le déploiement de Vercel renvoyait une erreur : "Chrome introuvable (ver. 130.0.6723.116)".

Cette erreur peut être frustrante, d'autant plus qu'elle n'apparaît pas lors des tests locaux. Le problème indique généralement une version de navigateur manquante dans l'environnement déployé ou une mauvaise configuration du chemin du cache que le Marionnettiste utilise sur Vercel.

Vercel, par défaut, n'inclut pas toujours l'exécutable Chrome spécifique requis par Puppeteer, ce qui signifie que votre script pourrait ne pas le trouver lors de l'exécution. Ce guide vous expliquera pourquoi cette erreur se produit et quelques stratégies pour la résoudre.

Que vous soyez un développeur nouveau sur Puppeteer ou que vous dépanniez simplement votre déploiement, comprendre ces nuances peut vous faire économiser des heures de débogage. 🛠️ Plongeons dans la solution et faisons fonctionner votre configuration Puppeteer de manière transparente sur Vercel.

Commande Exemple d'utilisation et description détaillée
puppeteer.launch({ ... }) Cette commande lance une instance de Puppeteer avec des options de configuration spécifiques telles que ignoreHTTPSErrors et executablePath. Ces options aident à résoudre les erreurs avec les versions de Chrome sur les plates-formes de déploiement comme Vercel en définissant l'emplacement exact de l'exécutable Chrome et en gérant les paramètres de sécurité.
executablePath Utilisé dans puppeteer.launch, executablePath spécifie le chemin d'accès au binaire Chrome. La définition de ce chemin garantit que Puppeteer utilise la version correcte de Chrome sur les serveurs distants, ce qui est essentiel dans les environnements sans serveur comme Vercel où Chrome peut ne pas être installé par défaut.
args: ['--no-sandbox', '--disable-setuid-sandbox'] Ces indicateurs désactivent la fonctionnalité sandboxing de Chrome, qui est nécessaire pour que Puppeteer puisse fonctionner sur de nombreux fournisseurs d'hébergement cloud. Le sandboxing est généralement désactivé pour éviter les erreurs d'autorisation sur les serveurs partagés, mais doit être effectué avec précaution en raison des implications en matière de sécurité.
cacheDirectory Dans le fichier de configuration de Puppeteer, cacheDirectory définit un répertoire personnalisé pour la mise en cache du navigateur. Ceci est particulièrement utile sur Vercel, car cela vous permet de contrôler où Puppeteer stocke les binaires Chrome téléchargés, évitant ainsi les erreurs liées au cache.
await page.goto(url, { waitUntil: 'networkidle2' }) Cette commande charge l'URL et attend qu'il n'y ait pas plus de deux connexions réseau pour que la page soit considérée comme entièrement chargée. L'option networkidle2 garantit que toutes les ressources ont été chargées avant de prendre une capture d'écran, ce qui la rend idéale pour capturer des pages complexes.
page.setViewport({ width: 1920, height: 1080 }) Définit les dimensions de la fenêtre d'affichage de l'instance Chrome, simulant un écran de la taille spécifiée. Ceci est essentiel pour les captures d’écran et les tests visuels, car cela contrôle l’apparence de la page Web capturée.
path.join(__dirname, '..', 'public', fileName) Cette commande construit un chemin de fichier en joignant le répertoire actuel au dossier public, créant ainsi un répertoire spécifique pour stocker les captures d'écran. C’est essentiel pour organiser les fichiers de sortie, en particulier lors du renvoi du chemin de capture d’écran au client.
uuid() Génère un identifiant unique pour chaque capture d'écran, garantissant que chaque nom de fichier est unique et évitant les écrasements. Cette fonction est particulièrement utile pour les applications qui stockent simultanément plusieurs images ou fichiers de données.
chai.request(app) Faisant partie du module HTTP Chai, cette commande envoie une requête au serveur d'applications (défini comme application) pour tester les réponses du point de terminaison. Ceci est utile pour les tests automatisés, permettant aux développeurs de vérifier si l'API de capture d'écran fonctionne comme prévu.
describe() and it() Ces fonctions de test Mocha définissent des suites de tests (describe()) et des tests individuels (it()) pour valider les fonctionnalités. Ils sont utilisés pour confirmer que chaque aspect de l'API de capture d'écran Puppeteer se comporte correctement dans diverses conditions, des paramètres manquants aux URL valides.

Surmonter l'erreur Chrome de Puppeteer lors du déploiement de Vercel

Le script principal fourni est une fonction backend qui utilise Marionnettiste pour capturer une capture d'écran d'une URL fournie par l'utilisateur. Cette tâche est particulièrement utile pour générer dynamiquement des aperçus ou à des fins de web scraping. Cependant, le déploiement sur des plateformes comme Vercel peut entraîner des erreurs, telles que Chrome introuvable dans l'environnement. Cela se produit parce que Vercel n'est pas livré avec Chrome préinstallé à l'emplacement prévu, ce qui signifie que Puppeteer doit être configuré pour localiser ou installer la version correcte. Dans notre exemple, nous avons implémenté des options pour spécifier le chemin exécutable de Puppeteer vers un binaire Chrome personnalisé et gérer les problèmes SSL avec l'indicateur ignoreHTTPSErrors pour garantir que la configuration fonctionne dans tous les environnements.

Le script commence par définir la fonction de capture d'écran qui prend une URL de la requête. Si l'URL est manquante, elle renvoie une réponse d'erreur JSON, mais si elle est fournie, elle initialise Puppeteer avec les configurations nécessaires comme la cheminexécutable et arguments choix. Le cheminexécutable est essentiel ici car il dirige Puppeteer vers l'emplacement exact de Chrome, résolvant ainsi l'erreur "Impossible de trouver Chrome" sur Vercel. De plus, le arguments options, en particulier sans bac à sable et désactiver-setuid-sandbox, désactivez la fonctionnalité sandboxing de Chrome, une exigence pour certains environnements sans serveur. Ces paramètres garantissent que le script peut s'exécuter sans rencontrer de problèmes d'autorisation sur l'infrastructure gérée de Vercel.

Une fois Puppeteer lancé, le script ouvre une nouvelle page de navigateur et utilise aller à avec le réseauidle2 option. Cela indique à Puppeteer d'attendre que la page soit complètement chargée, avec pas plus de deux requêtes réseau en cours, garantissant que même les pages complexes s'affichent entièrement avant de prendre une capture d'écran. Cette étape est cruciale pour capturer une capture d'écran fiable et précise, en particulier lors de la gestion de pages Web modernes qui dépendent souvent fortement du chargement asynchrone. La taille de la fenêtre d'affichage est ensuite définie sur 1 920 x 1 080, simulant un écran Full HD, ce qui garantit que le contenu capturé reflète la présentation que la plupart des utilisateurs verraient sur un appareil de bureau.

Enfin, le script génère un nom de fichier unique en utilisant le uuide bibliothèque, stockant la capture d'écran dans un répertoire public où elle peut être consultée et renvoyée à l'utilisateur sous forme de réponse JSON. En structurant soigneusement les chemins de fichiers avec Node chemin.join méthode, le script évite les problèmes de chemin de fichier qui pourraient survenir en raison des différences dans les configurations d'environnement. Par exemple, bien que cette structure fonctionne de manière transparente sur une machine locale, les mêmes chemins peuvent ne pas fonctionner sur Vercel, ce qui rend crucial la définition de chaque chemin de fichier de manière modulaire et adaptable. En fin de compte, cette configuration garantit que la fonction Puppeteer fonctionne correctement dans les environnements locaux et sans serveur, en gérant tous les aspects clés tels que le chargement des pages, la gestion des erreurs et les contraintes environnementales. 🖥️

Solution 1 : configurer Puppeteer pour installer correctement Chrome sur Vercel

Cette solution backend basée sur Node.js configure le chemin du cache et les commandes d'installation de Puppeteer pour garantir que Chrome s'installe correctement.

const puppeteer = require('puppeteer');
const path = require('path');
const { v4: uuid } = require('uuid');
const fs = require('fs');

// Main screenshot function
const screenshot = async (req, res) => {
    const url = req.query.url;
    if (!url) {
        return res.status(400).json({ message: 'URL is required' });
    }

    let browser;
    try {
        // Launch Puppeteer with specific Chrome executable path and options
        browser = await puppeteer.launch({
            ignoreHTTPSErrors: true,
            executablePath: process.env.CHROME_PATH || '/opt/bin/chromium',
            args: ['--no-sandbox', '--disable-setuid-sandbox']
        });

        const page = await browser.newPage();
        await page.goto(url, { waitUntil: 'networkidle2' });
        await page.setViewport({ width: 1920, height: 1080 });

        const fileName = \`${uuid()}.png\`;
        const screenshotPath = path.join(__dirname, '..', 'public', fileName);
        await page.screenshot({ path: screenshotPath });

        res.json({ screenshotPath: \`/image/\${fileName}\` });
    } catch (err) {
        console.error('Error capturing screenshot:', err);
        res.status(500).json({ error: 'Failed to capture screenshot' });
    } finally {
        if (browser) await browser.close();
    }
};

module.exports = screenshot;

Solution 2 : configuration personnalisée du marionnettiste pour Vercel avec un fichier .puppeteerrc.cjs

Cette solution ajuste le fichier de configuration de Puppeteer (.puppeteerrc.cjs) pour spécifier le chemin du cache Chrome et assurer la compatibilité avec la structure de fichiers de Vercel.

const { join } = require('path');

/
 * @type {import('puppeteer').Configuration}
 */
module.exports = {
    // Specify cache directory for Puppeteer
    cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    // Specify which Chromium version Puppeteer should install
    executablePath: '/opt/bin/chromium',
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
};

Solution 3 : implémentation de variables d'environnement et de scripts dans package.json pour Puppeteer

Cette approche modifie le package.json pour installer des binaires Chrome spécifiques et configurer automatiquement les configurations de Puppeteer pendant le déploiement.

// Add to package.json
"scripts": {
    "postinstall": "npx puppeteer install --path ./.cache/puppeteer",
    "start": "node index.js"
}

// Configure environment variable in Vercel
process.env.CHROME_PATH = "/opt/bin/chromium";

Test unitaire pour la fonctionnalité de capture d'écran du marionnettiste

Ce script de test Node.js Mocha vérifie la capacité de Puppeteer à capturer une capture d'écran à partir d'une URL dans divers environnements.

const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../app'); // Express app where screenshot endpoint is defined

chai.use(chaiHttp);
const expect = chai.expect;

describe('Screenshot API', () => {
    it('should return an error for missing URL parameter', (done) => {
        chai.request(app)
            .get('/screenshot')
            .end((err, res) => {
                expect(res).to.have.status(400);
                expect(res.body).to.have.property('message').eql('URL is required');
                done();
            });
    });

    it('should capture a screenshot successfully for a valid URL', (done) => {
        chai.request(app)
            .get('/screenshot?url=https://example.com')
            .end((err, res) => {
                expect(res).to.have.status(200);
                expect(res.body).to.have.property('screenshotPath');
                done();
            });
    });
});

Optimisation de Puppeteer pour les environnements cloud

Lors du déploiement d'applications basées sur Puppeteer sur des plates-formes cloud telles que Vercel ou Heroku, comprendre les limites de ces environnements est essentiel. Contrairement aux configurations locales, les environnements cloud fonctionnent généralement sur des architectures gérées ou sans serveur, ce qui signifie que les dépendances telles que Chrome ne sont pas toujours facilement disponibles. En fait, le Marionnettiste launch La méthode peut échouer si la version requise de Chrome n'est pas installée sur le serveur, ce qui entraîne des erreurs telles que « Impossible de trouver Chrome ». Une bonne pratique consiste à spécifier le chemin de l'exécutable de Chrome en utilisant executablePath, car cela garantit que Puppeteer peut localiser et lancer Chrome efficacement dans n'importe quel environnement.

Au-delà de cela, l’ajout des arguments de lancement nécessaires est crucial pour la compatibilité. Des drapeaux tels que --no-sandbox et --disable-setuid-sandbox sont particulièrement utiles. Bien que ces indicateurs désactivent certaines fonctionnalités de sécurité de Chrome, ils sont souvent nécessaires pour les configurations sans serveur dans lesquelles le sandboxing de Chrome n'est pas pris en charge. De plus, spécifier un répertoire de cache personnalisé à l'aide de Puppeteer cacheDirectory L'option permet d'éviter les problèmes potentiels de cache, en particulier lorsque plusieurs versions de navigateur sont impliquées. Par exemple, définir cacheDirectory vers un répertoire connu garantit que toutes les dépendances sont disponibles pendant l'exécution.

Enfin, optimiser le goto Cette méthode peut grandement améliorer les performances. En utilisant le waitUntil: 'networkidle2' option, le script attend la fin du chargement de la page, ce qui est essentiel pour les environnements où la vitesse Internet ou le chargement des ressources varient. Ceci est particulièrement utile pour capturer des captures d'écran précises dans des pages ou des applications dynamiques où le contenu se charge de manière asynchrone. Une combinaison de ces techniques permet à Puppeteer de fonctionner de manière transparente sur les plateformes cloud, offrant ainsi une solution puissante pour les tâches automatisées en production. 🚀

Questions courantes sur les déploiements Puppeteer et Cloud

  1. Pourquoi est-ce que j'obtiens le message d'erreur « Chrome introuvable » sur les plates-formes cloud ?
  2. Ces erreurs se produisent souvent parce que les plates-formes cloud n'incluent pas le binaire Chrome complet par défaut. Vous pouvez résoudre ce problème en spécifiant executablePath dans votre configuration Puppeteer.
  3. Comment puis-je m'assurer que Puppeteer fonctionne à la fois dans les environnements locaux et cloud ?
  4. En utilisant executablePath et args avec des drapeaux compatibles avec le cloud comme --no-sandbox peut rendre votre configuration suffisamment flexible pour les deux environnements.
  5. Qu'est-ce que le --no-sandbox drapeau faire dans Marionnettiste?
  6. Le --no-sandbox L'indicateur désactive la sécurité sandbox de Chrome, ce qui permet à Puppeteer de s'exécuter sur des services cloud qui ne prennent pas en charge le sandboxing, mais il doit être utilisé avec prudence.
  7. Pourquoi ai-je besoin d'une coutume cacheDirectory pour le Marionnettiste ?
  8. Définir une coutume cacheDirectory garantit que Puppeteer télécharge les binaires Chrome vers un emplacement connu, ce qui peut éviter les erreurs lors du déploiement, en particulier dans les environnements sans serveur.
  9. Quel est le but du networkidle2 possibilité dans le goto méthode?
  10. Le networkidle2 L'option attend qu'il n'y ait pas plus de deux connexions réseau actives. Ceci est utile pour capturer une page entièrement chargée et gérer le contenu dynamique.
  11. Puppeteer peut-il fonctionner sans une version spécifiée de Chrome ?
  12. Oui, mais il est recommandé de préciser executablePath et assurez-vous qu'une version compatible de Chrome est accessible pour des résultats cohérents dans les configurations cloud.
  13. Comment gérer le cache Puppeteer dans différents environnements ?
  14. Vous pouvez spécifier un universel cacheDirectory dans le .puppeteerrc.cjs fichier, permettant à Puppeteer de trouver des binaires Chrome sur des plates-formes telles que Vercel et Heroku.
  15. Est puppeteer-core différent de puppeteer?
  16. Oui, puppeteer-core exclut Chrome fourni pour réduire la taille, vous devrez donc spécifier un binaire Chrome. Le plein puppeteer Le package inclut automatiquement Chrome.
  17. Que dois-je faire si Puppeteer est lent dans les environnements cloud ?
  18. Optimisation viewport paramètres et désactivation des options inutiles comme devtools peut améliorer les performances dans des environnements aux ressources limitées.
  19. Puppeteer est-il compatible avec tous les fournisseurs de cloud ?
  20. Généralement oui, mais chaque fournisseur peut avoir des exigences uniques. Utiliser des paramètres adaptés au cloud tels que --no-sandbox assure une meilleure compatibilité.

Réflexions finales sur la façon de faire fonctionner Puppeteer sur Vercel

Déployer avec succès Puppeteer sur Vercel nécessite de comprendre les besoins de configuration spécifiques de Chrome. Spécification options de lancement et la configuration correcte des chemins de cache de Puppeteer permet d'éviter l'erreur frustrante « Chrome introuvable ». Ces ajustements garantissent que Puppeteer fonctionne de manière fiable dans les environnements locaux et cloud. 🚀

Une fois que vous avez adapté ces solutions à votre projet, la capture de captures d'écran à partir des URL fournies par l'utilisateur devient transparente, permettant des applications Web plus dynamiques. Avec une configuration appropriée, Puppeteer reste un outil inestimable pour l'automatisation et le web scraping, même sur des plates-formes sans serveur comme Vercel.

Sources et références pour dépanner les erreurs du marionnettiste
  1. Cet article fait référence au guide de configuration officiel de Puppeteer pour les options de configuration détaillées et les étapes de dépannage, en particulier pour la gestion des chemins de cache Chrome et la spécification des chemins exécutables. Guide de configuration du marionnettiste
  2. La documentation Vercel donne un aperçu de la manière dont les environnements sans serveur gèrent les dépendances et des exigences uniques pour le déploiement d'applications qui s'appuient sur des navigateurs sans tête. Documentation Vercel
  3. Les discussions Stack Overflow proposent des solutions communautaires et des exemples pratiques de gestion des erreurs, couvrant les problèmes spécifiques de Puppeteer et Chrome rencontrés lors du déploiement. Débordement de pile