Skip to content

Stealth and CAPTCHAs

BrowserReal runs Google Chrome itself, headful, on a real display, on a machine of its own. There is no headless mode to detect, no automation flags, and no fingerprint shared with other customers’ browsers.

How your code drives the browser matters as much as the browser. Stock Playwright and Puppeteer ask Chrome for things that a page can notice: they turn on CDP’s Runtime domain in every page and worker (Runtime.enable), and from then on Chrome describes each console message to them, which a script on the page can detect. Bot checks such as Cloudflare’s and DataDome’s look for exactly that.

BrowserReal takes care of it on its side of the connection, so you use Playwright, Puppeteer, Browser Use or any CDP client as it is, with no patched fork and no change to your code:

  • Runtime.enable and Console.enable never reach Chrome. BrowserReal answers them itself, and tells your client about each page’s, frame’s and worker’s JavaScript contexts as Chrome would, found in ways a page cannot see.
  • Everything else goes through as your client sent it: navigation, clicks, typing, evaluate, locators, frames (cross-site ones too), workers, expose_function, set_content, screenshots, network interception.

What changes for your code: the page’s console messages and uncaught errors are not reported to your client (Playwright’s page.on("console") and page.on("pageerror"), Puppeteer’s console event), because reporting them is what gives a client away. To read what a page logged, collect it yourself, for example with an init script that keeps messages in a variable you read with evaluate.

Measured on deviceandbrowserinfo.com’s “Are you a bot?” with stock Playwright: without BrowserReal’s filtering it reports isAutomatedWithCDP and isAutomatedWithCDPInWebWorker; through BrowserReal, neither.

Your own code can still give you away: expose_function and add_init_script leave names on the page (__playwright__binding__, for one) that a site may look for, so use them only where you need them.

  • Open a new page of your own (contexts[0].new_page()) rather than driving the first tab.
  • Keep sign-ins in a profile, with a sticky proxy in the country the account lives in. A site that sees the same browser and address each time asks fewer questions.
  • Keep allowResizing off (the default): the window keeps the size a real screen has.

With solveCaptchas on (the default), Cloudflare’s Turnstile checkbox is clicked as a person would, after a few seconds, up to three times. It is never clicked while a person has control in the live view.

reCAPTCHA and hCaptcha are not solved. When one appears, a person can solve it in the live view: the agent waits, and the profile remembers the result as the site allows.