Reparieren des Puppeteer Chrome-Fehlers „Chrome konnte nicht gefunden werden (Version 130.0.6723.116)“ bei der Vercel-Bereitstellung

Temp mail SuperHeros
Reparieren des Puppeteer Chrome-Fehlers „Chrome konnte nicht gefunden werden (Version 130.0.6723.116)“ bei der Vercel-Bereitstellung
Reparieren des Puppeteer Chrome-Fehlers „Chrome konnte nicht gefunden werden (Version 130.0.6723.116)“ bei der Vercel-Bereitstellung

Warum Ihre Puppeteer-Bereitstellung auf Vercel fehlschlägt (und wie Sie das Problem beheben können)

Die Ausführung eines Web-Scraping- oder Screenshot-Tools in einem lokalen Setup verläuft normalerweise reibungslos – bis es Zeit für die Bereitstellung ist. Ich hatte kürzlich genau dieses Problem, als ich versuchte, mein zu starten Puppenspieler Skript an Vercel. 🚀 Während auf meinem lokalen Rechner alles perfekt lief, gab die Vercel-Bereitstellung immer wieder einen Fehler zurück: „Chrome (Version 130.0.6723.116) konnte nicht gefunden werden“.

Dieser Fehler kann frustrierend sein, insbesondere weil er bei lokalen Tests nicht auftritt. Das Problem deutet typischerweise auf eine fehlende Browserversion in der bereitgestellten Umgebung oder eine Fehlkonfiguration des Browsers hin Cache-Pfad den Puppenspieler auf Vercel verwendet.

Vercel enthält standardmäßig nicht immer die spezifische ausführbare Chrome-Datei, die Puppeteer benötigt, was bedeutet, dass Ihr Skript sie zur Laufzeit möglicherweise nicht findet. In diesem Leitfaden erfahren Sie, warum dieser Fehler auftritt und welche Strategien zu seiner Behebung gelten.

Unabhängig davon, ob Sie als Entwickler neu bei Puppeteer sind oder nur Fehler in Ihrer Bereitstellung beheben möchten, kann Ihnen das Verständnis dieser Nuancen stundenlanges Debuggen ersparen. 🛠️ Lassen Sie uns in die Lösung eintauchen und Ihr Puppeteer-Setup reibungslos auf Vercel zum Laufen bringen.

