尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

使用 Ruby 客户端为 Appium 编写第一个自动化测试:appium_lib_core 实战指南

使用 Ruby 客户端为 Appium 编写第一个自动化测试:appium_lib_core 实战指南 使用 Ruby 客户端为 Appium 编写第一个自动化测试appium_lib_core 实战指南【免费下载链接】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 官方 Ruby 客户端库appium_lib_core为主线完整演示如何从零初始化 Gemfile、编写基于 test-unit 的测试脚本、通过 Capabilities 启动 Android 会话并运行在真实设备或模拟器上。读完本文你将掌握 Ruby 生态下 Appium 测试的标准项目结构与关键 API 用法并能在本地复现启动设置应用 → 点击 Apps 项 → 关闭会话的完整流程。1. Ruby 官方客户端库appium_lib 与 appium_lib_coreAppium 为 Ruby 提供了两个官方客户端库均通过 RubyGems 分发appium_lib_coregem appium_lib_core推荐使用的核心客户端库。它继承自 Selenium Ruby Binding即selenium-webdriver因此安装该 gem 会自动带上 selenium 绑定可以直接使用 WebDriver 协议下的标准操作。appium_libgem appium_lib在appium_lib_core之上封装的更高层库额外提供一些便捷辅助方法但代价是复杂度更高且其中部分历史方法在最新环境中可能无法正常工作。两者的继承关系为appium_lib_core基于 Selenium Ruby Bindingappium_lib基于appium_lib_core。如果你的需求是简洁、可维护的客户端方案官方推荐直接使用appium_lib_core。选择appium_lib_core还有一个重要的工程原因appium_lib中的 driver 实例通常被设计为全局变量使用这会在多测试实例并行或状态隔离时带来处理实例的问题而appium_lib_core不存在这样的全局变量driver 实例由测试代码显式持有如通过实例变量driver更符合现代测试框架的实践。2. 初始化项目用 Bundler 管理依赖在开始写测试之前先在工作目录中初始化一个 Gemfile 来管理依赖bundle init然后添加 Appium Ruby 客户端依赖。按上文建议使用核心库bundle add appium_lib_core # 或者如果你选择完整库 # bundle add appium_lib本指南的示例测试代码基于test-unit测试框架因此还需要bundle add test-unit上述步骤完成后你的Gemfile应包含以下内容与仓库中 sample-code/quickstarts/rb/Gemfile 一致source https://rubygems.org gem appium_lib_core gem test-unit之后在运行测试前先执行一次bundle install以安装全部依赖。需要说明的是appium_lib_core作为客户端库通过 HTTP 与 Appium 服务器通信它自身不包含任何自动化驱动真正执行 Android 自动化的能力由 Appium 服务器端的 UiAutomator2 驱动提供安装方式见下文第 5 节。3. 完整测试代码逐段解析仓库中提供了开箱即用的示例脚本 sample-code/quickstarts/rb/test.rb核心内容如下require appium_lib_core require test/unit CAPABILITIES { platformName: Android, automationName: uiautomator2, deviceName: Android, appPackage: com.android.settings, appActivity: .Settings, language: en, locale: US } SERVER_URL http://localhost:4723 class AppiumTest Test::Unit::TestCase def setup core ::Appium::Core.for capabilities: CAPABILITIES driver core.start_driver server_url: SERVER_URL end def teardown driver.quit end def test_find_apps driver.wait { |d| d.find_element :xpath, //*[textApps] }.click end end3.1 关键 API 说明Appium::Core.for capabilities: CAPABILITIESappium_lib_core的入口方法接收一个 Capabilities 哈希Ruby 中key: value语法即符号键哈希构建客户端配置对象。它相当于把会话请求参数预封装好。core.start_driver server_url: SERVER_URL向指定地址的 Appium 服务器发起 new session 请求并创建 WebDriver driver 实例。http://localhost:4723是 Appium 服务器的默认监听地址与端口。driver.wait { |d| d.find_element :xpath, //*[textApps] }.clickwait是appium_lib_core提供的显式等待封装会在元素出现前持续重试找到目标元素后立即调用.click。这里使用 XPath 按文本属性textApps定位 Android 设置应用中的Apps列表项。driver.quit在 teardown 中安全关闭会话.空安全调用driver 未初始化时不会报错。这一步会通知 Appium 服务器销毁会话释放被测应用资源。使用appium_lib完整库编写相同测试的代码结构与上述高度类似只是入口方法与辅助方法名称略有不同。4. Capabilities 深入这些参数到底告诉 Appium 什么原文档第 1 步提到定义一组 Capabilities 发送到 Appium 服务器以便 Appium 知道你想要自动化什么。Capabilities 是启动 Appium 会话的核心参数本质是一组键值对值可以是任意合法 JSON 类型。示例中几个关键字段的作用如下Capability值含义platformNameAndroid目标平台类型W3C 标准能力之一automationNameuiautomator2指定使用哪个 Appium 驱动这里对应 UiAutomator2 驱动deviceNameAndroid设备名示例中为非特定设备名主要用于占位appPackagecom.android.settings要启动的应用包名Android 特有扩展能力appActivity.Settings要启动的 ActivityAndroid 特有扩展能力language/localeen/US会话内应用的语言与地区设置4.1appium:前缀与标准能力源码级解读按照 W3C WebDriver 规范扩展能力必须带供应商命名空间前缀以冒号结尾Appium 的供应商前缀是appium:。因此在发送给服务器的最终请求中automationName、appPackage、appActivity等 Appium 专有能力通常会被规范化为appium:automationName、appium:appPackage等形式。在 Appium 服务端这一处理逻辑位于 base-driver 的 capabilities.tsstripAppiumPrefixes函数会把请求中带appium:前缀的能力剥离前缀后与驱动约束进行校验同时STANDARD_CAPS集合包含browserName、browserVersion、platformName、webSocketUrl等用于识别 W3C 标准能力标准能力不应添加appium:前缀。从源码可以看到export const APPIUM_VENDOR_PREFIX appium:; export const PREFIXED_APPIUM_OPTS_CAP ${APPIUM_VENDOR_PREFIX}options;appium_lib_core等客户端会在构造请求时自动为扩展能力补上appium:前缀因此测试代码中写automationName: uiautomator2即可无需手动加前缀。4.2 会话不可变与appium:options分组关于 Capabilities 有两个重要事实会话启动后能力不可变更。一旦请求被服务器接受并创建会话Capabilities 即被固化如果驱动支持运行时调整行为应使用 Settings API而非修改能力。当appium:能力很多时可以把它们整体放入appium:options对象中对象内部无需再加前缀例如{ platformName: Android, appium:options: { automationName: uiautomator2, appPackage: com.android.settings, appActivity: .Settings } }服务端promoteAppiumOptions会把appium:options内部的键提升到顶层并且若同名能力同时出现在顶层与appium:options中appium:options内的值优先。不过在不同客户端语言中构造值为对象的能力写法各异Ruby 中同样是以嵌套 Hash 形式传入。对 Capabilities 的完整介绍包括 always-match / first-match 处理、BiDi 的webSocketUrl能力等可继续阅读 Session Capabilities 指南。5. 运行测试前的环境检查原文档特别强调运行测试前必须确保 Appium 服务器正在另一个终端会话中运行否则客户端会报无法连接服务器的错误。以本仓库对应的 Appium 2 体系为例完整前置条件如下安装并启动 Appium 服务器确认appium命令可用在独立终端运行appium启动服务默认监听0.0.0.0:4723。安装 Android 自动化驱动没有驱动Appium 无法自动化任何平台。安装 UiAutomator2 驱动的标准命令为appium driver install uiautomator2安装成功后可用appium driver doctor uiautomator2校验 Android SDK、JDK 等前置条件是否齐备详见 安装 UiAutomator2 驱动程序 一文。也可用appium setup批量安装移动端常用驱动。准备设备或模拟器通过adb devices确认设备已连接。6. 执行测试并观察结果环境就绪后在项目目录执行# 如果尚未安装依赖先执行 bundle install bundle exec ruby test.rb整个测试脚本做的事情可以拆解为五个步骤定义一组 Capabilities参数发送给 Appium 服务器告知其自动化目标Android 平台 UiAutomator2 驱动 内置设置应用在内置的 Android 设置应用上启动一个 Appium 会话setup阶段完成查找Apps列表项并点击它test_find_apps用例主体短暂停留wait等待与点击操作自然产生的停顿——纯粹为了视觉效果结束 Appium 会话teardown阶段执行driver.quit。如果一切顺利你会看到设置应用被打开自动导航到Apps视图随后应用关闭测试用例通过。这也是驱动实例由实例变量持有、不依赖全局变量的appium_lib_core风格在整个测试生命周期中的完整体现setup创建会话、用例执行操作、teardown清理会话每个测试方法之间互不干扰。7. 进一步探索的方向示例代码只是 Appium Ruby 自动化的起点官方建议从以下几个方面继续深入深入理解 Session Capabilities掌握appium:前缀、appium:options分组及会话能力不可变的约束阅读 管理 Appium 驱动程序和插件学习驱动与插件的安装、升级和卸载方式浏览 设置Settings 文档了解会话运行期间可动态调整的行为查看 生态系统页面了解可用的客户端库、驱动、插件与工具清单以及 Ecosystem Clients 中各语言客户端的更多用法使用 Appium Inspector 对应用进行可视化检查快速获得测试脚本所需的元素定位器如示例中的 XPath//*[textApps]。至此你已经用 Ruby 跑通了第一个 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),仅供参考
返回列表