Appium工作原理及其主要组件

Appium的工作原理(how Appium works)

  Appium的核心是一个服务器,它侦听符合API规范WebDriver的传入HTTP请求。对于那些过去使用Selenium为基于浏览器的应用程序进行测试自动化的人来说,这听起来可能已经很熟悉了。

  WebDriver是一个W3C规范,Appium团队为该协议添加了一些扩展,使其不仅适用于web浏览器,也适用于您想要在任何设备上测试的任何应用程序。服务器公开的API在node.js web服务器中运行。此node.js web服务器可以在运行测试之前在本地计算机上启动,也可以作为运行测试的一部分托管Appium服务器。

  要与服务器对话,我们需要一个理解WebDriver协议的客户端库,并将其转换为我们可以轻松使用的客户端库。当然,您可以针对您可能拥有的任何HTTP库编写通用HTTPGET请求,但Appium项目为您最喜欢的编程语言和工具提供了多个客户端库。例如,有Ruby、Python、Java、C#、JavaScript等客户端库。您也可以在自己喜欢的测试框架中编写测试。例如,这可以是针对Java开发人员的JUnit、针对C#开发人员的NUnit、xUnit或MSTest,或者针对JavaScript开发人员的Jasmine。因此,您编写的测试可以使用您喜欢的任何编程语言。

appium原理 ios_驱动程序

  这将使用Appium客户端库,并与Appium服务器进行通信。但是,Appium服务器如何将您编写的命令(例如,JavaScript)转换为启动应用程序,然后找到按钮并单击它以实现特定平台的自动化?为此,Appium服务器有几个驱动程序可以安装。有很多平台的驱动程序,例如,iOS、Android、Windows和Mac。安装驱动程序需要一些特定的设置。最后,根据要测试的平台,您需要有物理设备或设备模拟器或设备模拟器。Appium为您提供了一组一致的API,当您针对设备、模拟器或与同一平台匹配的模拟器编写测试时,您可以根据这些API进行编程。

Appium的概念

客户端/服务器架构(Client / Server Architecture)

  Appium 的核心一个是暴露 REST API 的 WEB 服务器。它接受来自客户端的连接,监听命令并在移动设备上执行,答复 HTTP 响应来描述执行结果。实际上客户端 / 服务器架构给予了我们许多可能性:我们可以使用任何有 http 客户端 API 的语言编写我们的测试代码,不过选一个 Appium 客户端程序库 用起来更为容易。我们可以把服务器放在另一台机器上,而不是执行测试的机器。我们可以编写测试代码,并依靠类似 Sauce Labs 的云服务接收和解释命令。
  appium的核心其实是一个暴露了一系列REST API的server。
  这个server的功能其实很简单:监听一个端口,然后接收由client发送来的command。翻译这些command,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。
在这里client其实就是发起command的设备,一般来说就是我们代码执行的机器,执行appium测试代码的机器。狭义点理解,可以把client理解成是代码,这些代码可以是java/ruby/python/js的,只要它实现了webdriver标准协议就可以。
  这样的设计思想带来了一些好处:

  1. 可以带来多语言的支持;
  2. 可以把server放在任意机器上,哪怕是云服务器都可以;

会话(Session)

  session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。一般来说,通过POST /session这个URL,然后传入Desired Capabilities就可以开启session了。
  开启session后,会返回一个全局唯一的session id,以后几乎所有的请求都必须带上这个session id,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。
  进一步思考一下,由于session id是全局唯一,那么在同一台机器上启动多个session就变成了可能,这也就是selenium gird所依赖的具体理论根据。
  自动化始终在一个会话的上下文中执行,这些客户端程序库以各自的方式发起与服务器的会话,但最终都会发给服务器一个 POST /session 请求,请求中包含一个被称作「预期能力(Desired Capabilities)」的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。

预期能力(Desired Capabilities)

  预期能力(Desired Capabilities)是一些发送给 Appium 服务器的键值对集合(比如 map 或 hash),它告诉服务器我们想要启动什么类型的自动化会话。也有许多能力(Capabilities)可以修改服务器在自动化过程中行为。例如,我们可以将 platformName 能力设置为 iOS,以告诉 Appium 我们想要 iOS 会话,而不是 Android 或者 Windows 会话。或者我们也可以设置 safariAllowPopups 能力为 true ,确保我们在 Safari 自动化会话期间可以使用 JavaScript 打开新窗口。

Appium服务器(Appium Server)

  Appium 是一个用 Node.js 写的服务器。可以从源码构建安装或者从 NPM 直接安装:

