# 动态 CAPTCHA 解决

默认情况下，无头浏览器在页面加载时会自动检测并立即解决验证码。但有些网站会在后续阶段显示验证码，例如提交表单时的弹出窗口或在特定用户交互之后。

无头浏览器允许你在会话的任意时刻手动触发验证码检测和解决。要手动触发验证码解决，请执行以下代码向 window 对象发送消息：

```
window.postMessage({action: 'solve_captcha', type: '<captcha type>'}, '*')
```

支持的验证码类型包括：

* `hcaptcha`
* `recaptcha`
* `turnstile` (Cloudflare CAPTCHA)

用法示例（Playwright / Puppeteer JavaScript）：

```
// ...
await page.click('#form-submit');
// 现在我们知道应该会显示验证码
await page.evaluate(() => {
  window.postMessage({action: 'solve_captcha', type: 'recaptcha'}, '*')
});
// 像常规情况一样监听 `oxylabs-captcha-start` 和 `oxylabs-captcha-end` 事件
// ...
```

`Turnstile` Turnstile 验证码需要不同的方法，因为必须在其出现在屏幕上之前拦截。为此，先启动验证码检测，然后执行会触发验证码的操作：

```
// 我们知道下一步操作可能会触发 Turnstile 验证码
await page.evaluate(() => {
  window.postMessage({action: 'solve_captcha', type: 'turnstile'}, '*')
});
await page.click('#form-submit');
// 像常规情况一样监听 `oxylabs-captcha-start` 和 `oxylabs-captcha-end` 事件
// ...
```
