Tự động hóa trình duyệt với pupperteer

3 min read

1. Giới thiệu về Puppeteer

Puppeteer là một thư viện Node.js được phát triển bởi Google Chrome team, cung cấp API high-level để điều khiển trình duyệt Chrome hoặc Chromium thông qua DevTools Protocol. Nói một cách đơn giản, Puppeteer cho phép bạn tự động hóa các tác vụ trên trình duyệt thông qua code, có thể thực hiện mọi thao tác mà con người có thể làm trên web.

Tại sao Puppeteer lại quan trọng?

Trong thời đại số hóa hiện nay, việc tự động hóa các tác vụ trên web đã trở thành nhu cầu thiết yếu của nhiều doanh nghiệp và developer. Puppeteer ra đời như một giải pháp toàn diện, giúp:

  • Tự động hóa testing: Thay thế việc test thủ công bằng automated testing
  • Web scraping: Thu thập dữ liệu từ các trang web một cách tự động
  • Tạo PDF và screenshot: Chuyển đổi trang web thành các định dạng khác
  • Performance monitoring: Theo dõi hiệu suất trang web
  • Tự động hóa workflow: Thực hiện các tác vụ lặp đi lặp lại

2. Các tính năng chính của Puppeteer

2.1 Điều khiển trình duyệt programmatically

javascript

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

  await page.goto('https://example.com');

  // Thực hiện các tác vụ

  await page.click('button#submit');

  await page.type('input[name="email"]', 'user@example.com');

  await browser.close();

})();

2.2 Chế độ headless và headed

  • Headless mode: Chạy trình duyệt trong nền, không có giao diện người dùng
  • Headed mode: Hiển thị trình duyệt như bình thường, tiện cho việc debug

javascript

// Headless mode (mặc định)

const browser = await puppeteer.launch();

// Headed mode

const browser = await puppeteer.launch({ headless: false });

2.3 Tương thích với DevTools Protocol

Puppeteer sử dụng DevTools Protocol, điều này có nghĩa là bạn có thể truy cập vào tất cả các tính năng mà Chrome DevTools cung cấp.

3. Công dụng và ứng dụng thực tế

3.1 Automated Testing

Puppeteer là công cụ mạnh mẽ cho end-to-end testing, cho phép mô phỏng hành vi người dùng thực tế: javascript

const puppeteer = require('puppeteer');

describe('Login functionality', () => {

  let browser;

  let page;

  beforeAll(async () => {

    browser = await puppeteer.launch();

    page = await browser.newPage();

  });

  afterAll(async () => {

    await browser.close();

  });

  test('should login successfully', async () => {

    await page.goto('https://yourapp.com/login');

    await page.type('#username', 'testuser');

    await page.type('#password', 'testpass');

    await page.click('#login-button');

    await page.waitForNavigation();

    expect(page.url()).toBe('https://yourapp.com/dashboard');

  });

});

3.2 Web Scraping

Puppeteer rất thuận tiện trong việc thu thập dữ liệu từ các trang web, đặc biệt là những trang sử dụng JavaScript:javascript

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

  await page.goto('https://news.ycombinator.com');

  // Scrape tin tức từ Hacker News

  const news = await page.evaluate(() => {

    const items = document.querySelectorAll('.athing');

    return Array.from(items).map(item => ({

      title: item.querySelector('.titleline > a').textContent,

      link: item.querySelector('.titleline > a').href,

      score: item.nextElementSibling.querySelector('.score')?.textContent || '0'

    }));

  });

  console.log(news);

  await browser.close();

})();

3.3 Tạo PDF và Screenshot

Một trong những tính năng được sử dụng nhiều nhất:

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

  await page.goto('https://example.com');

  // Tạo PDF

  await page.pdf({

    path: 'example.pdf',

    format: 'A4',

    printBackground: true

  });

  // Chụp screenshot

  await page.screenshot({

    path: 'example.png',

    fullPage: true

  });

  await browser.close();

})();

3.4 Performance Monitoring

Puppeteer có thể được sử dụng để theo dõi hiệu suất trang web

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

  // Bắt đầu tracing

  await page.tracing.start({ path: 'trace.json' });

  await page.goto('https://example.com');

  // Dừng tracing

  await page.tracing.stop();

  // Lấy metrics

  const metrics = await page.metrics();

  console.log('Performance metrics:', metrics);

  await browser.close();

})();

3.5 Tự động hóa form submission

const puppeteer = require('puppeteer');

(async () => {

  const browser = await puppeteer.launch();

  const page = await browser.newPage();

  await page.goto('https://example.com/contact');

  // Điền form

  await page.type('#name', 'John Doe');

  await page.type('#email', 'john@example.com');

  await page.type('#message', 'Hello from Puppeteer!');

  // Submit form

  await page.click('#submit');

  // Chờ response

  await page.waitForSelector('.success-message');

  await browser.close();

})();

4. Ưu điểm của Puppeteer

4.1 Được Google hỗ trợ

  • Phát triển bởi Google Chrome team
  • Cập nhật thường xuyên và bảo mật cao
  • Tương thích tốt với Chrome/Chromium

4.2 API trực quan và dễ sử dụng

  • Syntax đơn giản, dễ học
  • Documentation chi tiết
  • Hỗ trợ async/await

4.3 Hiệu suất cao

  • Chạy trên V8 engine
  • Hỗ trợ parallel execution
  • Tối ưu hóa cho automation

4.4 Tính năng phong phú

  • Hỗ trợ mobile emulation
  • Network interception
  • JavaScript coverage
  • Request/response monitoring

5. Nhược điểm và hạn chế

5.1 Chỉ hỗ trợ Chrome/Chromium

  • Không test được trên Firefox, Safari
  • Cần sử dụng thêm các công cụ khác cho cross-browser testing

5.2 Tiêu thụ tài nguyên

  • Sử dụng nhiều RAM và CPU
  • Không phù hợp cho các môi trường hạn chế tài nguyên

5.3 Phức tạp với dynamic content

  • Cần xử lý cẩn thận với SPA
  • Timing issues với async loading

https://pptr.dev

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *