Selenium

Selenium CAPTCHA Solver for Python and WebDriver Scripts

A reCAPTCHA, a Turnstile check, a GeeTest v3 slider or a warped image should not end a WebDriver session. Give the browser the CapSkip extension or call the SDK from your test, and every solve runs locally with no meter.

Windows x64·Runs locally, so no CAPTCHA leaves your machine
  • Python, C# and Node.js
  • Extension or SDK route
  • Selenium Grid friendly
CAPTCHAs a month40,000
40.0k250.0k
Metered elsewhere, about $1.40 per 1,000$56.00
CapSkip Bronze, flat$35.00
$21.00stays in your pocketevery month, at this volume

Sooner or later a WebDriver run hits a login, search or sign-up form guarded by a challenge, and that is where a Selenium CAPTCHA solver comes in. Selenium can locate elements, click and type, yet it cannot produce a reCAPTCHA token or read warped letters, so the test stalls and the report fills with timeouts. CapSkip sits beside the driver, on the same Windows computer, or on a VPS that the script can reach, and hands back the answer while the browser waits.

There are two ways to wire it in, and they suit different Selenium habits. The no-code route launches a Chrome or Firefox profile that already carries the CapSkip extension, so widgets clear inside the page as if a person had ticked them. The scripted route keeps control in your test: pip install capskip, read the sitekey with find_element, call solver.recaptcha() or solver.turnstile(), and write the token back with execute_script. Image CAPTCHAs return as text in about 0.1 seconds.

On the token side CapSkip covers reCAPTCHA v2, v3 and Enterprise plus Cloudflare Turnstile. GeeTest v3 slides, Capy puzzles, CaptchaFox and AWS WAF CAPTCHA are included too, as are the proof-of-work checks behind ALTCHA and Friendly Captcha. Image CAPTCHAs span thousands of variants, and hCaptcha is covered too, invisible and Enterprise widgets included. FunCaptcha and GeeTest v4 are not supported. Nothing is metered, so a nightly regression that trips hundreds of challenges is billed exactly like one that trips none.

Your driver code can stay as it is. Put the CapSkip extension into a browser profile, start Selenium with that profile while the app runs, and challenges clear on their own as your explicit waits tick. Switch to the SDK only when a test needs the answer in hand. Read the extension guide

What the Selenium CAPTCHA solver does for WebDriver

A solving profile for Chrome or Firefox

Install the extension once in a dedicated Chrome profile and hand it to the driver with user-data-dir, or load the Firefox add-on via install_addon(). Every window Selenium opens can then solve, as long as the app is running.

Token calls from the same test file

Read data-sitekey with find_element, pass it plus driver.current_url to solver.recaptcha(), and set g-recaptcha-response through execute_script. The browser stays under your script while the app works.

Image text taken from the live element

Grab the picture with screenshot_as_base64 and send it to solver.normal(). Since nothing requests the image twice, the text you type with send_keys matches what this session was shown.

Pairs with undetected-chromedriver

Stealth drivers such as undetected-chromedriver and SeleniumBase UC mode make challenges rarer. CapSkip clears the ones that still slip through, so the two tools cover different halves of the problem.

Old 2Captcha helpers keep running

Helpers you built around 2Captcha or Anti-Captcha need no edits. Choose that service as the emulator in the app, click Add beside Hosts file, and CapSkip answers those calls itself.

Parallel drivers on one subscription

Run as many WebDriver instances as the machine can hold. Threads are never capped by the plan, and a suite that meets hundreds of challenges adds nothing to the monthly bill.

Pick how your WebDriver code reaches CapSkip

Python
from selenium import webdriver
from capskip import CapSkip

driver = webdriver.Chrome()
driver.get("https://example.com/login")

solver = CapSkip(host="127.0.0.1", port=8080)
sitekey = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-sitekey")

token = solver.recaptcha(sitekey=sitekey, url=driver.current_url)["code"]

# Inject the token and submit
driver.execute_script(
    "document.getElementById('g-recaptcha-response').innerHTML = arguments[0];",
    token,
)
driver.find_element("css selector", "button[type=submit]").click()

Python Selenium: read the sitekey from the widget, ask CapSkip for a token, write it into the response field and click submit.

Extension inside the Selenium profile

Load the Chrome or Firefox extension into the profile Selenium launches. Widgets are solved in place, so your test carries no solving code at all.

SDK calls next to your locators

Python, Node.js, PHP and C# clients hand back tokens and image text ready for execute_script or send_keys in the WebDriver binding you use.

Local API for every other binding

Java and other bindings without an SDK can call the HTTP API directly, and Selenium code built for 2Captcha style services works once the emulator is on.

Try your Selenium script on a live reCAPTCHA

Aim your WebDriver at our reCAPTCHA v2 demo page, run the solve step against the real Google widget, and watch the form accept the token before you point it at your own targets.

Get CapSkip ready beside your Selenium suite

  1. Install CapSkip on the test machine

    Install CapSkip on the Windows desktop or VPS that executes your WebDriver scripts, or on any box those scripts can reach over the network, and keep it running while tests run. Download the installer

  2. Activate a plan or the free trial

    Use the login details emailed with your order to sign in to CapSkip. The trial gives one device three days and 500 solves, enough to run a suite against real targets. Start the free trial

  3. Add the solve step to your driver

    Either launch Selenium with the extension profile, or pip install capskip and call the solver wherever a challenge interrupts your flow. Every method and option is documented. Open the API docs

Local solving vs per-solve APIs inside Selenium

How CapSkip and services such as 2Captcha differ once your Selenium runs meet challenges every day.

