$lang['tuto'] = "hướng dẫn"; ?> Sửa lỗi 'Không thể tìm thấy Chrome (ver.

Sửa lỗi 'Không thể tìm thấy Chrome (ver. 130.0.6723.116)' Lỗi Puppeteer Chrome khi triển khai Vercel

Temp mail SuperHeros
Sửa lỗi 'Không thể tìm thấy Chrome (ver. 130.0.6723.116)' Lỗi Puppeteer Chrome khi triển khai Vercel
Sửa lỗi 'Không thể tìm thấy Chrome (ver. 130.0.6723.116)' Lỗi Puppeteer Chrome khi triển khai Vercel

Tại sao việc triển khai Puppeteer của bạn không thành công trên Vercel (và cách khắc phục)

Việc chạy công cụ quét web hoặc chụp ảnh màn hình trên thiết lập cục bộ thường diễn ra suôn sẻ—cho đến lúc triển khai. Gần đây tôi đã gặp phải vấn đề chính xác này khi cố gắng khởi chạy Người múa rối kịch bản trên Vercel. 🚀 Trong khi mọi thứ chạy hoàn hảo trên máy cục bộ của tôi, quá trình triển khai Vercel liên tục báo lỗi: "Không thể tìm thấy Chrome (phiên bản 130.0.6723.116)".

Lỗi này có thể gây khó chịu, đặc biệt là vì nó không xuất hiện trong quá trình thử nghiệm cục bộ. Sự cố thường chỉ ra phiên bản trình duyệt bị thiếu trong môi trường được triển khai hoặc cấu hình sai của đường dẫn bộ đệm mà Puppeteer sử dụng trên Vercel.

Theo mặc định, Vercel không phải lúc nào cũng bao gồm tệp thực thi Chrome cụ thể mà Puppeteer yêu cầu, điều đó có nghĩa là tập lệnh của bạn có thể không tìm thấy nó trong thời gian chạy. Hướng dẫn này sẽ hướng dẫn bạn lý do tại sao lỗi này xảy ra và một số chiến lược để giải quyết lỗi đó.

Cho dù bạn là nhà phát triển mới làm quen với Puppeteer hay chỉ đang khắc phục sự cố khi triển khai, việc hiểu những sắc thái này có thể giúp bạn tiết kiệm hàng giờ gỡ lỗi. 🛠️ Hãy cùng tìm hiểu giải pháp và giúp thiết lập Puppeteer của bạn chạy liền mạch trên Vercel.

