{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-@l10n/vi/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Ví dụ về tự động hóa (CDP)","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"ví-dụ-về-tự-động-hóa-cdp","__idx":0},"children":["Ví dụ về tự động hóa (CDP)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["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 ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["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 ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["CDP (Giao thức DevTools của Chrome)"]},", bỏ qua nhu cầu về WebDriver."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1-kết-nối-với-nghệ-sĩ-múa-rối","__idx":1},"children":["1. Kết nối với nghệ sĩ múa rối"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"// Get debugPort from:\n// openclaw morelogin browser status --env-id <envId>\nconst puppeteer = require('puppeteer-core');\n\nasync function main() {\n  const browser = await puppeteer.connect({\n    browserURL: 'http://127.0.0.1:9222', // replace 9222 with actual debugPort\n    defaultViewport: null\n  });\n\n  const pages = await browser.pages();\n  const page = pages[0];\n  await page.goto('https://example.com');\n  \n  // Scrape data or perform actions\n  const title = await page.title();\n  console.log('Title:', title);\n  \n  // NOTE: Do not call browser.close() unless you want to destroy the MoreLogin process\n  await browser.disconnect();\n}\nmain();\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2-điền-và-gửi-biểu-mẫu","__idx":2},"children":["2. Điền và gửi biểu mẫu"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const puppeteer = require('puppeteer-core');\n\nasync function main() {\n  const browser = await puppeteer.connect({\n    browserURL: 'http://127.0.0.1:<debugPort>'\n  });\n  \n  const page = await browser.newPage();\n  await page.goto('https://example.com/login');\n  \n  // Fill form\n  await page.type('#username', 'myuser');\n  await page.type('#password', 'mypassword');\n  \n  // Click submit\n  await page.click('button[type=\"submit\"]');\n  \n  // Wait for navigation\n  await page.waitForNavigation();\n  \n  // Verify login\n  const isLoggedIn = await page.$('.user-profile');\n  console.log('Login successful:', !!isLoggedIn);\n  \n  await browser.disconnect();\n}\nmain();\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"3-quét-dữ-liệu","__idx":3},"children":["3. Quét dữ liệu"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const puppeteer = require('puppeteer-core');\nconst fs = require('fs');\n\nasync function main() {\n  const browser = await puppeteer.connect({\n    browserURL: 'http://127.0.0.1:<debugPort>'\n  });\n  \n  const page = await browser.newPage();\n  await page.goto('https://example.com/products');\n  \n  // Scrape data\n  const products = await page.evaluate(() => {\n    return Array.from(document.querySelectorAll('.product')).map(el => ({\n      name: el.querySelector('.name')?.textContent,\n      price: el.querySelector('.price')?.textContent,\n      url: el.querySelector('a')?.href\n    }));\n  });\n  \n  // Save to file\n  fs.writeFileSync('products.json', JSON.stringify(products, null, 2));\n  console.log(`Scraped ${products.length} products`);\n  \n  await browser.disconnect();\n}\nmain();\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"4-thao-tác-nhiều-tab","__idx":4},"children":["4. Thao tác nhiều tab"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const puppeteer = require('puppeteer-core');\n\nasync function main() {\n  const browser = await puppeteer.connect({\n    browserURL: 'http://127.0.0.1:<debugPort>'\n  });\n  \n  // Open multiple tabs\n  const page1 = await browser.newPage();\n  const page2 = await browser.newPage();\n  \n  await page1.goto('https://example.com');\n  await page2.goto('https://github.com');\n  \n  // Parallel operations\n  await Promise.all([\n    page1.screenshot({ path: 'page1.png' }),\n    page2.screenshot({ path: 'page2.png' })\n  ]);\n  \n  console.log('Screenshots completed');\n  \n  await browser.disconnect();\n}\nmain();\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"khắc-phục-sự-cố","__idx":5},"children":["Khắc phục sự cố"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Lỗi: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["connect ECONNREFUSED"]}]},": Đảm bảo cấu hình đang chạy và ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]}," chính xác. Bạn có thể xác minh cổng bằng ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lsof -i :<port>"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sự cố trình duyệt khi kết nối"]},": Sử dụng ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["puppeteer-core"]}," thay vì ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["puppeteer"]}," và đảm bảo bạn gọi ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["browser.disconnect()"]}," thay vì ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["browser.close()"]}," khi tập lệnh của bạn kết thúc."]}]}]},"headings":[{"value":"Ví dụ về tự động hóa (CDP)","id":"ví-dụ-về-tự-động-hóa-cdp","depth":1},{"value":"1. Kết nối với nghệ sĩ múa rối","id":"1-kết-nối-với-nghệ-sĩ-múa-rối","depth":2},{"value":"2. Điền và gửi biểu mẫu","id":"2-điền-và-gửi-biểu-mẫu","depth":2},{"value":"3. Quét dữ liệu","id":"3-quét-dữ-liệu","depth":2},{"value":"4. Thao tác nhiều tab","id":"4-thao-tác-nhiều-tab","depth":2},{"value":"Khắc phục sự cố","id":"khắc-phục-sự-cố","depth":2}],"frontmatter":{"seo":{"title":"Ví dụ về tự động hóa (CDP)"}},"lastModified":"2026-06-10T11:47:34.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/vi/skills/automation","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}