Appium 客户端(Client)入门:理解客户端-服务器架构与多语言测试编写
2026/9/13 11:13:52 网站建设 项目流程

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要求请求体中必须携带usingvalue两个字段(w3c.ts#L106-L110)——这正是文档示例中"using参数为xpathvalue参数为 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);

底层都在做同一件事

尽管语言各不相同,这几段脚本在底层执行的协议操作完全一致:

  1. 调用Find Element命令,using参数为xpathvalue参数为查找元素所用的 XPath 查询表达式;
  2. 调用Click Element命令,传入上一步找到的元素的 ID;
  3. 调用Get Element Text命令,传入同一元素的 ID,并把结果打印到控制台;
  4. 调用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 ClientJavaMaven 依赖io.appium:java-client(scope 为test);或 Gradle:testImplementation 'io.appium:java-client:${version.you.require}'
Python ClientPythonpip install Appium-Python-Client
Ruby Core ClientRubygem install appium_lib_core(推荐)
Ruby ClientRubygem install appium_lib(Ruby Core Client 的封装,额外提供若干辅助方法,但可能引入额外复杂度,因此官方更推荐 Core 版本)
.NET ClientC#dotnet add package Appium.WebDriver

社区维护的其他客户端

这些客户端不由 Appium 团队维护,但同样可用于其他语言。一般来说,任何符合 W3C WebDriver 规范的客户端都能与 Appium 良好集成,不过某些 Appium 特有命令在第三方客户端中可能未实现:

客户端语言安装方式示例
WebdriverIOJavaScript / TypeScriptnpm init wdio@latest .
Nightwatch.jsJavaScript / TypeScriptAndroid:npx @nightwatch/mobile-helper android --appium;iOS:npx @nightwatch/mobile-helper ios --appium
RobotFramework AppiumLibraryRobot Frameworkpip install robotframework-appiumlibrary
appium-client(multicatch)Rustcargo add appium-client
SwiftAppiumSwiftgit clone后执行swift buildswift run swiftappium

从概念到实战:接下来读什么

理解客户端只是进入 Appium 生态的第一步。继续阅读建议按以下顺序推进:

  1. 想弄清服务器端如何真正控制设备(驱动、代理模式、分层架构),请阅读 Appium 驱动简介;
  2. 想直接看到当前完整的客户端清单与安装指引,请前往 客户端列表;
  3. 想从整体上理解 Appium 为何选择 WebDriver 协议、如何做到跨平台与多语言,请回看 Appium 工作原理概述;
  4. 动手环节,可以参考仓库中自带的 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询