Appium 项目发展史:从 iOSAuto 到跨平台自动化生态
Appium 项目发展史从 iOSAuto 到跨平台自动化生态【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appium导读本文基于 Appium 项目历史文档仓库内同步维护了 英文版 与 中文版完整梳理这个跨平台自动化框架从 2012 年诞生至今的演进历程它如何在三年内两度改写实现语言C# → Python → Node.js、如何从 Apple 私有工具的替代品成长为基于 W3C WebDriver 协议的开源生态。读完本文你将理解 Appium Driver/Plugin 扩展 WebDriver 标准 这一架构设计的由来以及 Appium 2.0 生态化转型、Appium 3.0 现代化清理在仓库源码中的具体落点。缘起iOS 测试之痛与自动化灵光2011 年Dan Cuellar 在 Zoosk 担任测试经理时遇到了一个现实问题iOS 产品的测试通过时间越来越长。减少测试固然可行但风险太高——尤其考虑到 iOS App Store 审核流程需要好几天才能通过一个补丁。Dan 回想起自己在 Web 领域的工作经验意识到自动化才是答案。但他调研了当时的工具格局发现每一个选项都有致命短板Apple 官方 UIAutomation要求测试必须用 JavaScript 编写不支持实时调试与解释执行而且必须在 Xcode 的性能分析工具 Instruments 内部运行第三方工具普遍依赖私有 API并要求把 SDK 和 HTTP 服务器嵌入到被测应用里侵入性过强。不满于现有方案Dan 向经理申请了两周时间做技术探索目标是用 Apple 官方批准的技术实现 iOS 自动化。他的第一个尝试是用 AppleScript 通过 OS X 辅助功能AccessibilityAPI 向 Mac UI 元素发送消息——这在一定程度上可行但永远无法作用于真实设备。iOSAuto 诞生三条命令拼出的解释器转折点在于一个大胆的设想能否让 UIAutomation 框架像解释器一样实时运行Dan 的研究结论是只需在 UIAutomation 的 JavaScript 程序内部找到一种方式去接收命令 → 执行命令 → 回复命令。他利用 Apple 提供的 shell 命令执行工具用一条极其巧妙的管道实现了这个实时解释器用cat读取按顺序排列的文本文件来接收命令用eval()执行读到的输出用python把执行结果写回磁盘。随后他用 C# 编写了实现 Selenium 风格语法的代码把操作翻译成顺序排列的 JavaScript 命令——iOSAuto 就此诞生。这套文件管道 解释执行的原型虽然简陋却已经确立了 Appium 直到今天都未曾改变的核心形态一个接收命令、调度执行、返回结果的自动化服务端。2012 年 Selenium 大会从演讲到闪电演讲Dan 原本受邀在伦敦的 Selenium Conference 2012 上演讲一个完全不同的主题。作为演讲的一部分他顺带演示了用 Selenium 语法驱动 iOS 自动化——展示了用通用接口 平台专属页面对象编写平台无关测试的架构。出乎他意料的是精妙的测试架构反而被iOS 测试跑得像 WebDriver 测试这一奇观抢了风头多位与会者建议他在会后的闪电演讲环节专门讲解实现原理。会议第二天Dan 上台做闪电演讲而主持这场演讲的正是 Selenium 联合创始人 Jason Huggins。Dan 的演示文稿一度加载失败Jason 险些不得不跳过好在最后一刻屏幕亮起Dan 在五分钟内讲完了实现细节并恳求贡献者加入。当时掌声礼貌而平淡但种子已经埋下。电话响起Selenium 之父的介入四个月后Jason 主动联系了 Dan——他正在 Sauce Labs 为客户做 iOS 测试支持想起了那次闪电演讲认为 iOSAuto 可能有用但 Dan 的源码并未公开。两人在旧金山的一家酒吧见面Dan 展示了 iOSAuto 的完整代码。作为资深开源布道者Jason 力劝 Dan 以开源许可证发布代码。此后的节奏非常紧凑2012 年 8 月Dan 在 GitHub 上以 C# 发布源码随后应 Jason 建议改用 Python 重写以降低贡献门槛、吸引更多开发者9 月Jason 亲自加入一个 Web 服务器并开始通过 HTTP 实现 WebDriver wire 协议——这让 iOSAuto 可以被任何语言、任何 Selenium WebDriver 客户端库远程脚本化。这一步意义深远AppiumHTTP 服务器 WebDriver 协议 多语言客户端的架构雏形在此刻已经定型。关于这套架构如何运作可进一步阅读 Appium 工作原理文档。命名风波从 AppleCart 到 AppiumJason 决定让项目在当年 11 月的 Mobile Testing Summit 上亮相但建议先换个名字。团队头脑风暴后选中了AppleCart。然而一天后Jason 翻阅 Apple 的版权与商标保护指南时发现Apple 声明会捍卫商标权的示例名称列表里第一个赫然就是 AppleCart。他立刻电话告知 Dan两人再次集思广益最终 Jason 灵光一闪——Appium: Selenium for Apps。这个名字精准概括了项目定位把 Selenium 在 Web 领域验证过的 WebDriver 模式移植到应用App自动化领域。Sauce Labs 与 Node.js项目的第二次重生2013 年 1 月Mobile Testing Summit 后不久Sauce Labs 决定全力支持 Appium 并提供更多开发人力。由 Jonathan Lipps现任项目负责人参与的专项工作组评估后认为Appium 需要一次重生并最终选定Node.js作为实现框架。理由非常务实Node 是公认快速高效的 Web 服务器后端而归根结底Appium 就是一个高度专业化的 Web 服务器JavaScript 语言足够平易近人有助于 Appium 吸引更大的开源开发者社区。团队仅用几天时间就在既有工作基础上重写出了功能与 Python 版相当的新版本为 Appium 的基本架构打下了地基。几周后Jonathan Lipps 被正式指定为项目负责人开始筹划社区参与战略。值得注意的是这一核心服务端 协议解析的架构判断至今仍能在仓库中看到影子packages/appium的入口核心 AppiumDriver 本质上仍是一个负责接收 HTTP 命令、解析能力参数、调度会话的 Web 服务器枢纽。走向世界第一个真正的跨平台自动化框架Jonathan 判断让 Appium 在尽可能多的会议和聚会上露面是吸引用户与贡献者最好的方式。Appium 以新形态在 2013 年 Google 测试自动化大会上首次公开亮相随后一年内相继在美国各地以及英国、波兰、葡萄牙、澳大利亚的会议和 Meetup 上被展示。宣传之外项目本身也在高速发展2013 年初发布 Android 与 Selendroid 支持使 Appium 成为第一个真正意义上的跨平台自动化框架2013 年底项目提交数已超过 1000 次。通往 Appium 1.0里程碑与治理公开化2014 年 5 月Appium 1.0发布成为项目发展的重要里程碑。围绕这一版本项目在稳定性修复、缺陷优先级处理和功能扩展上全面提速Sauce Labs 持续投入更多开发人力而整个社区始终参与项目方向与治理的讨论——治理工作一直公开进行于邮件列表和 GitHub issue 跟踪器之上。这段历史在今天的仓库中仍有延续项目治理文档 GOVERNANCE.md 详细规定了技术委员会TC、Committer 机制、赞助分级与贡献者报酬方案印证了治理在公开中演进的传统。架构重写从单体到可扩展的 Driver 生态随着项目壮大一个问题逐渐浮出水面Appium 代码库并没有针对大型分布式、兼职贡献者团队进行优化。Committer 团队因此决定从零重写 Appium使用更现代的 JavaScript 语言版本并重构架构使其便于用户或第三方开发者构建自己的 Appium Driver——目标是降低新贡献者的上手门槛并让核心团队之外的组织也能为 Appium 添加新平台支持。这一愿景很快得到验证微软为 Windows 桌面应用自动化贡献了驱动Youi.tv 为自家应用自动化贡献了驱动。可以说这次重写为后来 Appium 2.0 的生态化转型埋下了伏笔。献给人民从 Sauce Labs 到 OpenJS 基金会2016 年底Sauce Labs 将 Appium 作为项目捐赠给JS 基金会以此向全世界固化Sauce 承诺 Appium 保持开源的决心。JS 基金会是一家非营利开源管理组织负责持有开源项目的版权并保障其在社区中的长期健康发展。此举为个人贡献者以及众多受益于 Appium 的公司敞开了更宽的大门。后来 JS 基金会并入OpenJS 基金会Appium 成为其 Impact Project影响力项目。Appium 2.0从一体化项目到生态系统2023 年发布的Appium 2带来了彻底重构的架构核心转变是Appium 不再是一个一体化项目而是一个生态系统。任何人现在都可以开发和分享自己的 Appium 扩展——Driver驱动与 Plugin插件从而为远超 iOS/Android 的平台开启自动化可能。由此催生了大量第三方扩展面向 Flutter 和 Windows 的新驱动、用于 API 模拟和设备农场管理的插件、基于 Rust 和 Swift 的新客户端等。Appium 2 的生态化架构在当前仓库中有非常直接的代码体现仓库本身是 Lerna 管理的 monorepo见 lerna.jsonpackages/下并列着appium核心服务器、base-driver、base-plugin、types、schema、support等基础包以及fake-driver、fake-plugin、images-plugin、universal-xml-plugin、storage-plugin等示例/官方扩展包核心包 appium.ts 中定义的AppiumDriver扮演umbrella driver伞形驱动角色它维护会话表sessions、加载并实例化平台驱动与插件、按命令分发到对应的会话驱动或插件链executeCommand中同时处理服务状态、伞形命令、会话命令三类情况插件通过wrapCommandWithPlugins逐层包装默认行为。这正是在源码层面对生态化架构的落实扩展管理安装、卸载、更新 Driver/Plugin由 extension 模块 及appium driver/pluginCLI 承担README 中给出了appium driver install driver-name、appium plugin install plugin-name等完整命令示例。也是在这一时期Appium 启动了赞助计划吸引了大大小小的赞助商并借此为社区贡献者的志愿工作提供报酬——具体方案Development Partners、Strategic Partners、Gold/Silver/Bronze、Backers 分级以及按月报酬机制在 GOVERNANCE.md 中有完整定义。Appium 3.0减法与现代化2025 年发布的Appium 3体量比 Appium 2 小得多只包含少量行为变更重点在于移除弃用代码、适配更现代的生态。这种范围的收缩实属意料之中——自 Appium 2 起主要功能开发工作就已转移到各个独立的 Driver 与 Plugin 上其中许多扩展在 Appium 2 时代已经历了多次大版本更新。当前仓库状态与这段描述完全吻合核心包 package.json 版本号为3.7.0要求的运行环境为 Node.js^20.19.0 || ^22.12.0 || 24.0.0与 npm10其依赖大量复用appium/*命名空间下的基础包base-driver、base-plugin、types、schema、support、logger等。此外ROADMAP.md 列出了 WebDriver BiDi 支持、自动生成命令文档等未竟事项为未来版本预留了方向。结语三段语言、三次转折一个不变的协议回望 Appium 的历程可以提炼出三条清晰的主线语言演进C# 原型 → Python 重写 → Node.js 重生每一次语言变更都以降低贡献门槛、贴近 Web 服务器本质为逻辑架构演进单体服务器 → 可插拔 Driver → Driver Plugin 的完整生态系统驱动力量始终是让更多组织和个人参与进来不变的根基自 2012 年 Jason 实现 HTTP WebDriver 协议起Appium 就始终围绕 W3C WebDriver 这一开放标准运转——这正是其能够跨平台、多语言、兼容云端的前提。如果你希望更深入地理解这套架构的实际运行方式可以从 Appium 工作原理、核心实现 以及 基础驱动包 继续探索。【免费下载链接】appiumCross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol项目地址: https://gitcode.com/GitHub_Trending/ap/appium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考