一款指纹浏览器同时写着支持 RPA、API、Playwright 和无头模式,并不代表这些能力解决的是同一个问题。
RPA 负责把页面操作编排成流程;Local API 用于创建、启动和管理浏览器环境;CDP 让 Playwright、Puppeteer 等工具连接已经启动的 Chromium 浏览器;后台任务层则用于承载定时执行、并发控制、日志记录和异常处理等运行管理能力。具体产品是否完整提供这些能力,需要逐项确认。
寻找自动化 AdsPower 替代方案时,首先要确认的不是某款产品列出了多少功能,而是自动化任务究竟运行在哪一层。
RPA、Local API、CDP和后台任务分别负责什么
这四种能力可能同时出现在一款产品里,但它们在自动化流程中承担的职责不同。
| 自动化方式 | 主要作用 | 适合处理的任务 | 需要注意的问题 |
|---|---|---|---|
| RPA | 用可视化节点编排点击、输入、等待和循环 | 步骤固定、主要由运营人员维护的重复操作 | 复杂条件、异常处理和版本管理能力 |
| Local API | 创建、启动、关闭和修改浏览器环境 | 批量管理环境,将浏览器接入内部系统 | 客户端依赖、权限、调用限制和部署位置 |
| CDP | 让外部程序连接已启动的 Chromium 浏览器 | 使用 Playwright、Puppeteer 控制页面 | 只负责浏览器控制,不负责完整任务调度 |
| 后台任务层 | 管理任务的运行、排队和异常处理 | 定时、批量和持续运行的自动化任务 | 产品是否提供并发、队列、日志、超时和重试 |
一条代码自动化流程通常可以拆成:
业务系统
↓
调用 Local API 启动浏览器环境
↓
取得 CDP 连接地址
↓
Playwright 连接并操作页面
↓
任务系统记录结果、超时和异常
RPA 可能不需要外部代码,由产品内部的流程编辑器直接完成页面操作。后台任务也不是另一种页面控制协议,而是负责运行和管理任务的外层系统。