$ npm install -g appium
$ appium

  Appium 的 beta 版本可以通过 NPM 使用npm install -g appium@beta 指令进行安装。它是开发版本,所以可能存在破坏性的变更。在安装新版本请卸载 appium@beta (npm uninstall -g appium@beta)以获得一组干净的依赖。

Appium客户端(Appium Clients)

  有一些客户端程序库(分别在 Java、Ruby、Python、PHP、JavaScript 和 C# 中实现),它们支持 Appium 对 WebDriver 协议的扩展。你需要用这些客户端程序库代替常规的 WebDriver 客户端。

Appium Desktop

  这有一个 Appium 服务器的图形界面封装可以下载,它适用于任何平台。它打包了 Appium 服务器运行需要的所有东西,所以你不需要为 Node 而烦恼。它们还提供一个 Inspector 使你可以查看应用程序的层级结构。这在写测试时可以派上用场。

每个平台的驱动程序(Drive per Platform)

  当我们在Windows上运行测试时,我们可以测试各种应用程序,这些应用程序可以是Win32、WinForms、WPF或UWP。在您的测试中,我们需要在启动测试时在启动选项中指定这一点,以指示要测试的应用程序类型。我们称之为Appium选项。Appium选项包含有关应用程序在本地文件系统上的位置的信息。我们可以使用设备或仿真器上安装的应用程序的路径,然后驱动程序就会知道如何驱动应用程序。

appium原理 ios_驱动程序_02

  驱动程序需要安装在运行测试的计算机上。Windows驱动程序称为WinAppDriver。Windows Appium驱动程序还有一个特殊的选项,就是可以作为Appium服务器本身。接下来,让我们看看Android平台。对于Android,我们还可以针对Android设备或模拟器进行测试。Appium目前有两种类型的Android驱动程序。第一个也是最老的驱动程序是UiAutomator驱动程序。这个驱动程序仍然有效,但将来会被弃用。所有新的开发都是在新的驱动程序上完成的,该驱动程序被方便地称为UiAutomator2。UiAutotator2驱动程序是Android SDK安装的一部分,您主要需要安装Java和Android SDK来启动和运行。

  在Android上,您还可以使用名为Espresso的测试框架测试UI。也可以选择使用Espresso驱动程序。通过在测试启动时指定Appium选项,然后定义要使用的驱动程序,可以很容易地在驱动程序之间切换。Android的驱动程序都使用Android SDK附带的一个工具,称为Android调试桥(Android Debug Bridge),也就是ADB。ADB负责在Appium所需的设备上安装一些实用程序,如果您开始测试时设备不在,ADB会在设备上安装您的应用程序。您甚至可以让驱动程序为您启动仿真器,因此它非常容易在CI/CD管道中使用。因此,您的测试可以是构建或部署自动化的一部分。在iOS上,我们还可以针对模拟器和真实设备进行测试。在这种情况下,Appium服务器需要在Mac上运行。原因是iOS开发需要Xcode,而Xcode仅在Mac上可用。这意味着我们需要在Mac主机上安装Appium服务器,在那里我们还需要安装Xcode。我们使用的驱动程序称为XCUITest驱动程序,它使用了一个将在被测设备上运行的所谓web驱动程序代理。这个web驱动程序代理与Facebook团队一起构建,它代理对Appium服务器和正在测试的设备或模拟器的调用。

启动应用程序(Start Your Application)

  在运行测试之前,我们需要运行Appium服务器。您可以启动服务器,然后假定服务器正在运行,或者在测试代码中启动服务器。这只是你团队的偏好问题。这还取决于您是将测试作为CI/CD基础设施的一部分运行,还是作为验证本地开发人员或测试人员编写的测试用例的一部分。接下来,您需要向具有所需功能的Appium服务器发送请求。您可以向服务器发送您要测试的设备类型以及作为测试运行的一部分要运行的应用程序的信息。当您发送具有所需功能的请求时,Appium服务器将处理其余的功能。它将解析请求的功能,并根据找到的信息,找到适合平台的驱动程序。然后,它会找到需要连接的设备,并负责启动应用程序并在设备上安装运行测试所需的应用程序。对Appium服务器的调用在启动它的端点上完成。您发送一个HTTP请求,并将其作为作为HTTP请求主体一部分的JSON字符串传入所需的功能。Appium服务器将使用包含其在服务器上创建的会话标识的会话的响应来响应此请求。对于对Appium服务器的每个后续调用,您始终需要提供会话标识符。这样,服务器可以在同一服务器上同时服务多个测试会话。