Yêu cầu Ví dụ về sử dụng và mô tả chi tiết
puppeteer.launch({ ... }) Lệnh này khởi chạy một phiên bản của Puppeteer với các tùy chọn cấu hình cụ thể như ignHTTPSErrors vàexecutablePath. Các tùy chọn này giúp giải quyết lỗi với các phiên bản Chrome trên nền tảng triển khai như Vercel bằng cách đặt vị trí chính xác của tệp thực thi Chrome và quản lý cài đặt bảo mật.
executablePath Được sử dụng trong con rối.launch,executablePath chỉ định đường dẫn đến tệp nhị phân Chrome. Việc đặt đường dẫn này đảm bảo Puppeteer sử dụng đúng phiên bản Chrome trên các máy chủ từ xa, điều này rất cần thiết trong các môi trường không có máy chủ như Vercel, nơi Chrome có thể không được cài đặt theo mặc định.
args: ['--no-sandbox', '--disable-setuid-sandbox'] Các cờ này vô hiệu hóa tính năng hộp cát của Chrome, tính năng này cần thiết để Puppeteer chạy trên nhiều nhà cung cấp dịch vụ lưu trữ đám mây. Hộp cát thường bị vô hiệu hóa để tránh lỗi cấp phép trên các máy chủ dùng chung nhưng cần được thực hiện cẩn thận do liên quan đến bảo mật.
cacheDirectory Trong tệp cấu hình của Puppeteer, cacheDirectory đặt một thư mục tùy chỉnh cho bộ nhớ đệm của trình duyệt. Điều này đặc biệt hữu ích trên Vercel, vì nó cho phép bạn kiểm soát nơi Puppeteer lưu trữ các tệp nhị phân Chrome đã tải xuống, ngăn ngừa các lỗi liên quan đến bộ đệm.
await page.goto(url, { waitUntil: 'networkidle2' }) Lệnh này tải URL và đợi cho đến khi không có nhiều hơn hai kết nối mạng để trang được coi là đã tải đầy đủ. Tùy chọn networkidle2 đảm bảo tất cả tài nguyên đã được tải trước khi chụp ảnh màn hình, lý tưởng cho việc chụp các trang phức tạp.
page.setViewport({ width: 1920, height: 1080 }) Đặt kích thước khung nhìn của phiên bản Chrome, mô phỏng màn hình có kích thước được chỉ định. Điều này rất cần thiết cho ảnh chụp màn hình và kiểm tra trực quan vì nó kiểm soát giao diện của trang web đã chụp.
path.join(__dirname, '..', 'public', fileName) Lệnh này xây dựng đường dẫn tệp bằng cách nối thư mục hiện tại với thư mục chung, tạo một thư mục cụ thể để lưu trữ ảnh chụp màn hình. Điều cần thiết là tổ chức các tệp đầu ra, đặc biệt là khi cung cấp đường dẫn ảnh chụp màn hình trở lại máy khách.
uuid() Tạo mã định danh duy nhất cho mỗi ảnh chụp màn hình, đảm bảo rằng mỗi tên tệp là duy nhất và tránh ghi đè. Chức năng này đặc biệt hữu ích cho các ứng dụng lưu trữ nhiều hình ảnh hoặc tệp dữ liệu cùng một lúc.
chai.request(app) Là một phần của mô-đun Chai HTTP, lệnh này sẽ gửi yêu cầu đến máy chủ ứng dụng (được xác định là ứng dụng) để kiểm tra phản hồi của điểm cuối. Điều này hữu ích cho việc kiểm tra tự động, cho phép nhà phát triển xác minh xem API ảnh chụp màn hình có hoạt động như mong đợi hay không.
describe() and it() Các chức năng kiểm tra Mocha này xác định các bộ kiểm tra (describe()) và các kiểm tra riêng lẻ (it()) để xác thực chức năng. Chúng được sử dụng để xác nhận từng khía cạnh của API ảnh chụp màn hình Puppeteer hoạt động chính xác trong nhiều điều kiện khác nhau, từ thiếu tham số đến URL hợp lệ.

Khắc phục lỗi Chrome của Puppeteer khi triển khai Vercel

Tập lệnh chính được cung cấp là một chức năng phụ trợ sử dụng Người múa rối để chụp ảnh màn hình của URL do người dùng cung cấp. Tác vụ này đặc biệt hữu ích để tạo các bản xem trước động hoặc cho mục đích quét web. Tuy nhiên, việc triển khai lên các nền tảng như Vercel có thể dẫn đến lỗi, chẳng hạn như không tìm thấy Chrome trong môi trường. Điều này xảy ra vì Vercel không được cài đặt sẵn Chrome ở vị trí dự kiến, nghĩa là Puppeteer phải được định cấu hình để định vị hoặc cài đặt đúng phiên bản. Trong ví dụ của chúng tôi, chúng tôi đã triển khai các tùy chọn để chỉ định đường dẫn thực thi của Puppeteer tới tệp nhị phân Chrome tùy chỉnh và xử lý các sự cố SSL bằng cờ ignHTTPSErrors để đảm bảo thiết lập hoạt động trên các môi trường.