Befehl Anwendungsbeispiel und detaillierte Beschreibung
puppeteer.launch({ ... }) Dieser Befehl startet eine Instanz von Puppeteer mit spezifischen Konfigurationsoptionen wie „ignoreHTTPSErrors“ und „executablePath“. Diese Optionen helfen bei der Behebung von Fehlern bei Chrome-Versionen auf Bereitstellungsplattformen wie Vercel, indem sie den genauen Speicherort der ausführbaren Chrome-Datei festlegen und Sicherheitseinstellungen verwalten.
executablePath ExecutablePath wird in puppeteer.launch verwendet und gibt den Pfad zur Chrome-Binärdatei an. Durch die Festlegung dieses Pfads wird sichergestellt, dass Puppeteer auf Remote-Servern die richtige Chrome-Version verwendet. Dies ist in serverlosen Umgebungen wie Vercel, in denen Chrome möglicherweise nicht standardmäßig installiert ist, von entscheidender Bedeutung.
args: ['--no-sandbox', '--disable-setuid-sandbox'] Diese Flags deaktivieren die Sandbox-Funktion von Chrome, die für die Ausführung von Puppeteer auf vielen Cloud-Hosting-Anbietern erforderlich ist. Sandboxing ist normalerweise deaktiviert, um Berechtigungsfehler auf gemeinsam genutzten Servern zu vermeiden, sollte jedoch aus Sicherheitsgründen sorgfältig durchgeführt werden.
cacheDirectory In der Konfigurationsdatei von Puppeteer legt „cacheDirectory“ ein benutzerdefiniertes Verzeichnis für das Browser-Caching fest. Dies ist besonders hilfreich auf Vercel, da Sie so steuern können, wo Puppeteer heruntergeladene Chrome-Binärdateien speichert, und so Cache-bezogene Fehler verhindern.
await page.goto(url, { waitUntil: 'networkidle2' }) Dieser Befehl lädt die URL und wartet, bis nicht mehr als zwei Netzwerkverbindungen vorhanden sind, damit die Seite als vollständig geladen gilt. Die Option „networkidle2“ stellt sicher, dass alle Ressourcen geladen wurden, bevor ein Screenshot erstellt wird, was sie ideal für die Erfassung komplexer Seiten macht.
page.setViewport({ width: 1920, height: 1080 }) Legt die Ansichtsfensterabmessungen der Chrome-Instanz fest und simuliert einen Bildschirm mit der angegebenen Größe. Dies ist für Screenshots und visuelle Tests unerlässlich, da es das Erscheinungsbild der erfassten Webseite steuert.
path.join(__dirname, '..', 'public', fileName) Dieser Befehl erstellt einen Dateipfad, indem er das aktuelle Verzeichnis mit dem öffentlichen Ordner verknüpft und so ein bestimmtes Verzeichnis zum Speichern von Screenshots erstellt. Dies ist für die Organisation von Ausgabedateien unerlässlich, insbesondere wenn der Screenshot-Pfad zurück an den Client bereitgestellt wird.
uuid() Erzeugt eine eindeutige Kennung für jeden Screenshot, um sicherzustellen, dass jeder Dateiname eindeutig ist und Überschreibungen vermieden werden. Diese Funktion ist besonders nützlich für Anwendungen, die mehrere Bilder oder Datendateien gleichzeitig speichern.
chai.request(app) Als Teil des Chai-HTTP-Moduls sendet dieser Befehl eine Anfrage an den Anwendungsserver (definiert als App), um Endpunktantworten zu testen. Dies ist für automatisierte Tests nützlich, sodass Entwickler überprüfen können, ob die Screenshot-API wie erwartet funktioniert.
describe() and it() Diese Mocha-Testfunktionen definieren Testsuiten (describe()) und einzelne Tests (it()) zur Validierung der Funktionalität. Sie werden verwendet, um zu bestätigen, dass sich jeder Aspekt der Puppeteer-Screenshot-API unter verschiedenen Bedingungen korrekt verhält, von fehlenden Parametern bis hin zu gültigen URLs.

Überwindung des Chrome-Fehlers von Puppeteer bei der Vercel-Bereitstellung

Das bereitgestellte primäre Skript ist eine Backend-Funktion, die verwendet Puppenspieler um einen Screenshot einer vom Benutzer bereitgestellten URL zu erfassen. Diese Aufgabe ist besonders nützlich für die dynamische Generierung von Vorschauen oder für Web-Scraping-Zwecke. Allerdings ist die Bereitstellung auf Plattformen wie Vercel kann zu Fehlern führen, z. B. dass Chrome nicht in der Umgebung gefunden wird. Dies liegt daran, dass bei Vercel Chrome nicht am erwarteten Speicherort vorinstalliert ist. Das bedeutet, dass Puppeteer so konfiguriert werden muss, dass die richtige Version gefunden und installiert wird. In unserem Beispiel haben wir Optionen implementiert, um den ausführbaren Pfad von Puppeteer zu einer benutzerdefinierten Chrome-Binärdatei anzugeben und SSL-Probleme mit dem Flag „ignoreHTTPSErrors“ zu behandeln, um sicherzustellen, dass das Setup in allen Umgebungen funktioniert.

