
Lucas Mitchell
Automation Engineer
已发表 Nov 12, 2026
已更新 Nov 12, 2026 · 最小阅读量

在开发时能正常工作的浏览器作业,一旦并发运行多个,很容易失败。一项作业在其求解请求仍在运行时刷新页面。另一项作业收到了结果,却把它关联到了错误的浏览器标签页。第三项作业到达截止时间后重新启动了整条工作流。这些都是集成问题,会浪费本来有用的 CAPTCHA 求解结果。
CapSolver 为受支持的挑战提供有文档说明的求解任务。你的应用仍然控制浏览器、把结果关联到作业,并决定预期操作是否成功。下面的生产检查清单说明了如何在经批准的浏览器自动化中测试这一交接,并在扩大流量前记录清晰的通过或失败结果。文中使用一个被允许的目录读取工作流作为示例,但不会假设所有目录都需要求解器,也不会将某个客户部署当作证据。
CAPTCHA 求解器在浏览器工作流内部处理受支持的验证挑战;工作流本身仍对预期页面操作和输出负责。
例如,一个目录读取器打开一个经批准的产品 URL,并期望得到产品标识、价格和库存状态。如果出现了 CAPTCHA,读取器会暂停该作业,请求合适的解决方案,然后在提取产品字段前再次检查页面。如果页面仍然是验证页面,则该作业尚未完成。
要把普通的浏览器失败分离开来。缺失的选择器、导航错误、权限拒绝和观察到的 CAPTCHA,需要不同的应对方式。把每一种失败都送去求解,会让故障排查变得不清晰,还可能产生与实际挑战不匹配的请求。
实际顺序是:观察页面,识别挑战,创建匹配的任务,获取解决方案,通过受支持的集成方式应用它,并验证最初的结果。每个阶段都应该有明确的输入、可观察的结果以及停止的理由。
从一组有边界的、被允许的工作流开始,这些工作流要能代表你实际需要处理的页面和挑战类型。
在开始前写下预期结果。对于目录作业,这意味着正确的产品及请求的字段,而不仅仅是 HTTP 成功响应。对于自有的测试表单,则意味着应用确认表单已被接收。这为求解器集成提供了一个具体的完成检查。
准备好必要的账户密钥、账户余额、浏览器环境以及官方任务文档。把密钥放在应用的机密配置中。页面的公开 sitekey 和你的私有 CapSolver API 密钥用途不同,绝不能互相替代。
用少量并发作业运行基线。保存挑战类别、返回的求解任务 ID、耗时和最终结果。这些观测可以确认在增加并行执行之前哪些是可靠的。相比一开始就选择大量 worker 再去排查混合失败,这些观测价值更高。
在测试你自己的网站时,要区分常规的 UI 测试和真实求解集成的测试。常规测试可以在有文档说明的情况下使用 CAPTCHA 服务商提供的测试工具。受控的集成测试则有不同目的:检查你实际的求解器与应用的交接。两者的结果不应互相当作证明。
每一个求解结果都必须回到发起它的浏览器作业和挑战上。
使用应用的作业标识符,把浏览器上下文、当前页面和求解任务 ID 关联起来。保持 API 的任务 ID 作为一个独立的值。一次作业可能完全不遇到 CAPTCHA,也可能需要超过一次被允许的求解尝试;这些关系都应该清晰可见。
对于相互独立的工作流,在框架支持的情况下为它们使用独立的浏览器上下文。Playwright 的 browser-context 隔离 会在不同上下文之间隔离 Cookie 和其他会话存储。隔离有助于防止一个作业的状态变更影响另一个作业,但它并不保证某个挑战一定会接受某个结果。
在单个作业内部,在求解请求处于挂起状态时,要保持当前页面状态。如果页面发生导航、小组件重置,或者作业被取消,在使用尚未返回的结果前,要检查它是否仍属当前挑战。不要把延迟返回的结果当作对当前随便打开的页面拥有行动许可。
应由一个组件“拥有”是否继续某个作业的决策权。如果轮询循环和某个独立的超时处理器都可以提交表单,就会产生竞争条件。记录作业当前处于等待、完成、取消还是失败状态,并让继续执行前先检查该状态。
这可以是你现有 worker 系统里的一个简单记录。关键在于它所支持的决策:过时的或已被消费的结果不能再触发新的应用操作。
可靠的任务创建始于准确的 CAPTCHA 家族类型和当前页面所需参数。
对于一个 reCAPTCHA v2 token 任务,官方 reCAPTCHA v2 指南 记录了支持的任务名称和字段,包括网站 URL 和 sitekey。其他挑战家族有各自的要求。适用于一个家族的工作请求,并不是所有 CAPTCHA 的通用模板。
createTask 文档 区分了异步任务(返回任务 ID,供稍后获取结果)和支持的同步任务(直接返回可用解决方案)。要根据实际响应来处理,而不是假设每个请求都要经历相同的轮询过程。
为你实际面对的挑战选择文档规定的集成方式。服务级别的支持和某个浏览器库中的支持是两件事;在把某浏览器库纳入生产工作流之前,要同时确认这两点。
代理设置也是按任务类型区分的。按照所选任务的文档保持相应设置,而不是擅自假定所有 token 都必须使用浏览器 IP,或认为无代理(proxyless)任务会改变浏览器的网络连接。
兑换你的 CapSolver 奖励码
立刻提升你的自动化预算!
在为 CapSolver 账户充值时使用奖励码 CAP26,即可在每次充值金额上获得额外 5% 奖励——没有次数或金额上限。
现在就前往 CapSolver 控制台 兑换
轮询已有的异步任务,直到它完成、失败,或达到应用约定的截止时间。
getTaskResult 参考 记录了状态字段和错误处理方式。成功的 ready 响应中包含解决方案;processing 响应表示仍在求解中。遵循文档规定的轮询间隔。重复创建任务代表发起新的求解尝试,而不是更快拿到已有任务的结果。
把应用自身的截止时间和服务返回的超时区分开来。如果你的 worker 更早停止等待,应记录为客户端截止,而不是断言服务内部失败。保留任务 ID 用于诊断,并防止最终返回的结果“复活”已取消的浏览器作业。
使用有文档说明的错误码来选择下一步动作。错误的任务数据应通过修正参数处理。账户或余额错误应进行账户检查。限流响应则意味着要检查请求频率和相应的限制。这些情况没有一个是通过无限重复相同请求立刻可以修好的。
重试应有明确原因、剩余预算以及仍然有效的浏览器状态。比如,修正了参数就可能值得再试一次;重复出现的权限拒绝则不是。
在工作流层面为总耗时和求解尝试次数设置上限。当一个作业达到任一上限时,要返回一个可理解的“未完成”结果或转交人工处理。可预期的停止,比起在原任务已过时的情况下继续产生费用更有价值。
一个就绪的解决方案只是中间结果;只有在验证了工作流预期的操作或观察结果后,浏览器工作流才算成功。
按照文档中针对该挑战和页面的集成方式使用求解结果。然后再检查应用的实际结果。对于自有表单,检查预期的确认信息。对于被允许的目录读取,验证产品标识和所需字段。仅仅是小组件消失、页面标题变更或返回了 token,都不能证明这些结果已经达成。
Token 的有效性也很关键。Google 的 reCAPTCHA 验证指南 说明,响应 token 仅在两分钟内有效,且只能被验证一次。这一供应商规则并不是所有求解结果的通用有效期。不要把解决方案排队以备后用,而应遵守你正在处理的那个挑战的规则。
浏览器就绪状态是另一项独立检查。Playwright 的 actionability 检查 能帮助确认元素已准备好接受操作,但它不能证明 CAPTCHA 结果被接受,或应用已完成业务操作。要在测试和生产代码中把这些断言分开。
以目录示例来说,一个失败的挑战必须仍然被记录为失败的观测。不要把空响应转换成“无库存”事件,也不要悄悄重用旧价格,假装它是刚刚采集到的。
逐步提高并发作业数,用已验证的完成情况和耗时来判断每次提升是否有价值。
跟踪当前有多少作业在运行、多少在等待求解、多少完成、多少以各种错误类型结束。如果提高并行度让“未解决”的作业增加,却没有提高有用输出,就要先检查相应阶段,再决定是否继续提高。
避免同时启动大量必然会在等待共享资源时超时的作业。浏览器容量、求解请求限制和被允许的工作负载排程是独立的约束条件。不存在适用于所有应用的“通用并发值”。
在受限的诊断记录中保留任务 ID,并使用一小套类别进行监控。不要在普通日志中记录 API 密钥、解决方案 token 或会话 Cookie。OWASP 日志指南 解释了为何敏感数据需要被排除或保护。
当任务变慢时,CAPTCHA API 故障排查指南 提供了针对性的后续步骤。要在同一挑战家族和工作流中进行对比,避免把工作负载变化误认为求解器的“退化”。
一个可用于生产的 CAPTCHA 集成,必须在同一条被允许的工作流里展示出正确的任务选择、受控的等待,以及已验证的应用结果。
使用下列表格作为发布前审查清单。对每一行记录测试运行、观测结果以及对失败负责的人。仅有书面规范并不能证明代码已经遵守了它。
| 检查项 | 如何在受控运行中验证 | 通过证据 |
|---|---|---|
| 挑战与输入 | 打开被允许的测试页面,将检测到的挑战家族及当前输入与官方任务指南对比。 | 任务类型、页面 URL 和必需参数与观察到的挑战相匹配。 |
| 凭据与账户 | 检查 worker 是否从机密配置中读取 API 密钥并能使用预期账户。 | 账户错误会单独暴露;密钥不会出现在日志里。 |
| 作业与任务关联 | 运行两个独立测试作业并检查其记录的作业 ID 和任务 ID。 | 每个结果只返回到发起它的作业。 |
| 挂起响应 | 触发“等待分支”,同时不再创建新任务。 | 重复检查结果时保持相同任务 ID,并遵守配置的截止时间。 |
| 导航或取消 | 在结果挂起时取消自有测试作业或导航到其他测试页面。 | 延迟返回的结果不能提交已取消或已改变的页面。 |
| 永久请求错误 | 用受控的负面测试制造无效任务配置。 | 错误被分类并上报;在没有修正的情况下不会重复发送相同请求。 |
| 应用完成 | 完成一条具有代表性的、被授权的工作流。 | 在求解之后检查预期确认信息或所需数据字段。 |
| 失败报告 | 检查一个失败作业和一个未完成作业。 | 两者都保留失败原因,并能与已完成作业区分开。 |
| 重试预算 | 在受控测试中触发配置的停止条件。 | 尝试次数和总耗时上限会阻止继续发起新的求解请求。 |
| 日志与上线 | 审查脱敏日志,并在受控试运行中增加负载。 | 未记录任何机密信息,同时对完成、失败、挂起作业以及耗时都保持可观测性。 |
| 例如,一个测试自己报价表单的 QA 团队,可以要求应用程序的确认标识符作为最终断言。CAPTCHA 令牌只是中间结果。如果验证成功但报价服务返回错误,则测试必须保持未完成状态,并保留该应用程序错误。 |
通过自有的测试工具运行负面测试,而不是反复向生产环境发送畸形流量。模拟的挂起响应可以测试你的超时分支,但不能证明真实的求解请求一定成功。将这些检查结果与受控的在线集成运行相分离。
一次失败的检查应当指出需要关注的是哪个组件。缺失输入和不受支持的任务需要配置审查。没有确认响应的请求需要排查传输问题。已就绪结果却被应用程序拒绝,需要调查交接和验证阶段。验证完成却缺少输出,则需要检查应用程序本身。
给每一类问题都分配一个小的运营动作:修正请求、排查连接、检查当前挑战,或带有有用诊断信息地停止任务。这样团队可以解释为什么重试是合理的,而不是把重试次数本身当作解决方案。
可靠的 CAPTCHA 处理来自一条清晰的链路:某个具体任务遇到了受支持的挑战,请求了匹配的解答,在正确的上下文中使用了解答,并验证了预期结果。
在增加更多工作线程之前,先建立这条链路。CapSolver 提供有文档说明的求解步骤;你的工作流则提供所有权、截止时间和完成检查,从而让结果变得有用。
针对你的已批准工作流实际遇到的挑战,使用对应的官方任务指南,然后在一个小规模试验中验证完整的浏览器结果。
问:仅仅增加一个 CAPTCHA 求解器,能让浏览器自动化本身变得可靠吗?
不能。求解器负责处理受支持的挑战,而你的应用仍然需要管理浏览器状态、任务所有权、截止时间以及最终输出检查。
问:每个浏览器任务都应该有单独的上下文吗?
独立的任务通常从隔离的上下文中获益,因为它们的 Cookie 和存储不应互相干扰。需要连续性的任务应当在挑战与后续操作的整个过程中保持自己的上下文。
问:在第一个任务处理中时,我应该创建另一个任务吗?
使用现有任务 ID 按照文档化的 API 流程获取其结果。只有在有界的重试决策下、使用当前输入且任务状态有效时,才创建替代任务。
问:我可以在多个浏览器任务之间复用同一个解答吗?
不要假定解答可复用。令牌可能有过期、单次使用以及上下文要求;请使用所选挑战的文档说明,并将结果与其来源任务保持关联。
问:在提高并发之前我应该度量什么?
在一致的负载下,度量已验证的工作流完成数、耗时、挂起任务数以及失败类别。只在相关系统的许可和限制范围内增加流量。

Lucas Mitchell
Automation Engineer
Helping browser automation recover and continue.
关于作者