Tập lệnh bắt đầu bằng cách xác định chức năng chụp màn hình lấy URL từ yêu cầu. Nếu URL bị thiếu, nó sẽ gửi lại phản hồi lỗi JSON, nhưng nếu được cung cấp, nó sẽ khởi tạo Puppeteer với các cấu hình cần thiết như đường dẫn thực thilập luận tùy chọn. các đường dẫn thực thi ở đây rất cần thiết vì nó hướng Puppeteer đến vị trí chính xác của Chrome, giải quyết lỗi "Không thể tìm thấy Chrome" trên Vercel. Ngoài ra, tranh luận các lựa chọn, cụ thể không có hộp cátvô hiệu hóa-setuid-sandbox, hãy tắt tính năng hộp cát của Chrome, một yêu cầu đối với một số môi trường không có máy chủ. Các cài đặt này đảm bảo tập lệnh có thể thực thi mà không gặp phải vấn đề về quyền trên cơ sở hạ tầng được quản lý của Vercel.

Khi Puppeteer khởi chạy, tập lệnh sẽ mở một trang trình duyệt mới và sử dụng đi tới với mạng không hoạt động2 lựa chọn. Điều này yêu cầu Puppeteer đợi cho đến khi trang được tải đầy đủ, không có nhiều hơn hai yêu cầu mạng đang diễn ra, đảm bảo rằng ngay cả các trang phức tạp cũng hiển thị đầy đủ trước khi chụp ảnh màn hình. Bước này rất quan trọng để chụp ảnh màn hình chính xác, đáng tin cậy, đặc biệt khi xử lý các trang web hiện đại thường phụ thuộc nhiều vào tải không đồng bộ. Sau đó, kích thước khung nhìn được đặt thành 1920x1080, mô phỏng màn hình full HD, đảm bảo rằng nội dung được chụp phản ánh bố cục mà hầu hết người dùng sẽ thấy trên thiết bị máy tính để bàn.

Cuối cùng, tập lệnh tạo một tên tệp duy nhất bằng cách sử dụng uuid thư viện, lưu trữ ảnh chụp màn hình trong một thư mục công cộng nơi nó có thể được truy cập và trả về cho người dùng dưới dạng phản hồi JSON. Bằng cách cấu trúc các đường dẫn tệp một cách cẩn thận với Node's đường dẫn.join phương pháp này, tập lệnh sẽ tránh các sự cố về đường dẫn tệp có thể phát sinh do sự khác biệt trong thiết lập môi trường. Ví dụ: mặc dù cấu trúc này chạy liền mạch trên máy cục bộ, nhưng các đường dẫn tương tự có thể không hoạt động trên Vercel, điều này khiến việc xác định từng đường dẫn tệp theo cách mô-đun và có thể thích ứng là rất quan trọng. Cuối cùng, thiết lập này đảm bảo rằng chức năng Puppeteer hoạt động trơn tru trên cả môi trường cục bộ và không có máy chủ, xử lý tất cả các khía cạnh chính như tải trang, xử lý lỗi và các hạn chế về môi trường. 🖥️

Giải pháp 1: Định cấu hình Puppeteer để cài đặt Chrome chính xác trên Vercel

Giải pháp phụ trợ dựa trên Node.js này định cấu hình các lệnh cài đặt và đường dẫn bộ đệm của Puppeteer để đảm bảo Chrome cài đặt chính xác.

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;

Giải pháp 2: Cấu hình Puppeteer tùy chỉnh cho Vercel bằng tệp .puppeteerrc.cjs

Giải pháp này điều chỉnh tệp cấu hình của Puppeteer (.puppeteerrc.cjs) để chỉ định đường dẫn bộ đệm của Chrome và đảm bảo khả năng tương thích với cấu trúc tệp của 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'],
};

Giải pháp 3: Triển khai các biến môi trường và tập lệnh trong pack.json cho Puppeteer

Cách tiếp cận này sửa đổi các gói.json để cài đặt các tệp nhị phân Chrome cụ thể và tự động thiết lập cấu hình Puppeteer trong quá trình triển khai.

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

Kiểm tra đơn vị cho chức năng chụp ảnh màn hình của Puppeteer

Tập lệnh kiểm tra Node.js Mocha này xác minh khả năng của Puppeteer trong việc chụp ảnh màn hình từ một URL trong nhiều môi trường khác nhau.

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

Tối ưu hóa Puppeteer cho môi trường đám mây

