从Selenium到Playwright:构建高可用浏览器自动化系统的工程实践
1. 从“摸鱼”到“摸大鱼”一个开源项目的诞生大家好我是猫猫。如果你在开源社区或者技术论坛里混迹过可能对这个名字有点印象。几年前我发起了一个叫“OpenClaw”的开源项目初衷很简单我想做一个能帮我自动处理一些重复性网页操作的工具比如定时签到、数据监控、信息聚合。那时候我管这个叫“摸鱼工具”——用技术解放双手把时间留给更有意思的事情。但做着做着事情就变味儿了。我发现单纯写个脚本“摸鱼”太没挑战性了。社区里的小伙伴们开始提出各种稀奇古怪的需求“能不能让它模拟更复杂的操作流”“怎么处理动态加载的页面”“遇到验证码怎么办”……这些问题指向了一个更深层的领域浏览器自动化。这不再是简单的“摸鱼”而是试图去“摸”一条结构复杂、行为多变的“大鱼”。于是“OpenClaw”从一个自娱自乐的小脚本逐渐演变成一个试图解决通用网页自动化难题的框架。我给它起了个中文名叫“龙虾”一方面是因为“Claw”钳子这个词另一方面我觉得写自动化脚本就像剥龙虾你得有耐心懂结构知道从哪里下手才能吃到最鲜美的肉。这个“龙虾系列教程”就是我这几年“剥龙虾”的心得记录。它不是某个特定工具比如Selenium或Puppeteer的官方文档翻译而是从一个实际项目开发者的角度去拆解在构建一个健壮的自动化系统时你会遇到的所有核心问题、技术选型的思考、以及那些官方文档里不会写的“坑”。2. OpenClaw“龙虾”项目的核心定位与技术栈选择在开始具体教程之前我们必须先搞清楚OpenClaw到底是什么以及我为什么选择这样一套技术栈。这决定了后续所有教程的视角和深度。OpenClaw不是一个单一的库或驱动而是一个“胶水层”和“最佳实践”的集合。它的目标不是替代Selenium、Playwright或Puppeteer这些优秀的底层驱动而是在它们之上构建一套更符合中文开发者习惯、更专注于解决实际业务场景中“脏活累活”的抽象层和工具链。最初我主要基于Selenium进行开发。原因很直接生态成熟、资料多、支持语言广Python, Java, JavaScript等。对于大多数常规的自动化任务比如表单填写、按钮点击、数据抓取Selenium配合WebDriver是完全够用的。我在教程的初级阶段也会大量使用Selenium作为示例因为它最利于理解浏览器自动化的基本原理。但随着项目复杂度的提升Selenium的局限性也暴露出来协议陈旧基于古老的WebDriver协议通信效率较低尤其是在处理大量页面或复杂交互时。对现代Web技术支持滞后对于单页应用SPA的动态内容加载、Shadow DOM、复杂的网络请求拦截等场景需要写大量额外代码来适配稳定性不佳。环境依赖重需要匹配特定版本的浏览器和WebDriver环境搭建和维护成本高。因此在OpenClaw的进阶架构中我引入了Playwright和Puppeteer作为核心驱动选项。特别是Playwright它由微软开发直接通过CDPChrome DevTools Protocol等现代协议与浏览器通信原生支持多浏览器Chromium, Firefox, WebKit并且内置了等待网络空闲、自动等待元素等智能机制大大提升了脚本的稳定性和编写效率。OpenClaw的技术栈可以这样概括驱动层兼容并抽象Selenium、Playwright、Puppeteer。提供统一的API接口让业务代码无需关心底层驱动是哪一个。核心层任务调度器管理自动化任务的执行队列、优先级、重试机制。状态管理机这是“龙虾”的精华。网页操作不是线性的一个操作的成功与否往往取决于页面当前处于什么“状态”。我们定义了“状态”如登录页、主页、列表页、详情页和“动作”如输入账号、点击搜索、解析表格由状态机来驱动整个自动化流程使代码逻辑无比清晰。插件系统支持自定义插件例如验证码识别插件、数据存储插件、消息通知插件等。应用层提供CLI命令行工具、Web管理界面可选方便任务配置、监控和日志查看。所以当你跟着这个系列学习时你学到的不仅仅是“如何使用某个API”更是如何设计一个可维护、可扩展、高可用的浏览器自动化系统的工程思想。我们会从最简单的Selenium脚本开始逐步深入到用状态机模式组织复杂业务最后探讨如何用Playwright等现代工具提升性能和稳定性。3. 系列教程文章目录与学习路径规划本系列教程将采用“由浅入深、螺旋上升”的方式组织。每一篇都是独立的实战案例但前后又有逻辑关联。你可以根据自身情况跳读但我建议新手按顺序学习以建立完整的知识体系。3.1 第一阶段基础入门与环境搭建“认识龙虾”这个阶段的目标是让你快速上手写出第一个能跑的自动化脚本并理解最基本的概念。【环境准备篇】手把手搭建跨平台的PythonSelenium/Playwright开发环境。内容Python虚拟环境管理、浏览器驱动Chromedriver/Geckodriver的自动下载与配置、Playwright的安装与浏览器下载。重点解决“为什么我的代码跑不起来”的环境问题。实操心得强烈推荐使用pipenv或poetry管理项目依赖并使用webdriver-manager这类库自动管理WebDriver版本能避免80%的环境冲突。【第一个脚本】让“龙虾”打开百度搜索一个关键词并打印结果标题。内容学习最基本的WebDriver对象、元素定位ID, Name, XPath, CSS Selector、元素操作click, send_keys。理解“隐式等待”和“显式等待”的区别与重要性。避坑指南新手最常犯的错误就是不用等待。页面还没加载完就去操作元素必然报错。我们会详细讲解WebDriverWait和expected_conditions的用法这是编写稳定脚本的基石。【元素定位进阶】面对没有ID、Name的“刁钻”元素如何精准定位内容深入讲解XPath和CSS Selector的高级语法。如何利用Chrome DevTools的Copy功能快速获取定位器如何编写相对路径和属性匹配如何应对动态ID经验技巧优先使用CSS Selector因为它的性能通常优于XPath。对于复杂路径可以尝试用//button[contains(text(), ‘提交’)]这类包含文本的XPath但要注意其可能带来的维护成本。3.2 第二阶段核心技能与模式突破“解剖龙虾”掌握基础后我们要解决自动化脚本中最令人头疼的问题不稳定。这个阶段将引入核心设计模式和高级API。【等待的艺术】告别time.sleep构建健壮的等待策略。内容详细对比隐式等待、显式等待、固定等待的优劣。如何自定义等待条件Playwright中page.wait_for_selector,page.wait_for_function等更优雅的等待方式。核心原理自动化脚本的本质是模拟人。人看到页面加载完成、按钮出现后才点击。我们的代码也要学会“观察”页面状态而不是盲目等待固定时间。【处理弹窗与多窗口】遇到登录框、广告弹窗、新标签页怎么办内容学习driver.switch_to.alert,driver.switch_to.window。如何获取和切换窗口句柄如何处理JavaScript触发的模态框。实操案例实现一个自动关闭页面中随机出现的广告弹窗的通用函数。【文件上传与下载】自动化不只有点击和输入。内容对于input type”file”元素如何通过send_keys传入本地文件路径如何设置Chrome/Firefox的下载目录并监控文件是否下载完成避坑指南有些网站的文件上传使用了自定义组件无法通过常规的input元素上传。这时需要用到pyautogui模拟键盘操作或者更高级的通过CDP协议直接注入文件。【状态机模式实战】OpenClaw的核心设计模式。内容从一个真实的网站登录-搜索-翻页-抓取流程出发演示如何将线性脚本重构为状态机。定义状态State、动作Action、转换条件Transition。代码示例# 伪代码示例 class LoginState(State): def run(self, context): if self.is_login_page(context.driver): context.driver.find_element(...).send_keys(username) # ... 执行登录动作 return SearchState() # 转换到搜索状态 else: return self # 保持当前状态价值状态机模式让代码逻辑像流程图一样清晰易于调试和扩展。新增一个业务流程只需要增加新的状态类即可。3.3 第三阶段高级应用与性能优化“烹饪龙虾”当你的脚本能稳定运行后就该考虑如何让它跑得更快、更强、更隐蔽。【对抗反爬虫机制】如何让“龙虾”更像真人内容设置User-Agent、窗口大小、禁用WebDriver特征如navigator.webdriver。使用代理IP池。引入随机延迟和模拟人类操作轨迹如鼠标移动曲线。重要提醒本教程所有内容仅用于学习和技术交流请严格遵守目标网站的robots.txt协议尊重网站运营者的劳动不得用于任何非法或侵权的数据爬取活动。【Playwright/ Puppeteer 深度应用】拥抱现代浏览器自动化。内容为什么选择Playwright学习其核心概念Browser, Context, Page。使用page.route拦截和修改网络请求。利用page.evaluate执行页面内JavaScript。录制和生成脚本。性能对比通过一个实际的多页面抓取任务对比Selenium和Playwright在速度和资源占用上的差异。【分布式与并发执行】从一只“龙虾”到一支“龙虾军团”。内容使用concurrent.futures或多进程库实现单机并发。介绍如何结合消息队列如Redis和任务队列如Celery构建分布式的自动化任务集群。架构思考如何设计任务分片如何管理大量浏览器实例的生命周期如何收集和汇总结果【容器化与部署】让“龙虾”在服务器上安家。内容使用Docker将你的自动化项目及其依赖包括浏览器打包成镜像。编写Dockerfile处理无头浏览器在容器中运行的特殊问题如缺少字体、沙箱模式。使用Docker Compose编排服务。部署实践如何在云服务器上通过Docker Compose一键启动你的整个自动化系统。3.4 第四阶段生态扩展与项目实战“品味龙虾”最后我们将OpenClaw项目本身和所学知识融会贯通完成几个有代表性的实战项目。【OpenClaw插件开发指南】如何为“龙虾”打造专属工具。内容了解OpenClaw的插件接口规范。实战开发一个“企业微信通知插件”任务完成后发送通知和一个“简易验证码识别插件”集成第三方OCR服务。【实战项目一自动化日报/周报生成器】。内容模拟登录内部系统抓取JIRA/GitLab等平台的工作项数据自动整理并填充到Confluence或Notion的模板中生成格式规范的日报/周报。【实战项目二电商价格监控与预警系统】。内容定时监控多个电商平台特定商品的价格、库存、促销信息。使用状态机处理不同平台的页面结构差异。当价格达到预设阈值时通过邮件或钉钉发送预警。【实战项目三跨平台信息聚合机器人】。内容综合运用所有技能设计一个机器人定时从新闻网站、技术博客、社交媒体等多个来源抓取你关心的主题信息经过去重和摘要处理后通过Telegram Bot或微信公众号推送给你。4. 学习本系列前的必要准备与心态调整在正式踏入“龙虾”世界之前我想分享几点至关重要的准备工作和正确的心态这能让你事半功倍。技术准备编程基础你需要具备基本的Python语法知识。了解变量、函数、类、异常处理等概念。本系列不会从零开始教Python但所有代码都会力求清晰易懂。前端常识对HTML、CSS和JavaScript有最基本的了解。不需要会写但需要能看懂网页的大致结构知道什么是标签、属性、DOM树。这会让你在元素定位时心中有数。开发环境一台可以安装Python和浏览器的电脑Windows, macOS, Linux均可。我推荐使用VS Code或PyCharm作为代码编辑器。心态调整拥抱变化Web自动化是与前端页面深度绑定的技术。你今天写的脚本可能因为目标网站的一次前端改版而完全失效。因此编写可维护、易修改的代码比写一个一次性跑通的脚本重要得多。状态机模式就是为了应对这种变化而生的。耐心调试自动化脚本的调试过程往往比普通业务代码更繁琐。你面对的是一个黑盒浏览器和一个动态环境网络、页面状态。学会熟练使用浏览器的开发者工具F12特别是“Elements”和“Console”面板是必备技能。理解原理不要满足于复制粘贴代码。务必理解每一行代码背后的含义以及为什么在这个场景下要用这个方法而不是另一个。例如理解“等待”的原理你就能自己创造出适合各种复杂场景的等待条件。合法合规这是最重要的原则。技术是一把双刃剑。请将所学知识用于提升个人工作效率、进行合法的数据分析和测试或在获得明确授权的情况下进行。尊重网站的服务条款和robots.txt文件避免对目标服务器造成过大压力。5. 如何获取代码、参与社区与贡献“OpenClaw龙虾”项目本身是开源的所有的教程示例代码也会配套提供。项目仓库你可以在GitHub上搜索OpenClaw找到项目主页。仓库里不仅有核心框架代码还有一个examples目录里面包含了教程中大部分案例的完整可运行代码。问题反馈在学习过程中如果发现教程中的任何错误或者代码无法运行欢迎在GitHub仓库的Issues页面提出。描述清楚你的环境、操作步骤和报错信息我会尽快查看和修复。交流社区我建立了一个技术交流群这里不提供具体联系方式请通过项目仓库主页的链接或说明查找加入方式方便大家讨论在学习、使用OpenClaw过程中遇到的问题分享各自的自动化脚本和奇思妙想。贡献指南如果你对项目感兴趣非常欢迎贡献代码无论是修复错别字、完善文档、增加新的示例还是开发一个功能插件都是宝贵的贡献。项目仓库里有详细的CONTRIBUTING.md指南会告诉你如何提交Pull Request。这个教程系列是我过去几年在浏览器自动化这个“坑”里摸爬滚打的总结。它不追求面面俱到但力求讲透我在实际项目中遇到的真问题、真解法。我希望它能成为你手中的一把“龙虾钳”帮你高效地处理那些繁琐、重复的网页操作真正把技术变成提升效率、创造价值的工具而不仅仅是“摸鱼”。让我们开始吧第一站从配好环境开始。

