Cách giải quyết CAPTCHA trên BrowserStack với API CapSolver

Ethan Collins
Pattern Recognition Specialist
12-Sep-2025

BrowserStack là một nền tảng kiểm thử dựa trên đám mây hàng đầu được các nhà phát triển, nhóm QA và kỹ sư tự động hóa sử dụng rộng rãi để chạy tự động hóa web, kiểm thử trình duyệt và thu thập dữ liệu web quy mô lớn. Nó cung cấp quyền truy cập tức thì vào hàng nghìn trình duyệt, thiết bị và hệ điều hành thực, giúp việc kiểm thử đa trình duyệt, kiểm thử di động và tự động hóa bằng các công cụ như Selenium, Playwright và Puppeteer trở nên dễ dàng hơn nhiều.
Đối với các nhóm xây dựng trình duyệt tự động, bot hoặc công cụ thu thập dữ liệu quy mô lớn, BrowserStack loại bỏ nhu cầu duy trì cơ sở hạ tầng vật lý. Tuy nhiên, khi các bài kiểm tra hoặc trình thu thập dữ liệu tương tác với các trang web sản xuất sử dụng các biện pháp chống bot, CAPTCHA thường làm gián đoạn quy trình làm việc, gây ra lỗi hoặc yêu cầu can thiệp thủ công.
CapSolver là một dịch vụ giải quyết CAPTCHA dựa trên AI xử lý nhiều loại CAPTCHA, bao gồm reCAPTCHA và Cloudflare Turnstile, với độ chính xác và tốc độ cao. Việc tích hợp CapSolver với BrowserStack đảm bảo tự động hóa mượt mà hơn, giúp các đường dẫn CI/CD, bộ kiểm tra và tác vụ thu thập dữ liệu hiệu quả và đáng tin cậy.
Tổng quan và trường hợp sử dụng BrowserStack
BrowserStack là một nền tảng kiểm thử được tăng cường bằng AI, tái tạo vòng đời kiểm thử, cung cấp các giải pháp toàn diện cho việc kiểm thử trình duyệt và ứng dụng. Bằng cách tận dụng kho dữ liệu thống nhất và các tác nhân AI, nó giúp tăng tốc tự động hóa kiểm thử và cải thiện độ tin cậy ở quy mô lớn. Các nhóm có thể chạy các bài kiểm tra đa trình duyệt và di động trên các thiết bị thực, thực hiện kiểm tra UI và đầu cuối tự động bằng các khung như Selenium, Playwright, và Puppeteer, và bao gồm các kiểm tra trực quan và khả năng truy cập — tất cả đều được tích hợp với các công cụ CI/CD như Jenkins, Travis CI và GitLab.
Trong các quy trình làm việc tự động hóa nặng, chẳng hạn như kiểm thử đầu cuối thương mại điện tử hoặc xác thực luồng đăng nhập, CAPTCHA thường hoạt động như các biện pháp phòng thủ chống bot, làm gián đoạn các tập lệnh và giảm độ tin cậy. CapSolver cung cấp một giải pháp tự động, xử lý liền mạch các thách thức này để giữ cho các bài kiểm tra chạy trơn tru.
Tại sao cần giải quyết CAPTCHA
Trong quá trình kiểm thử tự động trên BrowserStack, các tập lệnh có thể điều hướng đến các trang web được bảo vệ bởi các hệ thống chống bot triển khai CAPTCHA để ngăn chặn truy cập theo tập lệnh. Những thách thức này—có mục đích xác minh người dùng—có thể gây ra lỗi kiểm tra, kết quả không ổn định hoặc cần phải ghi đè thủ công, làm suy yếu hiệu quả của các đường dẫn CI/CD. Ví dụ: việc kiểm tra gửi biểu mẫu trên một trang web có reCAPTCHA có thể thất bại nếu không có cách nào để giải quyết thách thức bằng lập trình.
Các loại CAPTCHA phổ biến bao gồm:
| Loại CAPTCHA | Mô tả |
|---|---|
| reCAPTCHA v2 | Yêu cầu người dùng chọn hộp hoặc chọn hình ảnh dựa trên lời nhắc. |
| reCAPTCHA v3 | Sử dụng hệ thống điểm để đánh giá hành vi của người dùng, thường vô hình đối với người dùng. |
| Cloudflare Turnstile | Một lựa chọn thay thế CAPTCHA tập trung vào quyền riêng tư giúp giảm thiểu sự tương tác của người dùng. |
Việc tích hợp CapSolver vào các bài kiểm tra BrowserStack cho phép các tập lệnh tự động giải quyết các CAPTCHA này một cách động, đảm bảo các bài kiểm tra chạy trơn tru trên nhiều môi trường khác nhau mà không bị gián đoạn.
Cách sử dụng CapSolver để xử lý CAPTCHA
API của CapSolver giải quyết CAPTCHA bằng cách gửi tác vụ và lấy giải pháp thông qua các yêu cầu HTTP đơn giản. Để tích hợp nó với BrowserStack, hãy kết hợp các cuộc gọi CapSolver vào các tập lệnh tự động hóa (ví dụ: Selenium, Playwright hoặc Puppeteer) chạy trên lưới từ xa của BrowserStack.
Các bước để tích hợp CapSolver với BrowserStack
- Đăng ký CapSolver: Đăng ký tại
CapSolver Dashboard, thêm tiền và lấy khóa API của bạn. - Thiết lập BrowserStack: Tạo tài khoản BrowserStack, lấy tên người dùng và khóa truy cập của bạn và cấu hình khung tự động hóa của bạn để kết nối với trung tâm của BrowserStack.
- Cài đặt các phụ thuộc: Tùy thuộc vào khung của bạn, hãy cài đặt các gói như
selenium,playwrighthoặcpyppeteer. - Thêm logic CapSolver: Trong tập lệnh của bạn, phát hiện CAPTCHA (ví dụ: bằng khóa trang web), tạo tác vụ CapSolver, kiểm tra giải pháp và tiêm nó vào trang.
- Chạy các bài kiểm tra trên BrowserStack: Thực thi các tập lệnh trên nhiều cấu hình BrowserStack (ví dụ: Windows/Chrome, macOS/Safari) để xác minh việc xử lý CAPTCHA trên nhiều nền tảng.
Đoạn mã chính
Dưới đây là một hàm Python cơ bản để giải quyết reCAPTCHA v2 bằng CapSolver:
python
import requests
import time
API_KEY = "YOUR_CAPSOLVER_API_KEY"
def solve_captcha(site_key, url):
# Tạo tác vụ Capsolver
create_task = {
"clientKey": API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyless",
"websiteURL": url,
"websiteKey": site_key,
}
}
resp = requests.post("https://api.capsolver.com/createTask", json=create_task)
task_id = resp.json().get("taskId")
if not task_id:
raise RuntimeError("Không thể tạo tác vụ CapSolver")
# Kiểm tra kết quả
while True:
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": API_KEY, "taskId": task_id}
)
payload = result.json()
if payload.get("status") == "ready":
return payload["solution"]["gRecaptchaResponse"]
time.sleep(2)
Ghi chú:
- Thay thế
YOUR_CAPSOLVER_API_KEYbằng khóa API thực tế của bạn. - Để giải quyết các loại CAPTCHA khác, hãy cập nhật trường
typetrong từ điểntask(ví dụ:ReCaptchaV2TaskProxyless).
Ví dụ mã hoàn chỉnh + Giải thích từng bước
Dưới đây là các ví dụ hoàn chỉnh để tích hợp CapSolver với BrowserStack bằng Selenium, Playwright và Puppeteer. Mỗi bài kiểm tra một trang web demo reCAPTCHA trên nhiều nền tảng.
Điều kiện tiên quyết
- Cài đặt các phụ thuộc:
bash
pip install selenium playwright pyppeteer requests python-dotenv
- Đối với Playwright/Puppeteer:
bash
playwright install
- Tạo tệp
.envvới các biến sau:
CAPSOLVER_API_KEY
BROWSERSTACK_USERNAME
BROWSERSTACK_ACCESS_KEY
Ví dụ Selenium
python
import time
import os
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from dotenv import load_dotenv
# Load biến môi trường
load_dotenv()
API_KEY = os.getenv("CAPSOLVER_API_KEY")
BROWSERSTACK_USERNAME = os.getenv("BROWSERSTACK_USERNAME")
BROWSERSTACK_ACCESS_KEY = os.getenv("BROWSERSTACK_ACCESS_KEY")
def solve_captcha(site_key, url):
"""Tạo tác vụ CapSolver và kiểm tra mã thông báo giải pháp."""
create_task = {
"clientKey": API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyless",
"websiteURL": url,
"websiteKey": site_key,
}
}
print(f"Tạo tác vụ với API_KEY: {API_KEY[:10]}...")
print(f"Khóa trang web: {site_key}")
print(f"URL: {url}")
resp = requests.post("https://api.capsolver.com/createTask", json=create_task)
print(f"Trạng thái phản hồi: {resp.status_code}")
print(f"Văn bản phản hồi: {resp.text}")
resp.raise_for_status()
task_id = resp.json().get("taskId")
if not task_id:
raise RuntimeError("Không thể tạo tác vụ CapSolver")
while True:
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": API_KEY, "taskId": task_id}
)
print(f"Trạng thái kết quả tác vụ: {result.status_code}")
print(f"Phản hồi kết quả tác vụ: {result.text}")
result.raise_for_status()
payload = result.json()
if payload.get("status") == "ready":
return payload["solution"]["gRecaptchaResponse"]
time.sleep(2)
def main():
if not BROWSERSTACK_USERNAME or not BROWSERSTACK_ACCESS_KEY:
raise SystemExit("Vui lòng đặt biến môi trường BROWSERSTACK_USERNAME và BROWSERSTACK_ACCESS_KEY")
# Khả năng BrowserStack
bstack_options = {
"os": "Windows",
"osVersion": "11",
"buildName": "Kiểm tra Capsolver",
"sessionName": "Giải quyết Captcha",
"local": "false",
"debug": "true",
"video": "true",
"networkLogs": "true",
}
options = Options()
options.set_capability("browserName", "Chrome")
options.set_capability("browserVersion", "latest")
options.set_capability("bstack:options", bstack_options)
hub_url = f"https://{BROWSERSTACK_USERNAME}:{BROWSERSTACK_ACCESS_KEY}@hub-cloud.browserstack.com/wd/hub"
driver = webdriver.Remote(command_executor=hub_url, options=options)
# In thông tin phiên để quan sát trực tiếp
print(f"ID phiên BrowserStack: {driver.session_id}")
print("Xem trực tiếp tại: https://automate.browserstack.com/dashboard/v2/builds")
try:
url = "https://www.google.com/recaptcha/api2/demo"
driver.get(url)
site_key = driver.find_element(By.CLASS_NAME, "g-recaptcha").get_attribute("data-sitekey")
token = solve_captcha(site_key, url)
# Làm cho vùng văn bản phản hồi hiển thị và đặt mã thông báo
driver.execute_script('document.getElementById("g-recaptcha-response").style.display = "block";')
driver.execute_script(f'document.getElementById("g-recaptcha-response").value = "{token}";')
driver.find_element(By.ID, "recaptcha-demo-submit").click()
time.sleep(3) # Chờ trang tải
# Kiểm tra trang sau khi gửi
print("=" * 50)
print("PHẢN HỒI TRANG SAU KHI GỬI:")
print("=" * 50)
print(f"URL hiện tại: {driver.current_url}")
print(f"Tiêu đề trang: {driver.title}")
page_source = driver.page_source
print(f"Độ dài nguồn trang: {len(page_source)} ký tự")
# Kiểm tra xem có chỉ báo thành công hay lỗi không
if any(word in page_source.lower() for word in ['success', 'verificado', 'genial', 'hooray']):
print("✅ Tìm thấy chỉ báo THÀNH CÔNG trong trang!")
if "error" in page_source.lower():
print("❌ Tìm thấy chỉ báo LỖI trong trang!")
if "captcha" in page_source.lower():
print("🔄 CAPTCHA vẫn còn trong trang")
# Xem trước 500 ký tự đầu tiên của văn bản nội dung
try:
body = driver.find_element(By.TAG_NAME, "body")
print(f"Xem trước văn bản nội dung:\n{body.text[:500]}")
except Exception:
print("Không thể trích xuất văn bản nội dung")
print("=" * 50)
time.sleep(2)
finally:
driver.quit()
if __name__ == "__main__":
main()
| Bước | Mô tả |
|---|---|
| 1. Load Dependencies and Env | Nhập thư viện và tải khóa API từ .env. |
| 2. Define solve_captcha | Tạo và kiểm tra tác vụ CapSolver để lấy mã thông báo giải pháp reCAPTCHA v2. |
| 3. Configure BrowserStack | Đặt khả năng cho WebDriver từ xa (ví dụ: Windows/Chrome). |
| 4. Navigate and Solve | Đi đến trang demo, trích xuất khóa trang web, giải quyết CAPTCHA, tiêm mã thông báo. |
| 5. Submit and Verify | Nhấp vào gửi, chờ và kiểm tra các chỉ báo thành công trong phản hồi. |
| 6. Clean Up | Thoát trình điều khiển để đóng phiên. |
Ví dụ Playwright (Async)
python
import time
import os
import requests
import asyncio
import json
from playwright.async_api import async_playwright
from dotenv import load_dotenv
# Load biến môi trường
load_dotenv()
API_KEY = os.getenv("CAPSOLVER_API_KEY")
BROWSERSTACK_USERNAME = os.getenv("BROWSERSTACK_USERNAME")
BROWSERSTACK_ACCESS_KEY = os.getenv("BROWSERSTACK_ACCESS_KEY")
def solve_captcha(site_key, url):
"""
Tạo tác vụ CapSolver và kiểm tra mã thông báo giải pháp.
Hoạt động giống như ví dụ Selenium.
"""
create_task = {
"clientKey": API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyless",
"websiteURL": url,
"websiteKey": site_key,
}
}
print(f"Tạo tác vụ với API_KEY: {API_KEY[:10]}...")
print(f"Khóa trang web: {site_key}")
print(f"URL: {url}")
resp = requests.post("https://api.capsolver.com/createTask", json=create_task)
print(f"Trạng thái phản hồi: {resp.status_code}")
print(f"Văn bản phản hồi: {resp.text}")
resp.raise_for_status()
task_id = resp.json().get("taskId")
if not task_id:
raise RuntimeError("Không thể tạo tác vụ CapSolver")
# Kiểm tra cho đến khi giải pháp sẵn sàng
while True:
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": API_KEY, "taskId": task_id}
)
result.raise_for_status()
payload = result.json()
if payload.get("status") == "ready":
return payload["solution"]["gRecaptchaResponse"]
time.sleep(2)
async def run_captcha_test(platform_config):
"""Chạy kiểm tra captcha trên cấu hình nền tảng cụ thể thông qua BrowserStack."""
print(f"\n🚀 Kiểm tra trên: {platform_config['name']}")
async with async_playwright() as playwright:
# Kết nối với BrowserStack bằng điểm cuối CDP
ws_endpoint = f"wss://cdp.browserstack.com/playwright?caps={platform_config['caps_string']}"
try:
browser = await playwright.chromium.connect_over_cdp(ws_endpoint)
context = await browser.new_context(viewport={'width': 1280, 'height': 720})
page = await context.new_page()
print(f"✅ Đã kết nối với BrowserStack")
print("🔗 Xem trực tiếp tại: https://automate.browserstack.com/dashboard/v2/builds")
# Điều hướng đến trang demo reCAPTCHA
url = "https://www.google.com/recaptcha/api2/demo"
await page.goto(url, wait_until="domcontentloaded", timeout=30000)
await page.wait_for_selector(".g-recaptcha", timeout=20000)
site_key = await page.get_attribute(".g-recaptcha", "data-sitekey")
print(f"🔑 Tìm thấy khóa trang web: {site_key}")
print("\n🧩 Giải quyết captcha bằng CapSolver...")
token = solve_captcha(site_key, url)
print(f"✅ Đã lấy mã thông báo captcha: {token[:50]}...")
# Tiêm mã thông báo và gửi biểu mẫu
await page.evaluate('document.getElementById("g-recaptcha-response").style.display = "block";')
await page.evaluate(f'document.getElementById("g-recaptcha-response").value = "{token}";')
await page.click("#recaptcha-demo-submit")
await page.wait_for_timeout(5000)
vi
#!/usr/bin/env python3
import time
import os
import requests
import asyncio
import json
import urllib.parse
from pyppeteer import connect
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
API_KEY = os.getenv("CAPSOLVER_API_KEY")
BROWSERSTACK_USERNAME = os.getenv("BROWSERSTACK_USERNAME")
BROWSERSTACK_ACCESS_KEY = os.getenv("BROWSERSTACK_ACCESS_KEY")
def solve_captcha(site_key, url):
"""
Create a CapSolver task and poll for a solution token.
"""
create_task = {
"clientKey": API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyless",
"websiteURL": url,
"websiteKey": site_key,
}
}
print(f"Creating task with API_KEY: {API_KEY[:10]}...")
print(f"Site key: {site_key}")
print(f"URL: {url}")
resp = requests.post("https://api.capsolver.com/createTask", json=create_task)
print(f"Response status: {resp.status_code}")
print(f"Response text: {resp.text}")
resp.raise_for_status()
task_id = resp.json().get("taskId")
if not task_id:
raise RuntimeError("Failed to create CapSolver task")
# Poll until solution is ready
while True:
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": API_KEY, "taskId": task_id}
)
print(f"Task result status: {result.status_code}")
print(f"Task result response: {result.text}")
result.raise_for_status()
payload = result.json()
if payload.get("status") == "ready":
return payload["solution"]["gRecaptchaResponse"]
time.sleep(2)
async def run_captcha_test(platform_config):
"""Run captcha test on a specific platform configuration."""
print(f"\n🚀 Testing on: {platform_config['name']}")
print(f"Platform details: {platform_config}")
try:
# Create BrowserStack WebSocket endpoint for Puppeteer
ws_endpoint = f"wss://cdp.browserstack.com/puppeteer?caps={platform_config['caps_string']}"
# Connect to BrowserStack using Puppeteer CDP
browser = await connect(
browserWSEndpoint=ws_endpoint,
ignoreHTTPSErrors=True,
args=['--no-sandbox', '--disable-setuid-sandbox']
)
# Create new page
page = await browser.newPage()
await page.setViewport({'width': 1280, 'height': 720})
print(f"✅ Connected to BrowserStack via Puppeteer")
print(f"🔗 Watch live at: https://automate.browserstack.com/dashboard/v2/builds")
# Navigate to reCAPTCHA demo
url = "https://www.google.com/recaptcha/api2/demo"
await page.goto(url, {'waitUntil': 'domcontentloaded', 'timeout': 30000})
print(f"📍 Navigated to: {url}")
# Wait for page to load and find site key
await page.waitForSelector(".g-recaptcha", {'timeout': 20000})
site_key_element = await page.querySelector(".g-recaptcha")
site_key = await page.evaluate('(element) => element.getAttribute("data-sitekey")', site_key_element)
print(f"🔑 Found site key: {site_key}")
# Solve captcha using CapSolver
print("\n🧩 Solving captcha with CapSolver...")
token = solve_captcha(site_key, url)
print(f"✅ Got captcha token: {token[:50]}...")
# Inject the captcha solution
print("\n💉 Injecting captcha solution...")
await page.evaluate('document.getElementById("g-recaptcha-response").style.display = "block";')
await page.evaluate(f'document.getElementById("g-recaptcha-response").value = "{token}";')
# Submit the form
print("📤 Submitting form...")
await page.click("#recaptcha-demo-submit")
# Wait for response
print("⏳ Waiting for response...")
await asyncio.sleep(5)
# Get results
current_url = page.url
page_title = await page.title()
body_text = await page.evaluate('() => document.body.textContent')
# Check for success indicators
success_indicators = ['success', 'verificado', 'genial', 'hooray']
is_success = any(word in body_text.lower() for word in success_indicators)
has_error = 'error' in body_text.lower()
has_captcha = 'captcha' in body_text.lower()
# Display results
print("\n" + "=" * 60)
print(f"🎯 RESULTS FOR {platform_config['name']}:")
print("=" * 60)
print(f"📍 Current URL: {current_url}")
print(f"📄 Page Title: {page_title}")
print(f"⏰ Timestamp: {time.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"🎉 Success: {'✅ YES' if is_success else '❌ NO'}")
if has_error:
print("❌ ERROR indicator found in page!")
if has_captcha:
print("🔄 CAPTCHA still present in page")
print(f"\n📝 Page Response Preview:")
print("-" * 40)
print(body_text[:500])
print("=" * 60)
if is_success:
print(f"\n🎊 SUCCESS! Captcha solved on {platform_config['name']}!")
else:
print(f"\n⚠️ Something went wrong on {platform_config['name']}.")
# Wait a bit to observe results
await asyncio.sleep(3)
# Mark test status in BrowserStack
try:
status = "passed" if is_success else "failed"
reason = f"Captcha solved successfully on {page_title}" if is_success else "Captcha solving failed"
await page.evaluate(f'''
browserstack_executor: {{
"action": "setSessionStatus",
"arguments": {{
"status": "{status}",
"reason": "{reason}"
}}
}}
''')
except Exception as e:
print(f"Warning: Could not set BrowserStack status: {e}")
return {'platform': platform_config['name'], 'success': is_success, 'url': current_url, 'title': page_title}
except Exception as e:
print(f"❌ Error on {platform_config['name']}: {str(e)}")
return {'platform': platform_config['name'], 'success': False, 'error': str(e)}
finally:
try:
if 'browser' in locals():
await browser.close()
except Exception as e:
print(f"Warning: Error closing browser: {e}")
pass
def create_browserstack_caps(platform):
"""Create BrowserStack capabilities for Puppeteer."""
caps = {
'browserstack.username': BROWSERSTACK_USERNAME,
'browserstack.accessKey': BROWSERSTACK_ACCESS_KEY,
'project': 'Puppeteer Capsolver Test',
'build': 'Captcha Solve Demo - Puppeteer',
'name': f"Captcha Test - {platform.get('browserName', 'chrome')} (Puppeteer)",
'browserstack.debug': 'true',
'browserstack.console': 'info',
'browserstack.networkLogs': 'true',
'browserstack.timezone': 'UTC'
}
# Add platform-specific capabilities
if 'os' in platform:
caps['os'] = platform['os']
caps['os_version'] = platform['osVersion']
caps['browser'] = platform['browserName']
caps['browser_version'] = platform['browserVersion']
elif 'deviceName' in platform:
caps['device'] = platform['deviceName']
caps['os_version'] = platform['osVersion']
caps['browser'] = platform['browserName']
caps['real_mobile'] = 'true'
# Convert to URL-encoded JSON string
caps_json = json.dumps(caps)
caps_string = urllib.parse.quote(caps_json)
return caps, caps_string
async def main():
"""Main function to run tests on multiple platforms."""
if not API_KEY or API_KEY == "YOUR_CAPSOLVER_API_KEY":
raise SystemExit("Please set CAPSOLVER_API_KEY environment variable")
# Define platforms to test
platforms = [
{'name': 'Windows 11 - Chrome (Puppeteer)', 'os': 'Windows', 'osVersion': '11', 'browserName': 'chrome', 'browserVersion': 'latest'},
{'name': 'macOS Ventura - Chrome (Puppeteer)', 'os': 'OS X', 'osVersion': 'Ventura', 'browserName': 'chrome', 'browserVersion': 'latest'},
{'name': 'Samsung Galaxy S23 Ultra - Chrome (Puppeteer)', 'deviceName': 'Samsung Galaxy S23 Ultra', 'browserName': 'chrome', 'osVersion': '13.0'}
]
print("🚀 Starting Puppeteer + BrowserStack + CapSolver Demo...")
print(f"📱 Testing on {len(platforms)} different platforms:")
for i, platform in enumerate(platforms, 1):
print(f" {i}. {platform['name']}")
results = []
# Test each platform
for platform in platforms:
try:
caps, caps_string = create_browserstack_caps(platform)
platform['caps'] = caps
platform['caps_string'] = caps_string
result = await run_captcha_test(platform)
results.append(result)
await asyncio.sleep(2)
except Exception as e:
print(f"❌ Failed to test {platform['name']}: {str(e)}")
results.append({'platform': platform['name'], 'success': False, 'error': str(e)})
# Final summary
print("\n" + "🏆"*60)
print("FINAL SUMMARY - ALL PLATFORMS (PUPPETEER)")
print("🏆"*60)
successful_platforms = [r['platform'] for r in results if r['success']]
failed_platforms = [r['platform'] for r in results if not r['success']]
for r in results:
if r['success']:
print(f"✅ {r['platform']}: SUCCESS")
else:
print(f"❌ {r['platform']}: FAILED - {r.get('error', 'Unknown error')}")
print(f"\n📊 Success Rate: {len(successful_platforms)}/{len(results)} platforms")
print(f"⏰ Test completed at: {time.strftime('%Y-%m-%d %H:%M:%S')}")
if successful_platforms:
print(f"\n🎉 Successful platforms: {', '.join(successful_platforms)}")
if failed_platforms:
print(f"\n⚠️ Failed platforms: {', '.join(failed_platforms)}")
print("🏆"*60)
if __name__ == "__main__":
asyncio.run(main())
vi
print(f"⏰ Bài kiểm tra hoàn tất lúc: {time.strftime('%Y-%m-%d %H:%M:%S')}")
if successful_platforms:
print(f"\n🎉 Nền tảng thành công: {', '.join(successful_platforms)}")
if failed_platforms:
print(f"\n⚠️ Nền tảng thất bại: {', '.join(failed_platforms)}")
print("🏆"*60)
print("\n💡 Lưu ý: Bản demo này sử dụng pyppeteer (Python Puppeteer) với BrowserStack")
print(" Để có kết quả tốt nhất, hãy đảm bảo gói BrowserStack của bạn hỗ trợ kết nối CDP")
if __name__ == "__main__":
asyncio.run(main())
Tuyên bố Tuân thủ: Thông tin được cung cấp trên blog này chỉ mang tính chất tham khảo. CapSolver cam kết tuân thủ tất cả các luật và quy định hiện hành. Việc sử dụng mạng lưới CapSolver cho các hoạt động bất hợp pháp, gian lận hoặc lạm dụng là hoàn toàn bị cấm và sẽ bị điều tra. Các giải pháp giải captcha của chúng tôi nâng cao trải nghiệm người dùng trong khi đảm bảo tuân thủ 100% trong việc giúp giải quyết các khó khăn về captcha trong quá trình thu thập dữ liệu công khai. Chúng tôi khuyến khích việc sử dụng dịch vụ của chúng tôi một cách có trách nhiệm. Để biết thêm thông tin, vui lòng truy cập Điều khoản Dịch vụ và Chính sách Quyền riêng tư.
Thêm

Cách xử lý Captcha khi làm web scraping
Các thách thức CAPTCHA thường làm gián đoạn quy trình quét trang web. CapSolver cung cấp API và tiện ích mở rộng trình duyệt để giải nhiều loại CAPTCHA, giúp duy trì việc trích xuất dữ liệu mượt mà và cải thiện hiệu quả tự động hóa.

Aloísio Vítor
15-Dec-2025

Tiện ích giải Captcha tốt nhất cho Chrome, Mozilla
Tiện ích mở rộng CapSolver tự động phát hiện và giải các thách thức CAPTCHA trong Chrome và Firefox. Được hỗ trợ bởi các thuật toán AI tiên tiến, nó chạy trơn tru ở nền mà không cần bất kỳ kỹ năng lập trình nào. Bằng cách loại bỏ việc giải CAPTCHA thủ công, CapSolver giúp người dùng tiết kiệm thời gian, cải thiện năng suất và tận hưởng trải nghiệm lướt web và tự động hóa mượt mà hơn.

Anh Tuan
15-Dec-2025

reCAPTCHA là gì? Ví dụ về ReCAPTCHA ở đâu reCAPTCHA demo
Bài viết này cung cấp tổng quan toàn diện về reCAPTCHA, các loại phổ biến của nó và một demo trực tiếp để giúp bạn hiểu cách hoạt động của nó. Bài viết cũng trình bày cách giải quyết reCAPTCHA v2 một cách hiệu quả bằng CapSolver, nâng cao quy trình tự động hóa và phát triển trong khi duy trì bảo mật trang web.

Sora Fujimoto
15-Dec-2025

Cách giải CAPTCHAs bằng Python sử dụng Botasaurus và CapSolver (Hướng dẫn đầy đủ)
Học cách tích hợp Botasaurus (khung phần mềm quét web Python) với API CapSolver để tự động giải reCAPTCHA v2/v3 và Turnstile.

Anh Tuan
15-Dec-2025

AdsPower: Mở khóa tiềm năng kiếm tiền của bạn với Trình duyệt AdsPower
Trong bài viết này, chúng tôi sẽ cho bạn biết AdsPower là gì và các dịch vụ mà họ cung cấp.

Nikolai Smirnov
15-Dec-2025

Tiện ích tốt nhất để giải CAPTCHA 2026 là gì?
Trong thế giới an ninh trực tuyến không ngừng phát triển, các thách thức CAPTCHA đã trở thành rào cản phổ biến đối với người dùng internet...

Ethan Collins
12-Dec-2025