Khi triển khai các ứng dụng dựa trên Puppeteer lên nền tảng đám mây như Vercel hoặc Heroku, hiểu được những hạn chế của những môi trường này là điều cần thiết. Không giống như các thiết lập cục bộ, môi trường đám mây thường hoạt động trên kiến ​​trúc được quản lý hoặc không có máy chủ, điều đó có nghĩa là các phần phụ thuộc như Chrome không phải lúc nào cũng có sẵn. Trên thực tế, Puppeteer's launch phương pháp này có thể không thành công nếu phiên bản Chrome yêu cầu chưa được cài đặt trên máy chủ, dẫn đến các lỗi như “Không thể tìm thấy Chrome”. Một cách tốt là chỉ định đường dẫn thực thi của Chrome bằng cách sử dụng executablePath, vì điều này đảm bảo Puppeteer có thể định vị và khởi chạy Chrome một cách hiệu quả trên mọi môi trường.

Ngoài ra, việc thêm các đối số khởi chạy cần thiết là rất quan trọng để đảm bảo tính tương thích. Những lá cờ như --no-sandbox--disable-setuid-sandbox đặc biệt hữu ích. Mặc dù các cờ này vô hiệu hóa một số tính năng bảo mật của Chrome nhưng chúng thường cần thiết cho các thiết lập không có máy chủ nơi hộp cát của Chrome không được hỗ trợ. Hơn nữa, việc chỉ định thư mục bộ đệm tùy chỉnh bằng cách sử dụng Puppeteer's cacheDirectory tùy chọn này giúp ngăn chặn các sự cố tiềm ẩn về bộ đệm, đặc biệt khi có liên quan đến nhiều phiên bản trình duyệt. Ví dụ, thiết lập cacheDirectory vào một thư mục đã biết để đảm bảo tất cả các phần phụ thuộc đều có sẵn trong thời gian chạy.

Cuối cùng, tối ưu hóa goto phương pháp có thể cải thiện đáng kể hiệu suất. Bằng cách sử dụng waitUntil: 'networkidle2' tùy chọn, tập lệnh sẽ đợi trang tải xong, đây là điều quan trọng đối với các môi trường có tốc độ Internet hoặc tải tài nguyên khác nhau. Điều này đặc biệt có lợi cho việc chụp ảnh màn hình chính xác trong các trang động hoặc ứng dụng nơi nội dung tải không đồng bộ. Sự kết hợp của các kỹ thuật này cho phép Puppeteer hoạt động liền mạch trên nền tảng đám mây, cung cấp giải pháp mạnh mẽ cho các tác vụ tự động hóa trong sản xuất. 🚀

