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