FeatureCapSkip2Captcha & API services
What a full test run costsThe same monthly plan from $35, however many solvesEvery solve billed, so a bigger suite means a bigger bill
Where the challenge is solvedOn the machine driving your browsers, or a VPSOn remote servers, often by human workers
Image CAPTCHA turnaroundAbout 0.1 seconds, no trip across the internetSeveral seconds, plus a network round trip per image
Code you already wrote for 2CaptchaKeeps working through the built-in emulatorTied to that vendor API and its balance
Session screenshots and challenge dataStay on your own machineSent to a third-party service for every solve
Parallel WebDriver sessionsNo thread cap from the plan, only your hardwareExtra concurrency often costs more
Ways to plug into SeleniumExtension profile, Python or .NET client, or plain HTTP callsAPI key, prepaid credits and their own client

Pricing

Stop paying per solve

Choose your license

Bronze License

$35/ month

Subscribe to Bronze

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.

Start the free trial

Solve reCAPTCHA with Selenium Python: extension or SDK

Selenium gives you two dependable options when a CAPTCHA blocks the flow: let a browser extension finish the challenge inside the page, or solve it from your script and inject the answer. Both rely on the CapSkip app running somewhere your test can reach, and the right one depends on how much control the test needs.

The extension route. Create a Chrome profile, install the CapSkip extension in it, and start webdriver.Chrome with that profile through the user-data-dir argument; for Firefox, call driver.install_addon() with the add-on file. Run headed or with --headless=new, since the old headless mode loads no extensions. Widgets for reCAPTCHA, Turnstile and GeeTest v3 are then handled in place, and your WebDriverWait only has to wait for the form to move on.

The SDK route. Install the client with pip install capskip (Python 3.10 or newer) and build one solver for the whole session, aimed at 127.0.0.1 and port 8080 by default. For reCAPTCHA, take data-sitekey from the .g-recaptcha element, or the k value in the src of the reCAPTCHA iframe when JavaScript renders the widget, then call solver.recaptcha() with driver.current_url. An invisible widget needs invisible=1, while v3 wants version v3 plus the action string the page passes when it runs the check. Set g-recaptcha-response with execute_script, run the data-callback if the widget names one, and submit inside two minutes. For Turnstile, swap in solver.turnstile() and the hidden cf-turnstile-response field; the rest of the flow is unchanged.

For a Python Selenium CAPTCHA image solver step, read screenshot_as_base64 from the img element, pass that string to solver.normal() with a data:image/png;base64 prefix, and type the result with send_keys. Never fetch the image URL again: most image CAPTCHAs belong to the session, and a second request draws a new picture. Hand CapSkip the proxy your browser uses (HTTP, HTTPS, SOCKS5 or SOCKS5h) for reCAPTCHA and Turnstile; image solves need none.

Related guides: undetected-chromedriver CAPTCHA · SeleniumBase CAPTCHA · Selenium Grid CAPTCHA

What is the fastest way to solve reCAPTCHA with Selenium in Python?
Keep the CapSkip app running, pip install capskip, and read data-sitekey from the .g-recaptcha element. Call solver.recaptcha() with that key and driver.current_url, adding invisible=1 or version v3 with the page action when needed. Put the returned code into g-recaptcha-response with execute_script, fire the data-callback if there is one, then submit.
Should my Selenium project use the extension or the SDK?
Use the extension when you want zero solving code: the browser profile finishes each widget unaided while your waits run. Use the SDK when the test must decide when to solve, log the result, retry, or run in old headless mode. You can begin with the extension and move busy paths to the SDK later.
How do I get the extension into the browser Selenium opens?
For Chrome, install the extension from the Chrome Web Store into a dedicated profile, then start Selenium with that profile through the user-data-dir argument. For Firefox, pass the add-on file to driver.install_addon(). Run headed or with --headless=new, because the legacy headless mode cannot load extensions, and keep the CapSkip app open while tests run.
How does Selenium pass an image CAPTCHA to CapSkip?
Locate the CAPTCHA img, read its screenshot_as_base64 property and hand it to solver.normal(), prefixed with data:image/png;base64. Type the returned characters into the answer box with send_keys. A screenshot beats downloading the image URL, because the site ties the picture to your session and a fresh request would show different letters.
Does it handle Cloudflare Turnstile, including the full-page check, in Selenium?
Yes. For the widget, read data-sitekey from the .cf-turnstile element, call solver.turnstile() with the page URL and write the token into cf-turnstile-response before submitting. When Cloudflare shows its full-page check instead, CapSkip solves that as well and returns a userAgent alongside the token; reuse it for the rest of that Selenium session so the pass stays valid.
The form still refuses my injected token. What usually went wrong?
Three causes cover most cases: the token is older than two minutes, the data-callback was never called, or the page holds several widgets and posts g-recaptcha-response-1 instead of the first field. Solve right before you submit, trigger the callback, and check in the network panel which field your form actually sends.
Can I call CapSkip from Selenium in C#, Node.js or Java?
Yes. C# WebDriver projects add the .NET client with dotnet add package CapSkip, and selenium-webdriver in Node.js uses npm install capskip; the find, solve and inject steps mirror the Python flow. Java and other bindings have no SDK, so they call the local HTTP API directly with any HTTP client.
Does the solver work with headless Chrome and Selenium Grid?
The SDK route works in every browser mode, because the solve runs inside CapSkip and the test only has to reach its host and port. On Grid that keeps things simple: the test script calls the solver, not the node. The extension route needs headed Chrome or the new headless mode.

Let your Selenium suite finish every run

Install CapSkip next to your driver, sign in, and choose the extension or the SDK. Your next WebDriver run clears its CAPTCHAs locally, and the monthly bill stays put whatever the suite runs into.