A "Nem található Chrome (ver. 130.0.6723.116)" Puppeteer Chrome hiba javítása a Vercel telepítéskor

Temp mail SuperHeros
A Nem található Chrome (ver. 130.0.6723.116) Puppeteer Chrome hiba javítása a Vercel telepítéskor
A Nem található Chrome (ver. 130.0.6723.116) Puppeteer Chrome hiba javítása a Vercel telepítéskor

Miért nem sikerül a Puppeteer telepítése Vercelen (és hogyan javítható)

A webkaparó vagy képernyőképes eszköz futtatása helyi beállításokon általában zökkenőmentesen megy – egészen addig, amíg el nem jön a telepítés ideje. Nemrég szembesültem ezzel a problémával, amikor megpróbáltam elindítani Bábjátékos forgatókönyv be Vercel. 🚀 Míg minden tökéletesen futott a helyi gépemen, a Vercel telepítés folyamatosan hibát adott vissza: "Nem található a Chrome (ver. 130.0.6723.116)".

Ez a hiba frusztráló lehet, különösen azért, mert a helyi tesztelés során nem jelenik meg. A probléma jellemzően a telepített környezetben hiányzó böngészőverzióra, vagy a hibás konfigurációra utal gyorsítótár elérési útja amit Puppeteer használ Vercelen.

A Vercel alapértelmezés szerint nem mindig tartalmazza azt a konkrét Chrome futtatható fájlt, amelyet a Puppeteer igényel, ami azt jelenti, hogy a szkript esetleg nem találja meg futás közben. Ez az útmutató végigvezeti Önt, miért fordul elő ez a hiba, és néhány stratégiát ismertet a megoldására.

Akár új fejlesztő a Puppeteerben, akár csak a telepítéssel kapcsolatos hibaelhárítást végzi, ezeknek az árnyalatoknak a megértésével órákig megspórolhatja a hibakeresést. 🛠️ Merüljünk el a megoldásban, és zökkenőmentesen működjön a Puppeteer beállítása Vercelen.

Parancs Használati példa és részletes leírás
puppeteer.launch({ ... }) Ez a parancs elindítja a Puppeteer egy példányát meghatározott konfigurációs beállításokkal, például ignoreHTTPSErrors és executablePath. Ezek a beállítások segítenek megoldani a Chrome-verziókkal kapcsolatos hibákat olyan telepítési platformokon, mint a Vercel, a Chrome futtatható fájl pontos helyének beállításával és a biztonsági beállítások kezelésével.
executablePath A puppeteer.launch fájlban használt executablePath a Chrome bináris fájl elérési útját adja meg. Ennek az elérési útnak a beállítása biztosítja, hogy a Puppeteer a megfelelő Chrome-verziót használja a távoli szervereken, ami elengedhetetlen olyan szerver nélküli környezetekben, mint a Vercel, ahol a Chrome alapértelmezés szerint nincs telepítve.
args: ['--no-sandbox', '--disable-setuid-sandbox'] Ezek a jelzők letiltják a Chrome sandbox funkcióját, amely szükséges ahhoz, hogy a Puppeteer számos felhőtárhely-szolgáltatónál futhasson. A homokozó általában le van tiltva, hogy elkerüljük a megosztott kiszolgálók engedélyezési hibáit, de biztonsági vonatkozások miatt óvatosan kell eljárni.
cacheDirectory A Puppeteer konfigurációs fájljában a cacheDirectory beállít egy egyéni könyvtárat a böngésző gyorsítótárazásához. Ez különösen a Vercelen hasznos, mivel lehetővé teszi annak szabályozását, hogy a Puppeteer hol tárolja a letöltött Chrome bináris fájlokat, megelőzve a gyorsítótárral kapcsolatos hibákat.
await page.goto(url, { waitUntil: 'networkidle2' }) Ez a parancs betölti az URL-t, és megvárja, amíg két hálózati kapcsolatnál nem lesz több, hogy az oldal teljesen betöltettnek minősüljön. A networkidle2 opció biztosítja, hogy minden erőforrás betöltésre kerüljön a képernyőkép készítése előtt, így ideális összetett oldalak rögzítéséhez.
page.setViewport({ width: 1920, height: 1080 }) Beállítja a Chrome-példány nézetablakának méreteit, szimulálva a megadott méretű képernyőt. Ez elengedhetetlen a képernyőképekhez és a vizuális teszteléshez, mivel ez szabályozza a rögzített weboldal megjelenését.
path.join(__dirname, '..', 'public', fileName) Ez a parancs létrehozza a fájl elérési útját úgy, hogy az aktuális könyvtárat a nyilvános mappával összekapcsolja, és létrehoz egy speciális könyvtárat a képernyőképek tárolására. Ez elengedhetetlen a kimeneti fájlok rendszerezéséhez, különösen akkor, ha a képernyőkép elérési útját visszaküldi a klienshez.
uuid() Egyedi azonosítót generál minden képernyőképhez, biztosítva, hogy minden fájlnév egyedi legyen, és elkerülje a felülírást. Ez a funkció különösen hasznos olyan alkalmazásoknál, amelyek egyszerre több képet vagy adatfájlt tárolnak.
chai.request(app) A Chai HTTP modul része, ez a parancs kérést küld az alkalmazáskiszolgálónak (alkalmazásként definiálva), hogy tesztelje a végponti válaszokat. Ez hasznos az automatizált teszteléshez, így a fejlesztők ellenőrizhetik, hogy a képernyőkép API az elvárásoknak megfelelően működik-e.
describe() and it() Ezek a Mocha tesztelési függvények tesztcsomagokat (describe()) és egyedi teszteket (it()) határoznak meg a funkcionalitás érvényesítésére. A Puppeteer screenshot API minden egyes aspektusának ellenőrzésére szolgálnak, különböző feltételek mellett, a hiányzó paraméterektől az érvényes URL-ekig.