相关新闻

红蓝对抗实战:网络安全演练的核心技术与最佳实践

红蓝对抗实战:网络安全演练的核心技术与最佳实践

1. 红蓝对抗的本质与价值定位红蓝对抗本质上是一场精心设计的网络安全实战演练,通过模拟真实攻击场景来检验防御体系的有效性。不同于传统渗透测试的单向检测,这种对抗模式更强调动态博弈和即时响应。在金融行业某次对抗中,蓝队仅用47秒就发现…

2026/10/17 13:15:00 阅读更多 →
Java instanceof 运算符深度解析:从核心机制到实战避坑指南

Java instanceof 运算符深度解析:从核心机制到实战避坑指南

1. 从一次线上故障说起:为什么我们绕不开instanceof那天晚上,系统监控突然告警,一个核心服务的接口响应时间飙升,错误率瞬间涨到10%。我们紧急排查日志,发现大量ClassCastException异常堆栈,指向一段处理多…

2026/10/16 11:17:17 阅读更多 →
微信小程序订阅消息API深度解析:从wx.requestSubscribeMessage调用到实战避坑

微信小程序订阅消息API深度解析:从wx.requestSubscribeMessage调用到实战避坑

1. 项目概述:从一次“无效调用”说起那天下午,我正在调试一个电商类小程序的下单后发货通知功能。逻辑很简单:用户支付成功,点击“确认订单”按钮,理应弹出一个订阅消息的授权窗口,让用户选择是否接收后续的…