Das Skript beginnt mit der Definition der Screenshot-Funktion, die eine URL aus der Anfrage übernimmt. Wenn die URL fehlt, wird eine JSON-Fehlerantwort zurückgesendet, aber falls angegeben, wird Puppeteer mit den erforderlichen Konfigurationen wie der initialisiert ausführbarer Pfad Und args Optionen. Der ausführbarer Pfad ist hier unerlässlich, da es Puppeteer zum genauen Chrome-Speicherort leitet und so den Fehler „Chrome konnte nicht gefunden werden“ auf Vercel behebt. Darüber hinaus ist die args Optionen, insbesondere Keine Sandbox Und Disable-Setuid-Sandbox, deaktivieren Sie die Sandbox-Funktion von Chrome, eine Voraussetzung für bestimmte serverlose Umgebungen. Diese Einstellungen stellen sicher, dass das Skript ausgeführt werden kann, ohne dass Berechtigungsprobleme in der verwalteten Infrastruktur von Vercel auftreten.

Sobald Puppeteer startet, öffnet das Skript eine neue Browserseite und verwendet gehe zu mit dem Netzwerkidle2 Option. Dies weist Puppeteer an, zu warten, bis die Seite vollständig geladen ist und nicht mehr als zwei laufende Netzwerkanfragen enthält. Dadurch wird sichergestellt, dass selbst komplexe Seiten vollständig gerendert werden, bevor ein Screenshot erstellt wird. Dieser Schritt ist für die Erstellung eines zuverlässigen und genauen Screenshots von entscheidender Bedeutung, insbesondere beim Umgang mit modernen Webseiten, die häufig stark auf asynchrones Laden angewiesen sind. Die Größe des Ansichtsfensters wird dann auf 1920 x 1080 eingestellt, wodurch ein Full-HD-Bildschirm simuliert wird. Dadurch wird gewährleistet, dass der erfasste Inhalt das Layout widerspiegelt, das die meisten Benutzer auf einem Desktop-Gerät sehen würden.

Schließlich generiert das Skript mithilfe von einen eindeutigen Dateinamen uuid Bibliothek, die den Screenshot in einem öffentlichen Verzeichnis speichert, wo er abgerufen und als JSON-Antwort an den Benutzer zurückgegeben werden kann. Durch die sorgfältige Strukturierung der Dateipfade mit Node’s path.join Mit dieser Methode vermeidet das Skript Dateipfadprobleme, die aufgrund unterschiedlicher Umgebungseinstellungen auftreten können. Während diese Struktur beispielsweise nahtlos auf einem lokalen Computer läuft, funktionieren dieselben Pfade möglicherweise nicht auf Vercel. Daher ist es wichtig, jeden Dateipfad modular und anpassbar zu definieren. Letztendlich stellt dieses Setup sicher, dass die Puppeteer-Funktion sowohl in lokalen als auch in serverlosen Umgebungen reibungslos funktioniert und alle wichtigen Aspekte wie Seitenladen, Fehlerbehandlung und Umgebungseinschränkungen berücksichtigt. 🖥️

Lösung 1: Puppeteer für die korrekte Installation von Chrome auf Vercel konfigurieren

Diese Node.js-basierte Backend-Lösung konfiguriert den Cache-Pfad und die Installationsbefehle von Puppeteer, um sicherzustellen, dass Chrome korrekt installiert wird.

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;

Lösung 2: Benutzerdefinierte Puppeteer-Konfiguration für Vercel mit einer .puppeteerrc.cjs-Datei

Diese Lösung passt die Konfigurationsdatei von Puppeteer (.puppeteerrc.cjs) an, um den Chrome-Cache-Pfad anzugeben und die Kompatibilität mit der Dateistruktur von Vercel sicherzustellen.

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'],
};

Lösung 3: Umgebungsvariablen und Skripte in package.json für Puppeteer implementieren

Dieser Ansatz verändert die package.json Datei, um bestimmte Chrome-Binärdateien zu installieren und Puppeteer-Konfigurationen während der Bereitstellung automatisch einzurichten.

// 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";

Unit-Test für die Screenshot-Funktionalität von Puppeteer

Dieses Node.js Mocha-Testskript überprüft die Fähigkeit von Puppeteer, einen Screenshot von einer URL in verschiedenen Umgebungen zu erfassen.

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();
            });
    });
});

Optimierung von Puppeteer für Cloud-Umgebungen