RPA适合固定流程,复杂任务仍需考虑维护成本
RPA 的优势是制作门槛相对低。
用户可以通过录制或拖拽节点,组合打开页面、点击按钮、填写表单、等待元素和循环执行等操作。对于页面相对稳定、步骤固定、主要由运营人员维护的任务,可视化流程比从头编写代码更直接。
AdsPower 当前已经把 RPA 作为自动化入口之一,同时提供 Local API、MCP 以及外部自动化框架的接入方式,因此不能简单地把它理解为只支持可视化流程。
判断 RPA 是否适合当前任务,可以重点看三件事。
页面变化后能否快速修改
依赖固定坐标或脆弱元素定位的流程,在页面布局变化后容易失败。
需要检查产品能否定位到具体失败步骤、重新选择页面元素、单独重试某个节点,以及在不重新录制全部流程的情况下修改任务。
复杂条件是否容易维护
当任务加入多层判断、数据转换、接口调用、异常分支和重试规则后,可视化节点可能迅速增加。
这种情况下,代码通常更便于拆分模块、复用公共逻辑、使用版本控制和统一处理异常。
谁负责长期维护
由运营人员自行调整步骤时,RPA 更容易使用。
如果团队已经维护 Playwright、Puppeteer 或 Selenium 项目,将整套流程重新制作成 RPA,不一定能减少工作量。
RPA 更适合降低固定流程的制作和修改门槛,而不是替代所有代码自动化。
Local API解决环境管理,页面操作通常还需要其他工具
Local API 常用于让外部程序控制浏览器环境。
不同产品的接口覆盖范围并不相同,常见对象可能包括:
- 浏览器环境;
- 代理配置;
- 环境启动和关闭;
- 自动化连接地址;
- 标签与分组;
- 成员或环境权限。
调用 Local API 成功,只能说明外部程序能够管理相应对象。
后续要读取页面元素、点击按钮或填写表单,通常还要连接 Selenium、Puppeteer 或 Playwright。Local API 更接近浏览器环境的控制入口,而不是完整的页面自动化框架。
选择支持 Local API 的工具时,需要继续核对:
- API 实际可以管理哪些对象;
- 桌面客户端是否必须保持运行;
- 请求是否只能从本地设备发出;
- 能否部署在服务器或容器中;
- 谁可以获得 API Token;
- 是否有调用频率限制;
- 自动化权限属于哪个套餐;
- 启动环境后返回哪种连接信息;
- 浏览器环境由脚本还是客户端负责关闭。
有些产品要求桌面客户端处于登录状态,外部程序只能向本机端口发送请求;有些产品提供远程浏览器或容器运行方式;还有些产品把环境管理接口和页面控制接口分开提供。
即使都写着“支持 Local API”,实际部署方式也可能完全不同。
CDP让外部脚本连接已有浏览器
Chrome DevTools Protocol,简称 CDP,是 Chromium 浏览器使用的一套调试和控制协议。
指纹浏览器启动环境后,可以返回一个 CDP 地址。Playwright 或 Puppeteer 再通过这个地址连接已有浏览器,并继续操作默认上下文中已经打开的页面。
目标站点的 Cookie、本地存储和代理配置是否正确生效,以及浏览器重新启动后是否继续保留,需要分别验证。CDP 连接成功并不能证明这些状态一定符合当前任务预期。
Playwright 官方提供了 connectOverCDP() 方法。
CDP 连接仅适用于 Chromium 系浏览器。连接完成后,可以通过 browser.contexts()[0] 取得已有浏览器的默认上下文。
Playwright 官方同时指出,CDP 连接的能力完整度低于 Playwright 自身协议的 browserType.connect()。基础页面操作通常可以完成,但高级功能是否可用,需要结合具体产品实现和实际脚本验证。
不要直接导航已有业务标签页
测试已有浏览器环境时,不建议直接对 context.pages()[0] 执行 goto()。
第一页可能是用户正在使用的业务标签页,直接导航会改变它的 URL、页面内容和当前操作状态。
更稳妥的方式是在默认上下文中新建临时页面,完成连接检查后再关闭。即使如此,也建议在专用测试环境中执行,不要直接连接正在承载业务任务的环境。新建标签页仍可能触发扩展、启动页逻辑或其他产品侧行为。
const { chromium } = require("playwright");
async function main() {
const endpoint = process.env.CDP_ENDPOINT;
if (!endpoint) {
throw new Error("缺少 CDP_ENDPOINT 环境变量");
}
const browser = await chromium.connectOverCDP(endpoint, {
noDefaults: true,
timeout: 30_000,
});
let page;
try {
const context = browser.contexts()[0];
if (!context) {
throw new Error("未找到浏览器默认环境");
}
const existingPageCount = context.pages().length;
// 不修改已有业务标签页,单独创建临时测试页面
page = await context.newPage();
await page.goto("https://example.com", {
waitUntil: "domcontentloaded",
timeout: 30_000,
});
console.log({
contextCount: browser.contexts().length,
existingPageCount,
pageCountAfterNewPage: context.pages().length,
title: await page.title(),
url: page.url(),
});
} finally {
await page?.close().catch(() => {});
await browser.close().catch(() => {});
}
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
这段代码只检查:
- CDP 地址能否建立连接;
- 默认浏览器上下文是否存在;
- 连接前已经打开多少个页面;
- 能否在默认上下文中新建临时页面;
- 页面导航和基础内容读取是否正常;
- 测试结束时是否主动关闭临时页面。
Cookie、登录状态、代理出口和本地存储没有放进这个最小示例,因为它们需要使用目标业务对应的测试条件分别验证。
noDefaults的版本边界
noDefaults: true 从 Playwright v1.60 开始支持。
该选项用于连接已有默认上下文时,避免 Playwright 自动修改部分现有设置,包括下载行为、焦点模拟和媒体模拟等。
旧版本不识别该参数。建议升级 Playwright;必须兼容旧版本时可以删除该选项,但需要重新检查默认上下文是否被应用了 Playwright 的默认设置。
不同产品返回CDP地址的方式不同
连接地址可能来自:
- Local API 的启动响应;
- 本地客户端开放的调试端口;
- 远程浏览器返回的 WebSocket 地址;
- 云端浏览器的连接 URL。
取得地址后,还要确认浏览器环境的生命周期由哪一层负责。
对于通过 connectOverCDP() 取得的 Browser,调用 browser.close() 会断开当前 Playwright 连接,并清理通过该连接额外创建的浏览器上下文。
示例中的临时页面位于产品原有的默认上下文中,因此代码会先单独关闭临时页面,再断开 Browser 连接。
产品侧浏览器进程、默认上下文和浏览器环境数据如何处理,仍由具体产品的生命周期管理方式决定。
正式接入前,可以在测试环境中确认:
browser.close()后产品侧浏览器是否继续运行;- 默认上下文是否继续存在;
- 浏览器环境数据是否继续保存;
- 是否还需要调用产品 API 关闭环境;
- 断开后能否重新取得 CDP 地址并连接。
代码能够正常执行,只能证明浏览器连接和临时页面操作已经完成,不能证明代理出口、登录状态、成员权限、任务并发和长期运行都符合要求。

后台任务不只是增加一个headless参数
Headless 通常译为无头模式,指浏览器没有可视化窗口,但仍由程序控制页面。
产品支持 Headless,并不代表它已经提供完整的后台任务系统。
后台运行还需要继续检查:
- 任务由谁启动;
- 运行设备在哪里;
- 是否依赖桌面客户端;
- 同时可以运行多少环境;
- 超出并发后是否排队;
- 单个任务如何处理超时;
- 执行失败后是否支持重试;
- 是否记录日志和页面截图;
- 浏览器异常退出后如何处理;
- 任务完成后是否回收资源。
同样是 Playwright 脚本,一种方式可能需要成员先在电脑上打开客户端和环境,另一种方式则可以由服务器直接创建远程浏览器会话。
代码内容相似,运行和维护方式却完全不同。
什么时候需要人工打开浏览器
并非所有自动化任务都适合从开始到结束完全无人处理。
页面出现未预期的确认步骤、登录状态需要检查、数据内容需要成员判断,或者自动流程停在异常页面时,通常仍需要人工进入浏览器环境处理。
这类任务应重点检查:
- 后台运行时能否打开同一个浏览器环境;
- 人工操作与脚本是否共享 Cookie、本地存储和页面状态;
- 人工处理后,脚本能否从当前状态继续执行;
- 是否必须终止任务并重新启动环境;
- 其他成员是否有权打开和操作该环境;
- 自动执行与人工操作是否留下可查询的记录。
不同产品对人工处理的支持方式并不相同。有些工具主要提供无头浏览器或远程连接地址,异常处理需要开发人员自行实现;有些工具允许用户重新打开正在使用的浏览器环境,在保留当前会话数据的情况下完成检查或操作。
后台运行与人工操作交替时,关键在于无头执行与可视化操作是否共用同一个浏览器环境,以及人工处理后脚本能否继续执行。

几种工具的自动化入口有什么不同
不同产品把自动化能力放在不同位置。
有的以内置 RPA 为主要入口,有的通过 Local API 和 CDP 接入已有代码项目,也有产品提供远程浏览器、脚本运行器、容器部署或后台执行能力。
| 产品 | 官方列出的自动化入口 | 主要运行方式 | 使用前需要核对 |
| AdsPower | RPA、Local API、MCP,可连接 Selenium、Puppeteer 和 Playwright | 本地客户端环境与外部脚本接入 | 客户端依赖、成员权限、Local API 调用频率和套餐范围 |
| Dolphin Anty | Local API、CDP、Selenium、Puppeteer 和 Playwright | 本地客户端环境,可通过接口启动环境 | 客户端运行要求、请求设备和权限范围 |
| Octo Browser | API、CDP、Selenium、Puppeteer 和 Playwright | 持久环境和一次性环境 | API 请求限制、Token 权限和套餐范围 |
| GoLogin | REST API、远程浏览器、Puppeteer 和 Playwright | 本地 Orbita 环境或云端浏览器会话 | 远程资源、连接方式、并发和计费范围 |
| Multilogin | API、CLI、脚本运行器、Headless、Docker 和常见自动化框架 | 本地客户端、脚本运行和容器部署 | 不同入口的权限、部署要求和套餐范围 |
| Web4 Browser | CDP、Selenium、Puppeteer、Playwright 和无头执行 | 本地浏览器环境、后台执行和可视化操作 | 后台功能、运行日志、并发、成员权限和功能开放范围 |
功能名称相同,不代表实际工作方式相同。
例如,两款产品都支持 Playwright,其中一款可能要求客户端保持运行、先调用本地接口启动环境,并让脚本与客户端部署在同一台设备;另一款则可能提供远程浏览器地址,由服务器直接建立连接。
比较自动化能力时,需要把接口名称还原成实际运行流程。
根据任务决定先检查哪一层
| 当前任务 | 优先检查的能力 |
| 固定步骤主要由运营人员维护 | RPA 编辑器、元素定位、节点修改、条件循环和失败日志 |
| 已经有 Playwright、Puppeteer 或 Selenium 项目 | Local API、CDP、连接地址、Token 权限和浏览器生命周期 |
| 需要定时、批量或持续运行 | Headless、服务器或容器部署、并发、队列、日志和重试 |
| 自动任务中需要人工判断 | 同一环境的可视化操作、会话数据连续性、成员权限和任务恢复 |
固定步骤由运营人员维护时,RPA 仍可能是成本更低的方式;已有代码项目则应优先核对 API、CDP 和浏览器生命周期。只有 CDP 连接而没有队列、日志和重试时,任务调度与异常处理仍需自行开发。
用一项测试任务检查候选工具
可以在内部测试页、example.com 或专门建立的测试环境中完成以下检查:
- 创建一个独立浏览器环境;
- 为环境绑定测试代理;
- 通过 API 或产品界面启动环境;
- 获取 CDP 或 WebDriver 地址;
- 使用 Playwright 打开测试页面;
- 读取页面标题、URL 和一项内容;
- 写入一项测试 Cookie 或本地存储;
- 关闭并重新打开环境;
- 检查测试状态是否仍然存在;
- 在脚本运行期间打开可视化窗口;
- 检查错误信息、日志和成员权限;
- 同时启动多个测试环境,观察并发和资源占用。
完成这轮检查后,结果应能说明任务是否可以运行、部署条件是否匹配、异常能否定位,以及需要人工处理时能否继续使用原来的浏览器环境。
产品功能表可能很接近,但任务怎样启动、在哪里运行、由谁维护,以及失败后如何处理,才会真正改变工具选择。

475

被折叠的 条评论
为什么被折叠?