A Puppeteer Chrome-hibájának leküzdése a Vercel telepítéskor

A megadott elsődleges szkript egy háttérfüggvény, amely ezt használja Bábjátékos képernyőképet készíthet a felhasználó által megadott URL-ről. Ez a feladat különösen hasznos előnézetek dinamikus generálásához vagy webkaparás céljából. Azonban a telepítés olyan platformokra, mint a Vercel hibákhoz vezethet, például a Chrome nem található meg a környezetben. Ez azért történik, mert a Vercelben nincs előre telepített Chrome a várt helyre, ami azt jelenti, hogy a Puppeteer-t úgy kell konfigurálni, hogy megtalálja vagy telepítse a megfelelő verziót. Példánkban olyan beállításokat implementáltunk, amelyek megadják a Puppeteer végrehajtható elérési útját egy egyéni Chrome binárishoz, és kezeljük az SSL-problémákat az ignoreHTTPSErrors jelzővel, hogy megbizonyosodjunk arról, hogy a beállítás minden környezetben működik.

A szkript a képernyőkép funkció meghatározásával kezdődik, amely URL-t vesz a kérésből. Ha az URL hiányzik, akkor JSON hibaválaszt küld vissza, de ha megadja, inicializálja a Puppeteert a szükséges konfigurációkkal, például végrehajtható elérési út és args opciók. A végrehajtható elérési út itt elengedhetetlen, mert pontosan a Chrome helyére irányítja a Puppeteert, és megoldja a "Nem találom a Chrome-ot" hibát a Vercelen. Ezenkívül a args opciók, konkrétan homokozó nélküli és disable-setuid-sandbox, tiltsa le a Chrome sandbox funkcióját, amely bizonyos szerver nélküli környezetek esetén követelmény. Ezek a beállítások biztosítják, hogy a szkript anélkül tudjon futni, hogy a Vercel felügyelt infrastruktúráján engedélyproblémák lépnének fel.

Miután a Puppeteer elindul, a szkript megnyit egy új böngészőoldalt, és használja megy a networkidle2 opció. Ez arra utasítja a Puppeteert, hogy várja meg, amíg az oldal teljesen betöltődik, legfeljebb két folyamatos hálózati kéréssel, így biztosítva, hogy még az összetett oldalak is teljesen megjelenjenek, mielőtt képernyőképet készítene. Ez a lépés kulcsfontosságú a megbízható, pontos képernyőkép készítéséhez, különösen akkor, ha olyan modern weboldalakat kezel, amelyek gyakran nagymértékben támaszkodnak az aszinkron betöltésre. A nézetablak mérete ezután 1920x1080-ra van állítva, ami egy teljes HD képernyőt szimulál, ami garantálja, hogy a rögzített tartalom azt az elrendezést tükrözi, amelyet a legtöbb felhasználó látna egy asztali eszközön.

Végül a szkript létrehoz egy egyedi fájlnevet a uuid könyvtárban tárolja a képernyőképet egy nyilvános könyvtárban, ahol elérhető, és JSON-válaszként visszaküldhető a felhasználónak. A fájl elérési utak gondos strukturálásával a Node's segítségével út.csatlakozzon metódussal a szkript elkerüli a fájlútvonal-problémákat, amelyek a környezetbeállítások eltérései miatt merülhetnek fel. Például, míg ez a struktúra zökkenőmentesen fut egy helyi gépen, előfordulhat, hogy ugyanazok az elérési utak nem működnek a Vercelen, ezért kulcsfontosságú, hogy minden fájl elérési utat modulárisan és adaptálható módon határozzon meg. Végső soron ez a beállítás biztosítja, hogy a Puppeteer funkció zökkenőmentesen működjön mind a helyi, mind a kiszolgáló nélküli környezetben, és minden olyan kulcsfontosságú szempontot kezel, mint az oldalbetöltés, a hibakezelés és a környezeti korlátok. 🖥️