2026/10/9 3:00:38 阅读更多 →

最新新闻

ORM选型:MyBatis、MyBatis-Plus与JPA怎么选

ORM选型:MyBatis、MyBatis-Plus与JPA怎么选

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
主动均衡原理与MP2642GR-Z+PIC18F8520工程实现

主动均衡原理与MP2642GR-Z+PIC18F8520工程实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
PacketTracer设备接入OneNET云平台:物联网上云的仿真到真实实践

PacketTracer设备接入OneNET云平台:物联网上云的仿真到真实实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
基于MP2642GR-Z与PIC18F4455的两节串联电池主动均衡方案设计与实现

基于MP2642GR-Z与PIC18F4455的两节串联电池主动均衡方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
claude code常用指令速查:从slash命令到CLI flags的TaoToken实战手册

claude code常用指令速查:从slash命令到CLI flags的TaoToken实战手册

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:14:22 阅读更多 →
Visual Studio Debug/Release 自动切换库路径与DLL拷贝方案

Visual Studio Debug/Release 自动切换库路径与DLL拷贝方案

1. 这个需求到底在解决什么问题做过Windows平台C开发的人,大概率都遇到过这样一个场景:你写了一个基础库,编译出来两个版本——Debug版和Release版,分别放在Debug/和Release/两个目录下。然后你有一个上层应用工程,开发…

2026/10/17 13:13:21 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →