拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Appium 客户端(Client)入门:理解客户端-服务器架构与多语言测试编写

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-L159POST /session/:sessionId/element/:elementId/click映射到点击元素w3c.ts#L175-L177GET /session/:sessionId/source映射到获取页面源码w3c.ts#L191-L193GET /session/:sessionId/screenshot映射到截图w3c.ts#L239-L241。同一份路由表还维护着向后兼容的 JSON Wire Protocoljsonwp.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.$(//*[textFoo]); await element.click(); console.log(await element.getText()) console.log(await driver.getPageSource())// Java WebElement element driver.findElement(By.Xpath(//*[textFoo])) element.click() System.out.println(element.getText()) System.out.println(driver.getPageSource())# Python element driver.find_element(byBy.XPATH, value//*[textFoo]) element.click() print(element.text) print(driver.page_source)# Ruby element driver.find_element :xpath, //*[textFoo] 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参数为xpathvalue参数为查找元素所用的 XPath 查询表达式调用Click Element命令传入上一步找到的元素的 ID调用Get Element Text命令传入同一元素的 ID并把结果打印到控制台调用Get Page Source命令获取页面/应用源码并打印到控制台。对照前面 w3c.ts 的路由定义可以看到第 1 步命中POST /session/:sessionId/elementw3c.ts#L106-L110第 2 步命中POST /session/:sessionId/element/:elementId/clickw3c.ts#L175-L177第 3 步命中GET /session/:sessionId/element/:elementId/textw3c.ts#L157-L159第 4 步命中GET /session/:sessionId/sourcew3c.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-clientscope 为test或 GradletestImplementation io.appium:java-client:${version.you.require}Python ClientPythonpip install Appium-Python-ClientRuby Core ClientRubygem install appium_lib_core推荐Ruby ClientRubygem install appium_libRuby Core Client 的封装额外提供若干辅助方法但可能引入额外复杂度因此官方更推荐 Core 版本.NET ClientC#dotnet add package Appium.WebDriver社区维护的其他客户端这些客户端不由 Appium 团队维护但同样可用于其他语言。一般来说任何符合 W3C WebDriver 规范的客户端都能与 Appium 良好集成不过某些 Appium 特有命令在第三方客户端中可能未实现客户端语言安装方式示例WebdriverIOJavaScript / TypeScriptnpm init wdiolatest .Nightwatch.jsJavaScript / TypeScriptAndroidnpx nightwatch/mobile-helper android --appiumiOSnpx nightwatch/mobile-helper ios --appiumRobotFramework AppiumLibraryRobot Frameworkpip install robotframework-appiumlibraryappium-clientmulticatchRustcargo add appium-clientSwiftAppiumSwiftgit 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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门