1. megoldás: A Puppeteer konfigurálása a Chrome megfelelő telepítéséhez a Vercelen

Ez a Node.js-alapú háttérmegoldás konfigurálja a Puppeteer gyorsítótárának elérési útját és a telepítési parancsokat, hogy biztosítsa a Chrome megfelelő telepítését.

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;

2. megoldás: Egyéni Puppeteer konfiguráció a Vercelhez .puppeteerrc.cjs fájllal

Ez a megoldás úgy módosítja a Puppeteer konfigurációs fájlját (.puppeteerrc.cjs), hogy megadja a Chrome gyorsítótár elérési útját, és biztosítsa a Vercel fájlstruktúrájával való kompatibilitást.

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

3. megoldás: Környezeti változók és szkriptek megvalósítása a package.json fájlban a Puppeteer számára

Ez a megközelítés módosítja a package.json fájlt bizonyos Chrome-binárisok telepítéséhez és a Puppeteer konfigurációk automatikus beállításához a telepítés során.

// 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 for Puppeteer Screenshot Funkcionalitás

Ez a Node.js Mocha tesztszkript igazolja, hogy a Puppeteer képes-e képernyőképet rögzíteni egy URL-ből különböző környezetekben.

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

A Puppeteer optimalizálása felhőkörnyezetekhez

Amikor a Puppeteer-alapú alkalmazásokat felhőplatformokra telepíti, mint pl Vercel vagy Heroku, elengedhetetlen ezen környezetek korlátainak megértése. A helyi beállításokkal ellentétben a felhőkörnyezetek általában felügyelt vagy kiszolgáló nélküli architektúrákon működnek, ami azt jelenti, hogy az olyan függőségek, mint a Chrome, nem mindig állnak rendelkezésre. Valójában a Puppeteer-é launch módszer meghiúsulhat, ha a szükséges Chrome-verzió nincs telepítve a szerverre, ami például „A Chrome nem található” hibaüzenetet eredményezhet. Jó gyakorlat a Chrome futtatható elérési útjának megadása executablePath, mivel ez biztosítja, hogy a Puppeteer bármilyen környezetben hatékonyan meg tudja találni és elindítani a Chrome-ot.

Ezen túlmenően a kompatibilitás szempontjából kulcsfontosságú a szükséges indítási argumentumok hozzáadása. A zászlók, mint pl --no-sandbox és --disable-setuid-sandbox különösen hasznosak. Bár ezek a jelzők letiltják a Chrome bizonyos biztonsági funkcióit, gyakran szükség van rájuk olyan szerver nélküli beállításokhoz, ahol a Chrome homokozó funkciója nem támogatott. Ezenkívül egyéni gyorsítótár-könyvtár megadása a Puppeteer's segítségével cacheDirectory opció segít megelőzni a lehetséges gyorsítótár-problémákat, különösen akkor, ha több böngészőverzió is érintett. Például beállítás cacheDirectory egy ismert könyvtárba, biztosítja, hogy minden függőség elérhető legyen futás közben.

Végül optimalizáljuk a goto módszer nagyban javíthatja a teljesítményt. Használatával a waitUntil: 'networkidle2' opciót, a szkript megvárja, amíg az oldal betöltése befejeződik, ami kulcsfontosságú olyan környezetekben, ahol az internet sebessége vagy az erőforrások betöltése változó. Ez különösen előnyös pontos képernyőképek készítéséhez dinamikus oldalakon vagy alkalmazásokban, ahol a tartalom aszinkron módon töltődik be. E technikák kombinációja lehetővé teszi, hogy a Puppeteer zökkenőmentesen működjön felhőplatformokon, és hatékony megoldást kínál az automatizált termelési feladatokhoz. 🚀

