# Ví dụ về tự động hóa (CDP)

Khi đại lý của bạn đã bắt đầu hồ sơ MoreLogin thông qua Kỹ năng, đại lý sẽ nhận được `debugPort`. Bạn có thể sử dụng cổng này để kết nối trực tiếp với phiên bản trình duyệt bằng cách sử dụng **CDP (Giao thức DevTools của Chrome)**, bỏ qua nhu cầu về WebDriver.

Bạn có thể hướng dẫn tác nhân Hermes hoặc OpenClaw của mình viết và thực thi các tập lệnh bằng các mẫu sau.

## 1. Kết nối với nghệ sĩ múa rối

```javascript
// Get debugPort from:
// openclaw morelogin browser status --env-id <envId>
const puppeteer = require('puppeteer-core');

async function main() {
  const browser = await puppeteer.connect({
    browserURL: 'http://127.0.0.1:9222', // replace 9222 with actual debugPort
    defaultViewport: null
  });

  const pages = await browser.pages();
  const page = pages[0];
  await page.goto('https://example.com');
  
  // Scrape data or perform actions
  const title = await page.title();
  console.log('Title:', title);
  
  // NOTE: Do not call browser.close() unless you want to destroy the MoreLogin process
  await browser.disconnect();
}
main();
```

## 2. Điền và gửi biểu mẫu

```javascript
const puppeteer = require('puppeteer-core');

async function main() {
  const browser = await puppeteer.connect({
    browserURL: 'http://127.0.0.1:<debugPort>'
  });
  
  const page = await browser.newPage();
  await page.goto('https://example.com/login');
  
  // Fill form
  await page.type('#username', 'myuser');
  await page.type('#password', 'mypassword');
  
  // Click submit
  await page.click('button[type="submit"]');
  
  // Wait for navigation
  await page.waitForNavigation();
  
  // Verify login
  const isLoggedIn = await page.$('.user-profile');
  console.log('Login successful:', !!isLoggedIn);
  
  await browser.disconnect();
}
main();
```

## 3. Quét dữ liệu

```javascript
const puppeteer = require('puppeteer-core');
const fs = require('fs');

async function main() {
  const browser = await puppeteer.connect({
    browserURL: 'http://127.0.0.1:<debugPort>'
  });
  
  const page = await browser.newPage();
  await page.goto('https://example.com/products');
  
  // Scrape data
  const products = await page.evaluate(() => {
    return Array.from(document.querySelectorAll('.product')).map(el => ({
      name: el.querySelector('.name')?.textContent,
      price: el.querySelector('.price')?.textContent,
      url: el.querySelector('a')?.href
    }));
  });
  
  // Save to file
  fs.writeFileSync('products.json', JSON.stringify(products, null, 2));
  console.log(`Scraped ${products.length} products`);
  
  await browser.disconnect();
}
main();
```

## 4. Thao tác nhiều tab

```javascript
const puppeteer = require('puppeteer-core');

async function main() {
  const browser = await puppeteer.connect({
    browserURL: 'http://127.0.0.1:<debugPort>'
  });
  
  // Open multiple tabs
  const page1 = await browser.newPage();
  const page2 = await browser.newPage();
  
  await page1.goto('https://example.com');
  await page2.goto('https://github.com');
  
  // Parallel operations
  await Promise.all([
    page1.screenshot({ path: 'page1.png' }),
    page2.screenshot({ path: 'page2.png' })
  ]);
  
  console.log('Screenshots completed');
  
  await browser.disconnect();
}
main();
```

## Khắc phục sự cố

- **Lỗi: `connect ECONNREFUSED`**: Đảm bảo cấu hình đang chạy và `debugPort` chính xác. Bạn có thể xác minh cổng bằng `lsof -i :<port>`.
- **Sự cố trình duyệt khi kết nối**: Sử dụng `puppeteer-core` thay vì `puppeteer` và đảm bảo bạn gọi `browser.disconnect()` thay vì `browser.close()` khi tập lệnh của bạn kết thúc.