Bei der Bereitstellung von Puppeteer-basierten Anwendungen auf Cloud-Plattformen wie Vercel oder HerokuDaher ist es wichtig, die Grenzen dieser Umgebungen zu verstehen. Im Gegensatz zu lokalen Setups basieren Cloud-Umgebungen normalerweise auf verwalteten oder serverlosen Architekturen, was bedeutet, dass Abhängigkeiten wie Chrome nicht immer ohne weiteres verfügbar sind. Tatsächlich, Puppenspieler launch Die Methode schlägt möglicherweise fehl, wenn die erforderliche Chrome-Version nicht auf dem Server installiert ist, was zu Fehlern wie „Chrome konnte nicht gefunden werden“ führt. Eine gute Vorgehensweise besteht darin, den ausführbaren Pfad von Chrome mit anzugeben executablePath, da dadurch sichergestellt wird, dass Puppeteer Chrome in jeder Umgebung effektiv finden und starten kann.

Darüber hinaus ist das Hinzufügen notwendiger Startargumente für die Kompatibilität von entscheidender Bedeutung. Flaggen wie z --no-sandbox Und --disable-setuid-sandbox sind besonders hilfreich. Während diese Flags einige Sicherheitsfunktionen von Chrome deaktivieren, sind sie häufig für serverlose Setups erforderlich, bei denen das Sandboxing von Chrome nicht unterstützt wird. Darüber hinaus können Sie mithilfe von Puppeteer ein benutzerdefiniertes Cache-Verzeichnis angeben cacheDirectory Diese Option hilft, potenzielle Cache-Probleme zu vermeiden, insbesondere wenn mehrere Browserversionen beteiligt sind. Zum Beispiel Einstellung cacheDirectory in ein bekanntes Verzeichnis stellt sicher, dass alle Abhängigkeiten zur Laufzeit verfügbar sind.

Zuletzt die Optimierung goto Diese Methode kann die Leistung erheblich verbessern. Durch die Verwendung der waitUntil: 'networkidle2' Mit dieser Option wartet das Skript, bis die Seite vollständig geladen ist. Dies ist wichtig für Umgebungen, in denen die Internetgeschwindigkeit oder die Ressourcenauslastung schwankt. Dies ist besonders vorteilhaft für die Aufnahme präziser Screenshots in dynamischen Seiten oder Anwendungen, bei denen Inhalte asynchron geladen werden. Durch die Kombination dieser Techniken kann Puppeteer nahtlos auf Cloud-Plattformen funktionieren und bietet eine leistungsstarke Lösung für automatisierte Aufgaben in der Produktion. 🚀

