Playwright Captcha Solver

Automatically solve image CAPTCHAs inside Playwright automations. Works with Python, JavaScript, and TypeScript. FastCaptcha returns the answer in 0.3–0.7 seconds.

How it works

Playwright screenshots the CAPTCHA element β†’ FastCaptcha solves it β†’ Playwright types the answer

Python + Playwright

from playwright.sync_api import sync_playwright
import requests

API_KEY = "YOUR_API_KEY"

def solve_captcha(image_bytes: bytes) -> str:
    resp = requests.post(
        "https://fastcaptcha.org/api/v1/ocr/",
        headers={"X-API-Key": API_KEY},
        files={"image": ("captcha.png", image_bytes, "image/png")},
        timeout=15,
    )
    data = resp.json()
    if not data.get("success"):
        raise ValueError(data.get("error", "API error"))
    return data["text"]

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://example.com/login")

    # Screenshot the CAPTCHA element
    captcha_el = page.locator("img.captcha")
    img_bytes = captcha_el.screenshot()

    # Solve it
    answer = solve_captcha(img_bytes)
    print(f"Answer: {answer}")

    # Type the answer
    page.fill("#captcha-input", answer)
    page.click("#submit-btn")

    browser.close()

JavaScript + Playwright

const { chromium } = require("playwright");
const axios = require("axios");
const FormData = require("form-data");

const API_KEY = "YOUR_API_KEY";

async function solveCaptcha(imageBuffer) {
  const form = new FormData();
  form.append("image", imageBuffer, {
    filename: "captcha.png",
    contentType: "image/png",
  });
  const { data } = await axios.post(
    "https://fastcaptcha.org/api/v1/ocr/",
    form,
    { headers: { "X-API-Key": API_KEY, ...form.getHeaders() } }
  );
  if (!data.success) throw new Error(data.error);
  return data.text;
}

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto("https://example.com/login");

  // Screenshot just the captcha element
  const captchaEl = page.locator("img.captcha");
  const imgBuffer = await captchaEl.screenshot();

  // Solve it
  const answer = await solveCaptcha(imgBuffer);
  console.log("Answer:", answer);

  // Fill in the answer
  await page.fill("#captcha-input", answer);
  await page.click("#submit-btn");

  await browser.close();
})();

Handling canvas-based CAPTCHAs

Some sites render CAPTCHAs on a <canvas> element. Use Playwright's evaluate to export it as PNG:

# Python
import base64, requests

canvas_data = page.evaluate("""
    () => {
        const canvas = document.querySelector('canvas.captcha');
        return canvas.toDataURL('image/png').split(',')[1];
    }
""")
image_bytes = base64.b64decode(canvas_data)
answer = solve_captcha(image_bytes)
🎭
Works with all Playwright browsers

Chromium, Firefox, WebKit β€” all supported

⚑
0.3s solve time

Minimal added latency to your automation

πŸ–ΌοΈ
img & canvas

Handles both <img> and <canvas> CAPTCHAs