Các câu hỏi thường gặp về việc triển khai Puppeteer và Cloud

  1. Tại sao tôi gặp lỗi “Không thể tìm thấy Chrome” trên nền tảng đám mây?
  2. Những lỗi này thường xảy ra do nền tảng đám mây không bao gồm tệp nhị phân Chrome đầy đủ theo mặc định. Bạn có thể khắc phục điều này bằng cách chỉ định executablePath trong thiết lập Puppeteer của bạn.
  3. Làm cách nào để đảm bảo Puppeteer hoạt động trên cả môi trường cục bộ và đám mây?
  4. sử dụng executablePathargs với những lá cờ thân thiện với đám mây như --no-sandbox có thể làm cho thiết lập của bạn đủ linh hoạt cho cả hai môi trường.
  5. cái gì làm --no-sandbox cờ làm gì trong Puppeteer?
  6. các --no-sandbox cờ vô hiệu hóa bảo mật hộp cát của Chrome, cho phép Puppeteer chạy trên các dịch vụ đám mây không hỗ trợ hộp cát nhưng nên thận trọng khi sử dụng.
  7. Tại sao tôi cần một tùy chỉnh cacheDirectory cho Người múa rối?
  8. Thiết lập tùy chỉnh cacheDirectory đảm bảo rằng Puppeteer tải các tệp nhị phân của Chrome xuống một vị trí đã biết, điều này có thể ngăn ngừa lỗi trong quá trình triển khai, đặc biệt là trong môi trường không có máy chủ.
  9. Mục đích của việc này là gì networkidle2 tùy chọn trong goto phương pháp?
  10. các networkidle2 tùy chọn đợi cho đến khi không có nhiều hơn hai kết nối mạng đang hoạt động. Điều này rất hữu ích để chụp một trang được tải đầy đủ và xử lý nội dung động.
  11. Puppeteer có thể hoạt động mà không cần phiên bản Chrome được chỉ định không?
  12. Có, nhưng nên chỉ định executablePath và đảm bảo có thể truy cập được phiên bản Chrome tương thích để có kết quả nhất quán khi thiết lập đám mây.
  13. Làm cách nào để quản lý bộ đệm Puppeteer trên các môi trường khác nhau?
  14. Bạn có thể chỉ định một phổ quát cacheDirectory trong .puppeteerrc.cjs tệp, cho phép Puppeteer tìm các tệp nhị phân của Chrome trên các nền tảng như Vercel và Heroku.
  15. puppeteer-core khác với puppeteer?
  16. Đúng, puppeteer-core không bao gồm Chrome đi kèm để giảm kích thước, vì vậy bạn sẽ cần chỉ định tệp nhị phân Chrome. đầy đủ puppeteer gói bao gồm Chrome tự động.
  17. Tôi nên làm gì nếu Puppeteer hoạt động chậm trên môi trường đám mây?
  18. Tối ưu hóa viewport cài đặt và tắt các tùy chọn không cần thiết như devtools có thể cải thiện hiệu suất trong môi trường hạn chế về tài nguyên.
  19. Puppeteer có tương thích với tất cả các nhà cung cấp đám mây không?
  20. Nói chung là có, nhưng mỗi nhà cung cấp có thể có những yêu cầu riêng. Sử dụng cài đặt thân thiện với đám mây như --no-sandbox đảm bảo khả năng tương thích tốt hơn.

Suy nghĩ cuối cùng về việc bắt Puppeteer chạy trên Vercel

Việc triển khai thành công Puppeteer trên Vercel đòi hỏi phải hiểu rõ các nhu cầu thiết lập cụ thể cho Chrome. Chỉ định tùy chọn khởi chạy và định cấu hình chính xác đường dẫn bộ đệm của Puppeteer giúp ngăn chặn lỗi "Không thể tìm thấy Chrome" khó chịu. Những điều chỉnh này đảm bảo Puppeteer hoạt động đáng tin cậy trên cả môi trường cục bộ và đám mây. 🚀

Sau khi bạn điều chỉnh các giải pháp này cho phù hợp với dự án của mình, việc chụp ảnh màn hình từ các URL do người dùng cung cấp sẽ trở nên liền mạch, cho phép tạo ra các ứng dụng web động hơn. Với thiết lập phù hợp, Puppeteer vẫn là một công cụ vô giá để tự động hóa và quét web, ngay cả trên các nền tảng không có máy chủ như Vercel.

Các nguồn và tài liệu tham khảo để khắc phục lỗi của Puppeteer
  1. Bài viết này tham khảo hướng dẫn cấu hình Puppeteer chính thức để biết các tùy chọn thiết lập chi tiết và các bước khắc phục sự cố, đặc biệt là xử lý đường dẫn bộ nhớ đệm của Chrome và chỉ định đường dẫn thực thi. Hướng dẫn cấu hình múa rối
  2. Tài liệu Vercel cung cấp cái nhìn sâu sắc về cách môi trường không có máy chủ xử lý các phần phụ thuộc và các yêu cầu riêng để triển khai các ứng dụng dựa trên trình duyệt không có giao diện người dùng. Tài liệu Vercel
  3. Các cuộc thảo luận về Stack Overflow đưa ra các giải pháp dựa vào cộng đồng và các ví dụ thực tế về xử lý lỗi, bao gồm các vấn đề cụ thể về Puppeteer và Chrome gặp phải trong quá trình triển khai. tràn ngăn xếp