Häufige Fragen zu Puppeteer und Cloud-Bereitstellungen

  1. Warum erhalte ich auf Cloud-Plattformen die Fehlermeldung „Chrome konnte nicht gefunden werden“?
  2. Diese Fehler treten häufig auf, weil Cloud-Plattformen standardmäßig nicht die vollständige Chrome-Binärdatei enthalten. Sie können dies beheben, indem Sie Folgendes angeben executablePath in Ihrem Puppeteer-Setup.
  3. Wie stelle ich sicher, dass Puppeteer sowohl in lokalen als auch in Cloud-Umgebungen funktioniert?
  4. Benutzen executablePath Und args mit Cloud-freundlichen Flaggen wie --no-sandbox kann Ihr Setup für beide Umgebungen flexibel genug gestalten.
  5. Was bedeutet das --no-sandbox Flagge in Puppeteer?
  6. Der --no-sandbox Flag deaktiviert die Sandbox-Sicherheit von Chrome, wodurch Puppeteer auf Cloud-Diensten ausgeführt werden kann, die Sandboxing nicht unterstützen. Es sollte jedoch mit Vorsicht verwendet werden.
  7. Warum brauche ich einen Brauch? cacheDirectory für Puppenspieler?
  8. Festlegen eines Benutzerdefinierts cacheDirectory stellt sicher, dass Puppeteer Chrome-Binärdateien an einen bekannten Speicherort herunterlädt, was Fehler während der Bereitstellung verhindern kann, insbesondere in serverlosen Umgebungen.
  9. Was ist der Zweck des networkidle2 Option in der goto Verfahren?
  10. Der networkidle2 Die Option wartet, bis nicht mehr als zwei aktive Netzwerkverbindungen vorhanden sind. Dies ist nützlich, um eine vollständig geladene Seite zu erfassen und dynamische Inhalte zu verarbeiten.
  11. Kann Puppeteer ohne eine bestimmte Chrome-Version funktionieren?
  12. Ja, aber es wird empfohlen, dies anzugeben executablePath und stellen Sie sicher, dass eine kompatible Chrome-Version verfügbar ist, um konsistente Ergebnisse in Cloud-Setups zu erzielen.
  13. Wie verwalte ich den Puppeteer-Cache in verschiedenen Umgebungen?
  14. Sie können ein Universal angeben cacheDirectory im .puppeteerrc.cjs Datei, die es Puppeteer ermöglicht, Chrome-Binärdateien auf Plattformen wie Vercel und Heroku zu finden.
  15. Ist puppeteer-core anders als puppeteer?
  16. Ja, puppeteer-core schließt gebündeltes Chrome aus, um die Größe zu reduzieren, daher müssen Sie eine Chrome-Binärdatei angeben. Das volle puppeteer Das Paket enthält automatisch Chrome.
  17. Was soll ich tun, wenn Puppeteer in Cloud-Umgebungen langsam ist?
  18. Optimieren viewport Einstellungen und Deaktivierung nicht benötigter Optionen wie devtools kann die Leistung in Umgebungen mit eingeschränkten Ressourcen verbessern.
  19. Ist Puppeteer mit allen Cloud-Anbietern kompatibel?
  20. Im Allgemeinen ja, aber jeder Anbieter kann individuelle Anforderungen haben. Verwenden Sie cloudfreundliche Einstellungen wie --no-sandbox sorgt für eine bessere Kompatibilität.

Abschließende Gedanken dazu, wie man Puppeteer auf Vercel zum Laufen bringt

Für die erfolgreiche Bereitstellung von Puppeteer auf Vercel ist es erforderlich, die spezifischen Einrichtungsanforderungen für Chrome zu verstehen. Spezifizieren Startoptionen und die korrekte Konfiguration der Cache-Pfade von Puppeteer trägt dazu bei, den frustrierenden Fehler „Chrome konnte nicht gefunden werden“ zu vermeiden. Diese Anpassungen stellen sicher, dass Puppeteer sowohl in lokalen als auch in Cloud-Umgebungen zuverlässig funktioniert. 🚀

Sobald Sie diese Lösungen an Ihr Projekt anpassen, wird die Erfassung von Screenshots von vom Benutzer bereitgestellten URLs nahtlos und ermöglicht dynamischere Webanwendungen. Bei richtiger Einrichtung bleibt Puppeteer ein unschätzbar wertvolles Werkzeug für Automatisierung und Web-Scraping, selbst auf serverlosen Plattformen wie Vercel.

Quellen und Referenzen zur Fehlerbehebung bei Puppeteer-Fehlern
  1. Dieser Artikel verweist auf das offizielle Puppeteer-Konfigurationshandbuch für detaillierte Einrichtungsoptionen und Fehlerbehebungsschritte, insbesondere für die Handhabung von Chrome-Cache-Pfaden und die Angabe ausführbarer Pfade. Puppeteer-Konfigurationshandbuch
  2. Die Vercel-Dokumentation bietet Einblicke in den Umgang serverloser Umgebungen mit Abhängigkeiten und die besonderen Anforderungen für die Bereitstellung von Anwendungen, die auf Headless-Browsern basieren. Vercel-Dokumentation
  3. Die Stack Overflow-Diskussionen bieten Community-basierte Lösungen und praktische Beispiele für die Fehlerbehandlung und decken spezifische Puppeteer- und Chrome-Probleme ab, die während der Bereitstellung auftreten. Stapelüberlauf