Appium 客户端(Client)入门:理解客户端-服务器架构与多语言测试编写
【免费下载链接】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 的自动化体系中,客户端(Client)是与服务器(Server)对应的另一半:测试作者通过客户端编写测试脚本,客户端负责把脚本翻译成符合 W3C WebDriver 规范的 HTTP 请求发送给 Appium 服务器,并接收执行结果。本篇指南以 Appium 客户端简介 为主体,系统讲解客户端的定位、WebDriver HTTP API 的本质、五种主流语言下"查找元素 → 点击 → 读取文本 → 获取页面源码"这一经典流程的实现方式,并结合本仓库源码(packages/base-driver/lib/protocol/routes/)印证命令与 HTTP 端点的真实对应关系,帮助你理解"为什么 Appium 测试写起来像原生代码,底层却是 HTTP 协议"。
Appium 客户端是什么:客户端-服务器架构中的"半壁江山"
与 Appium 工作原理概述 中讨论的原因一致,Appium 建立在 W3C WebDriver 规范之上,因此天然实现了客户端-服务器(client-server)架构,两侧各司其职:
- 服务器(Server):由 Appium 本体以及你为自动化所安装的驱动(Driver)和插件(Plugin)组成,它直接连接被测设备,并真正负责在设备上执行自动化动作。服务器端的工作方式详见 Appium 驱动简介。
- 客户端(Client):由你——Appium 测试作者——来驱动。客户端负责通过网络向服务器发送命令,并接收服务器返回的响应。这些响应既能告诉你某条自动化命令是否执行成功,也可能包含你查询到的应用状态信息(例如元素文本、页面源码等)。
从协议层面看,客户端和服务器不要求运行在同一台机器上,只要客户端能通过网络向服务器发起 HTTP 请求即可。这一点正是 Appium 可以接入云测平台(云端托管 Appium 服务器、驱动与设备,本地脚本只需指向其安全端点)的架构基础。
命令从哪来:语言无关的 WebDriver HTTP API
在一场自动化会话(Session)中,究竟有哪些自动化命令可用?答案取决于你当前使用的驱动和插件。一组跨平台通用的标准命令至少包括:
- Find Element(查找元素)
- Click Element(点击元素)
- Get Page Source(获取页面源码)
- Take Screenshot(截取屏幕截图)
关键点在于:在 WebDriver 规范中,这些命令并不以任何特定编程语言定义。它们不是 Java 命令、不是 JavaScript 命令、也不是 Python 命令,而是共同构成一套HTTP API——理论上任何语言都可以调用它,甚至不需要语言,直接用 cURL 就能与 Appium 服务器对话。
以Find Element命令为例,它对应的就是一个发送到POST /session/:sessionid/element的 HTTP 请求,其中:sessionid是服务器在之前调用Create Session(创建会话)时生成的唯一会话 ID 占位符。
源码印证:路由表如何把命令映射到端点
上述命令与 HTTP 端点的对应关系并不是约定俗成,而是直接写在 Appium 的协议路由实现中。在 packages/base-driver/lib/protocol/routes/w3c.ts 里可以找到完整映射。例如:
POST /session/:sessionId/element映射到findElement命令,且payloadParams要求请求体中必须携带using和value两个字段(w3c.ts#L106-L110)——这正是文档示例中"using参数为xpath、value参数为 XPath 查询串"的协议依据;GET /session/:sessionId/element/:elementId/text映射到读取元素文本的命令(w3c.ts#L157-L159);POST /session/:sessionId/element/:elementId/click映射到点击元素(w3c.ts#L175-L177);GET /session/:sessionId/source映射到获取页面源码(w3c.ts#L191-L193);GET /session/:sessionId/screenshot映射到截图(w3c.ts#L239-L241)。
同一份路由表还维护着向后兼容的 JSON Wire Protocol(jsonwp.ts)等协议变体。换句话说:WebDriver 协议层的"翻译字典"就在仓库的路由文件里,客户端库所做的,本质上就是替你把语言代码转换成这些端点上的一次次 HTTP 调用。
为什么需要客户端库:把 HTTP 翻译成你熟悉的语言
协议层面的知识主要对开发 WebDriver 相关工具的人有价值,对想编写 Appium 或 Selenium 测试的人来说帮助有限。当你写测试时,当然希望用自己熟悉的语言。幸运的是,有一批 Appium 客户端库 承担了与 Appium 服务器"说 HTTP"的全部职责——它们为特定语言暴露出一组"原生"风格的命令,让测试作者感觉就是在写 Python、JavaScript 或 Java,而不是在拼 HTTP 报文。
这些库在文档中有几种叫法:clients(客户端)、client libraries(客户端库)或 client bindings(客户端绑定),含义完全相同。
同一组操作的五种语言实现
下面这段示例用五种不同语言、借助各自推荐的 Appium 客户端绑定,实现了同一组操作(注意:这不是包含完整 import 的可运行代码,完整的工程配置与命令参考请查阅各客户端库的文档):
// JavaScript (WebdriverIO) const element = await driver.$('//*[@text="Foo"]'); await element.click(); console.log(await element.getText()) console.log(await driver.getPageSource())// Java WebElement element = driver.findElement(By.Xpath("//*[@text='Foo']")) element.click() System.out.println(element.getText()) System.out.println(driver.getPageSource())# Python element = driver.find_element(by=By.XPATH, value='//*[@text="Foo"]') element.click() print(element.text) print(driver.page_source)# Ruby element = driver.find_element :xpath, '//*[@text="Foo"]' element.click puts element.text puts driver.page_source// C# (.NET) AppiumElement element = driver.FindElement(MobileBy.AccessibilityId("Views")); element.click(); System.Console.WriteLine(element.Text); System.Console.WriteLine(driver.PageSource);底层都在做同一件事
尽管语言各不相同,这几段脚本在底层执行的协议操作完全一致:
- 调用
Find Element命令,using参数为xpath,value参数为查找元素所用的 XPath 查询表达式; - 调用
Click Element命令,传入上一步找到的元素的 ID; - 调用
Get Element Text命令,传入同一元素的 ID,并把结果打印到控制台; - 调用
Get Page Source命令,获取页面/应用源码并打印到控制台。
对照前面 w3c.ts 的路由定义可以看到:第 1 步命中POST /session/:sessionId/element(w3c.ts#L106-L110),第 2 步命中POST /session/:sessionId/element/:elementId/click(w3c.ts#L175-L177),第 3 步命中GET /session/:sessionId/element/:elementId/text(w3c.ts#L157-L159),第 4 步命中GET /session/:sessionId/source(w3c.ts#L191-L193)。客户端库把每一次"看起来像本地方法调用"的语句,都翻译成了对应的 HTTP 请求。
另外可以留意一个细节:示例中查找元素使用的xpath策略属于 WebDriver 规范中的标准定位策略,但 Appium 生态还通过协议扩展提供了accessibility id、-ios predicate string、-android uiautomator等移动端专用策略。这些扩展同样遵循"有效且符合规范"的协议扩展原则,相关内容在 Appium 工作原理概述 中有更完整的说明。
选择客户端时需要注意的现实问题
在选定并使用某个客户端前,还有一件事必须了解:每个客户端都是独立维护的。
- 某个客户端支持的功能,另一个客户端未必支持(当然,所有客户端至少都支持标准 W3C 协议以及常见的 Appium 扩展);
- 某个客户端有很好用的辅助函数(helpers),另一个客户端可能没有;
- 有的客户端更新非常频繁,有的则可能长期不更新。
因此在选择库时,第一考虑因素是语言(你想用哪种语言写测试),第二考虑因素是这个库的功能完整度与维护活跃度。
此外,在很多语言中,Appium 客户端是构建在 Selenium 客户端之上的。也就是说,某些 Appium 客户端只文档化了自己在 Selenium 客户端之上新增的那部分功能,因此要做完整参考,你可能需要同时查阅 Appium 客户端文档和对应的 Selenium 客户端文档。
主流 Appium 客户端速览与安装方式
完整的客户端清单见 客户端列表,这里摘录其中的主流选择:
官方维护的客户端(Appium 团队维护)
| 客户端 | 语言 | 安装方式示例 |
|---|---|---|
| Java Client | Java | Maven 依赖io.appium:java-client(scope 为test);或 Gradle:testImplementation 'io.appium:java-client:${version.you.require}' |
| Python Client | Python | pip install Appium-Python-Client |
| Ruby Core Client | Ruby | gem install appium_lib_core(推荐) |
| Ruby Client | Ruby | gem install appium_lib(Ruby Core Client 的封装,额外提供若干辅助方法,但可能引入额外复杂度,因此官方更推荐 Core 版本) |
| .NET Client | C# | dotnet add package Appium.WebDriver |
社区维护的其他客户端
这些客户端不由 Appium 团队维护,但同样可用于其他语言。一般来说,任何符合 W3C WebDriver 规范的客户端都能与 Appium 良好集成,不过某些 Appium 特有命令在第三方客户端中可能未实现:
| 客户端 | 语言 | 安装方式示例 |
|---|---|---|
| WebdriverIO | JavaScript / TypeScript | npm init wdio@latest . |
| Nightwatch.js | JavaScript / TypeScript | Android:npx @nightwatch/mobile-helper android --appium;iOS:npx @nightwatch/mobile-helper ios --appium |
| RobotFramework AppiumLibrary | Robot Framework | pip install robotframework-appiumlibrary |
| appium-client(multicatch) | Rust | cargo add appium-client |
| SwiftAppium | Swift | git clone后执行swift build与swift run swiftappium |
从概念到实战:接下来读什么
理解客户端只是进入 Appium 生态的第一步。继续阅读建议按以下顺序推进:
- 想弄清服务器端如何真正控制设备(驱动、代理模式、分层架构),请阅读 Appium 驱动简介;
- 想直接看到当前完整的客户端清单与安装指引,请前往 客户端列表;
- 想从整体上理解 Appium 为何选择 WebDriver 协议、如何做到跨平台与多语言,请回看 Appium 工作原理概述;
- 动手环节,可以参考仓库中自带的 JavaScript 快速开始示例、Python 快速开始示例 与 Ruby 快速开始示例,里面包含可直接运行的最小工程骨架。
一句话总结:Appium 客户端就是你和 WebDriver 协议之间的翻译官——你写熟悉语言的代码,客户端负责把它变成服务器听得懂的 HTTP 请求,服务器(连同驱动与插件)再把它变成设备上真实的自动化动作。
【免费下载链接】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),仅供参考