Playwright CAPTCHA Solver: Bypass CAPTCHAs in Node.js and Python
Playwright specs and scrapers no longer stall on reCAPTCHA, Turnstile, GeeTest v3 or image CAPTCHAs. Await a token from the Node.js or Python SDK, or let the extension clear the challenge. Every solve runs on your own machine.
- Node.js and Python SDKs
- Any Playwright engine
- No per-solve billing
- open /signup
- fill the form
- solve the CAPTCHA
- submit
4 passed0 blockedA Playwright CAPTCHA solver covers the one step Playwright cannot script: its locators click, type and auto-wait, but none of them can produce the answer a reCAPTCHA, Cloudflare Turnstile or distorted-text image demands. CapSkip produces it in a desktop app that runs beside your tests, on a Windows PC or a VPS you control. A spec or scraping job that meets a challenge keeps going instead of hitting its timeout, and every solve is covered by one flat monthly license.
Both Playwright language camps are served. TypeScript and JavaScript projects add the capskip npm package and await its Promises between locator calls; Python projects use CapSkip with sync_playwright or AsyncCapSkip with async_playwright, which share method names. Solving is a plain HTTP request to the app, never a browser action, so the same helper works in Chromium, Firefox and WebKit projects. Every type CapSkip supports is open to Playwright: reCAPTCHA v2, v3 and Enterprise, Turnstile widgets and challenge pages, GeeTest v3 sliders, ALTCHA, CaptchaFox, Capy, Friendly Captcha and AWS WAF CAPTCHA, plus thousands of distorted-text images.
Audio-transcription helpers such as playwright-recaptcha only last while Google keeps offering the audio challenge, and it tends to vanish once an IP looks suspicious; a real token does not need that door open. Suites already wired to 2Captcha, Anti-Captcha or CapSolver can keep those calls too, since the app answers the same APIs locally.
Rather skip the token wiring? Start a persistent Chromium context with the CapSkip extension loaded, either headed or under the newer headless implementation, and challenges are cleared inside the page while your test waits on its next locator. The extension talks to the running CapSkip app, so keep the app open. Read the extension guide
What a Playwright project gains from CapSkip
Clients for TypeScript and Python
npm install capskip brings a Promise-based client with typings; pip install capskip brings CapSkip for sync_playwright and AsyncCapSkip for async_playwright, both with the same method names.
One helper for every browser project
The SDK sends an HTTP request to the CapSkip app and never drives the browser, so the same solve helper serves your chromium, firefox and webkit projects without a branch.
Tokens written back with page.evaluate
Read the sitekey through a locator, hand it to recaptcha() or turnstile() with page.url, then drop the answer into the hidden response field and fire the widget callback if one exists.
Solve only when a challenge appears
Give the widget locator a short timeout after each navigation and call the solver only when it resolves. Pages without a CAPTCHA keep their normal Playwright speed.
Room for every test worker
Playwright Test runs specs across parallel workers, and each can solve at the same moment. No thread cap applies and the license is flat, so more workers never mean a bigger bill.
2Captcha and CapSolver calls keep working
A suite built around 2Captcha, Anti-Captcha or CapSolver stays as written. Pick that service in the CapSkip emulator and press Add on its Hosts file row. Your own machine then answers its requests instead of a paid queue.
Three ways to bypass CAPTCHA in Playwright
from playwright.sync_api import sync_playwright
from capskip import CapSkip
solver = CapSkip(host="127.0.0.1", port=8080)
with sync_playwright() as p:
page = p.chromium.launch().new_page()
page.goto("https://example.com/login")
sitekey = page.get_attribute(".g-recaptcha", "data-sitekey")
token = solver.recaptcha(sitekey=sitekey, url=page.url)["code"]
page.evaluate(
"t => document.getElementById('g-recaptcha-response').innerHTML = t", token
)
page.click("button[type=submit]")Python with sync_playwright: read the reCAPTCHA sitekey, get the token from CapSkip on 127.0.0.1, write it into the page, then submit.
Extension in persistent Chromium
No solving code at all: Playwright launches Chromium with the CapSkip extension, and it clears widgets in the page. The same extension runs in everyday Chrome and Firefox.
SDKs for Node.js, Python and .NET
Await one call per CAPTCHA type from TypeScript or Python, or use the .NET client under Playwright for .NET. Each result comes back ready to inject.
Local API for the code you have
Existing 2Captcha-style requests are answered by the app, so older specs keep running. Playwright for Java, or any other binding, can call the HTTP API directly.
Aim a Playwright script at a live widget
Our reCAPTCHA v2 demo loads a real Google widget. Point your Playwright script at it, run the solve step, and confirm the form accepts the token before you go near your own targets.
Set up the Playwright CAPTCHA solver in three steps
-
Install the app on a reachable machine
Install CapSkip next to your test runner on Windows, or on any VPS your CI jobs can reach across the network, then start it and let it idle until the first solve arrives. Get the Windows installer
-
Sign in with a license or trial
Your login details arrive by email after you subscribe; enter them in the app. To test first, the trial gives 3 days and 500 solves on one device, no card needed. Start the free trial
-
Wire the solve step into your tests
Install the npm or pip package, wrap the client in a helper or fixture, and call it wherever a challenge can show up. Method names and options are on the SDK page. Open the SDK guide
CapSkip vs per-solve APIs inside a Playwright suite
The rows below follow what changes for a Playwright suite when solving moves from a paid API to your own machine.
| Feature | CapSkip | 2Captcha & API services |
|---|---|---|
| How you pay | Unlimited solves for a flat $35 a month and up | Credits charged per thousand solves, rising with every run |
| Where the solve happens | On a Windows box or VPS you control | In a provider cloud or by paid human workers |
| Playwright languages | Node.js and Python SDKs, .NET client, local HTTP API | Their client libraries plus an API key |
| Parallel test workers | No thread cap, bounded only by your hardware | Concurrency limits or extra fees |
| Specs written for 2Captcha | Keep running through the built-in emulator | Locked to that API and its prepaid balance |
| Image CAPTCHA turnaround | About 0.1 seconds, no trip over the internet | Network and queue delay on each solve |
| Challenge data | Never leaves the solving machine | Uploaded to an outside service each time |
Pricing
Stop paying per solve
Choose your license
Bronze License
$35/ month
Instant license activation
Billed monthly. Cancel from your account whenever you like.
Same features. More machines, more throughput.
Every machine solves as fast as its own CPU and memory allow. More machines run more threads at the same time, so Silver solves twice as many CAPTCHAs at once and Gold three times as many.
- Unlimited solving, no daily cap
- Unlimited threads, speed scales with your hardware
- 90% to 100% recognition accuracy
- Drop-in replacement for the major solving service APIs
- Works with almost any tool, no coding required
- REST API, SDKs and a browser extension
- Free training when a new CAPTCHA type appears
- Runs on your machine, nothing leaves it
Every CAPTCHA type CapSkip solves is on every license. See the coverage band
Just want to try it first?
Start with a free 3-day trial and solve 500 CAPTCHAs of any type on your own targets.
Related CAPTCHA solvers & guides
How to handle CAPTCHA in Playwright, step by step
Start by choosing where the solve lives. Playwright offers two clean spots: inside the browser, through the CapSkip extension, or inside your test code, through the SDK. Both work from Node.js and Python, and one repository can use each where it fits.
Inside the browser. Launch a persistent Chromium context that loads the extension, headed or in Chromium's new headless mode, because the old headless shell refuses extensions. It notices a reCAPTCHA, Turnstile or GeeTest v3 widget as soon as one renders and solves it while your next locator waits. For an image CAPTCHA, mark the picture and its input box in the extension once.
Inside your code. Pull the sitekey off the widget with a locator, send it along with page.url to the SDK, then use page.evaluate to set the hidden field the site reads: g-recaptcha-response for reCAPTCHA, cf-turnstile-response for Turnstile. Call the widget callback when the page declares one, then submit. Google lets a reCAPTCHA token live for roughly two minutes, so solve right before the submit, not at the top of the test.
Keep clean pages fast. After each navigation, give the widget locator a short timeout and skip the solve when nothing shows up. Suites that log in can solve the login challenge once in a setup project, save storageState, and start every later test already signed in.
Coming from a paid service? On the machine that runs CapSkip, pick 2Captcha or Anti-Captcha in the emulator settings, then let the app list that service in the Windows hosts file with a single click. Your Playwright calls stay as written and every supported CAPTCHA is solved locally.
Related guides: Patchright CAPTCHA · Camoufox CAPTCHA · Crawlee CAPTCHA
How do I bypass CAPTCHA in Playwright without writing solving code?
Which Playwright browsers work with CapSkip?
Does it fit Playwright Test with many parallel workers?
Can I solve invisible reCAPTCHA and reCAPTCHA v3 from Playwright?
Will headless mode stop CapSkip from working?
How do I get Playwright through Cloudflare Turnstile?
Can my Playwright suite keep its 2Captcha or Anti-Captcha calls?
Is playwright-recaptcha or a stealth patch enough on its own?
Let your Playwright runs finish green
Install CapSkip, add one solve step or the extension, and the specs that used to stall on a challenge reach their last assertion. Unlimited solves on one flat monthly plan.
