UI自动化框架appium工作原理

[复制链接]
发表于 昨天 18:41 | 显示全部楼层 |阅读模式
一、框架组成

Appium由三个主要模块构成:Client端、Server端和移动端。

  • ‌Client端‌:就是发起command的一端,狭义可以理解为java/python编写的自动化测试脚本或者自动化测试脚本实行的呆板。
  • Server端‌:即启动的appium进程

    • Server端作为信息中转站,接收Client端发送的请求,并根据请求类型和目标平台,将相应的控制命令转发到被测应用的移动端上。Server端启动时会创建一个HTTP服务,监听特定端口(如默认的4723端口)。

  • 移动端‌:

    • 移动端是真正实行自动化测试的地方。在Android装备上,通常有一个名为bootstrap.jar的中间件;在iOS装备上,则是一个名为bootstrap.js的脚本。这些中间件负责监听来自Appium Server的命令,并在移动装备上实行相应的UI自动化操作。

焦点思想:WebDriver 协议 + 客户端-服务器架构
Appium 的焦点设计哲学非常巧妙,可以概括为两点:

  • 遵照 WebDriver 协议:Appium 没有自己创造一套新的标准,而是扩展了Selenium WebDriver 用于自动化浏览器的协议(称为 JSON Wire Protocol 及其后继者 W3C WebDriver)。这意味着任何兼容 WebDriver 的客户端库(如 Java、Python、JavaScript、Ruby 等)都可以直接用来写 Appium 脚本。
  • 客户端-服务器架构:Appium进程是一个 HTTP Server。测试脚本(客户端)通过 HTTP 请求向 Appium Server 发送命令(如“点击”、“查找元素”),Appium Server 接收到命令后,负责将其翻译成移动装备(iOS/Android)能够理解的原生指令并实行。
二、appium的几个重要概念


  • client:就是发起command的一端,狭义可以理解为java/python编写的自动化测试代码或者自动化测试代码实行的呆板。
  • appium server:即启动的appium进程,专门用于监听来自client端的请求,转发请求并转为移动端能识别的command(WebDriver协议),然后发送给移动端装备进行操作,等候操作效果,将操作效果发送给client端。

    • 默认开启并监听4723端口。
    • Appium通过HTTP协议进行Client与Server之间的通信。Client端发送请求到Appium Server的特定端口,并使用JSON格式的数据交换测试信息和实行效果。
    • 在移动装备端,中间件(如bootstrap.jar或bootstrap.js)通过socket连接与Appium Server进行通信。中间件接收来自Appium Server的命令,并在移动装备上实行相应的操作,然后将实行效果反馈回Appium Server。
    • WebDriver协议在Appium中起到了桥梁的作用,使得Client端能够与移动装备进行交互,实现自动化测试。

  • Desired Capabilities:这是启动 Appium 会话的“设置清单”,是一个 JSON 对象,用于告诉 Appium Server 你希望如何启动和实行会话。例如:启动浏览器还是移动装备?启动Android还是iOS?启动Android时,app的包名是什么;app的activity是什么。
  • session:session就是一个会话,在appium中,所有工作都是在session start后才可以进行。启动session需要传入Desired Capabilities获取一个全局唯一的session id,这个id指定了实行自动化测试的浏览器或者移动装备。
三、appium工作流程


工作流程的几个关键步骤:

  • 启动会话 (Session):你的测试脚本(客户端)通过向 Appium Server 发送一个包含 Desired Capabilities(装备名、应用路径、自动化引擎等)的 HTTP 请求来启动一个会话。Appium 会根据这些设置初始化对应的自动化框架(如 UiAutomator2/XCUITest),并在装备上安装一个特殊的“服务器署理”(Android 上是 bootstrap.jar,iOS 上是 WebDriverAgent)。
  • 实行命令

    • 自动化脚本(client)发送一个命令(如 find_element 查找元素)。
    • Appium Server 接收到这个标准的 WebDriver 命令。
    • Appium Server 通过之前创建的连接,将这个命令转发给装备上正在运行的“服务器署理”(Bootstrap/WebDriverAgent)。
    • 这个“服务器署理”负责调用平台原生的自动化框架(UiAutomator2/XCUITest)。
    • 原生框架最终在装备的 UI 层级中实行真正的操作(如查找、点击、滑动)。

  • 返回响应:操作实行后的效果(成功或失败信息)会沿着原路返回,最终以 HTTP 响应的形式送达你的测试脚本。
四、焦点原理:“不重新编译”与“跨平台”

Appium 官方标语是 "Cross-platform, don't recompile your app"。它通过以下两个关键技能点实现了这一目标:
1. 不重新编译你的应用


  • 传统自动化框架(如 Apple 的 UIAutomation)需要将自动化库编译到待测应用中。
  • Appium 不需要对被测应用做任何修改或重新编译。它利用了各平台官方提供的底层自动化框架来驱动应用:

    • Android

      • 对于 4.2+ 版本:使用 UiAutomator2(现在主流)。UiAutomator2 是 Google 提供的官方测试框架,可以获取屏幕内容并实行操作。
      • 对于更老版本:使用 Selendroid(基于 Instrumentation)。

    • iOS

      • 对于 9.3+ 版本:使用 XCUITest(现在主流)。XCUITest 是 Apple 提供的官方 UI 测试框架。
      • 对于更老版本:使用 UIAutomation(已废弃)。


简单来说,Appium 就像一个“翻译官”和“中间商”。它接收标准的 WebDriver 命令,然后“调用”装备上这些官方的自动化框架来实行实际的操作。因为使用的是官方框架,所以不需要修改应用本身。
2. 跨平台


  • 由于 Appium 在服务器层为 iOS 和 Android 提供了不同的“翻译”实现(即不同的“驱动”,如 XCUITestDriver 和 UiAutomator2Driver),但对客户端暴露的是同一套 WebDriver API。这意味着可以用同一套编程语言、几乎相同的代码结构来为 iOS 和 Android 编写自动化测试,大大进步了代码的复用性。
五、总结

Appium 的原理可以精炼为:

  • 协议标准化:接纳并扩展 WebDriver 协议,使客户端编写标准化。
  • 架构清楚:接纳 C/S 架构,职责分离,客户端只需关注业务逻辑,服务器负责翻译和实行。
  • 借力官方:不造轮子,直接调用各平台官方的底层自动化框架(UiAutomator2/XCUITest)来驱动装备,因此无需修改被测应用。
  • 跨平台同一:通过在服务器端为不同平台提供不同的“驱动”实现,对上层提供同一的 API,从而实现真正的跨平台自动化。
六、附录

1.在Android装备的详细工作过程:


  • Appium server将监听到的4723端口的指令,转发给中间件Bootstrap.jar,Bootstrap.jar是用Java编写的,安装在Android手机上;
  • Bootstrap监听4724端口并接收Appium server的指令;
  • Bootstrap再通过调用UIautomator的命令来实现具体的command操作。
  • 最后Bootstrap将实行的效果返回给Appium server。
2.参考资料

appium工作原理
APP自动化测试系列之Appium介绍及运行原理

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表