Gyakori kérdések a Puppeteer és a Cloud telepítésekkel kapcsolatban

  1. Miért kapok „A Chrome nem található” hibaüzenetet felhőplatformokon?
  2. Ezek a hibák gyakran azért fordulnak elő, mert a felhőplatformok alapértelmezés szerint nem tartalmazzák a teljes Chrome bináris fájlt. Ezt megadásával javíthatja executablePath a Puppeteer beállításában.
  3. Hogyan biztosíthatom, hogy a Puppeteer helyi és felhő környezetben is működjön?
  4. Használata executablePath és args felhőbarát zászlókkal, mint --no-sandbox elég rugalmassá teheti a beállítást mindkét környezethez.
  5. Mit jelent a --no-sandbox zászló csinálni a Puppeteerben?
  6. A --no-sandbox A jelző letiltja a Chrome sandbox-biztonságát, amely lehetővé teszi, hogy a Puppeteer olyan felhőszolgáltatásokon futhasson, amelyek nem támogatják a sandboxot, de óvatosan kell használni.
  7. Miért van szükségem szokásra cacheDirectory a Puppeteernek?
  8. Egyéni beállítás cacheDirectory biztosítja, hogy a Puppeteer letöltse a Chrome bináris fájljait egy ismert helyre, ami megakadályozhatja a hibákat a telepítés során, különösen szerver nélküli környezetben.
  9. Mi a célja a networkidle2 opció a goto módszer?
  10. A networkidle2 opció megvárja, amíg nem lesz több mint két aktív hálózati kapcsolat. Ez hasznos a teljesen betöltött oldal rögzítéséhez és a dinamikus tartalom kezeléséhez.
  11. Működhet a Puppeteer meghatározott Chrome-verzió nélkül?
  12. Igen, de ajánlatos megadni executablePath és gondoskodjon arról, hogy kompatibilis Chrome-verzió álljon rendelkezésre a felhőbeállítások konzisztens eredményéhez.
  13. Hogyan kezelhetem a Puppeteer gyorsítótárat a különböző környezetekben?
  14. Megadhat egy univerzálisat cacheDirectory a .puppeteerrc.cjs fájl, amely lehetővé teszi a Puppeteer számára, hogy megtalálja a Chrome bináris fájljait olyan platformokon, mint a Vercel és a Heroku.
  15. Is puppeteer-core különbözik attól puppeteer?
  16. Igen, puppeteer-core kizárja a csomagban lévő Chrome-ot a méret csökkentése érdekében, ezért meg kell adnia egy Chrome bináris fájlt. A teljes puppeteer csomag automatikusan tartalmazza a Chrome-ot.
  17. Mi a teendő, ha a Puppeteer lassú felhő környezetben?
  18. Optimalizálás viewport beállításokat és letiltja a szükségtelen opciókat, mint pl devtools javíthatja a teljesítményt az erőforrások korlátozott környezetében.
  19. A Puppeteer kompatibilis az összes felhőszolgáltatóval?
  20. Általában igen, de minden szolgáltatónak egyedi követelményei lehetnek. Felhőbarát beállítások használata, mint pl --no-sandbox jobb kompatibilitást biztosít.

Utolsó gondolatok a Puppeteer futtatásáról Vercelen

A Puppeteer Vercelen való sikeres telepítéséhez meg kell értenie a Chrome speciális beállítási igényeit. Meghatározása indítási lehetőségek és a Puppeteer gyorsítótár-útvonalainak helyes konfigurálása segít megelőzni a frusztráló „Nem található Chrome” hibaüzenetet. Ezek a beállítások biztosítják a Puppeteer megbízható működését helyi és felhőkörnyezetben egyaránt. 🚀

Ha ezeket a megoldásokat projektjéhez igazítja, a képernyőképek készítése a felhasználók által megadott URL-ekről zökkenőmentessé válik, ami dinamikusabb webalkalmazásokat tesz lehetővé. Megfelelő beállítással a Puppeteer továbbra is felbecsülhetetlen értékű eszköz marad az automatizálásban és a webkaparásban, még olyan szerver nélküli platformokon is, mint a Vercel.

Források és hivatkozások a bábos hibák elhárításához
  1. Ez a cikk a Puppeteer hivatalos konfigurációs útmutatójára hivatkozik a részletes beállítási lehetőségekről és hibaelhárítási lépésekről, különösen a Chrome gyorsítótár-útvonalak kezeléséről és a végrehajtható útvonalak meghatározásáról. Puppeteer konfigurációs útmutató
  2. A Vercel dokumentációja betekintést nyújt abba, hogy a kiszolgáló nélküli környezetek hogyan kezelik a függőségeket, valamint a fej nélküli böngészőkre támaszkodó alkalmazások telepítésének egyedi követelményeit. Vercel dokumentáció
  3. A Stack Overflow megbeszélések közösségvezérelt megoldásokat és gyakorlati példákat kínálnak a hibakezelésre, kitérve az üzembe helyezés során felmerült konkrét Puppeteer és Chrome problémákra. Stack Overflow