基本概念
Appium 是跨平台的:它允许你用同样的 API 对多平台写测试,做到在 iOS 、Android 和 Windows 测试套件之间复用代码。
Appium 旨在满足移动端自动化需求的理念,概述为以下四个原则:
- 你没有必要为了自动化而重新编译你的应用或者以任何方式修改它。
- 你不应该被限制在特定的语言或框架上来编写运行测试。
- 移动端自动化框架在自动化接口方面不应该重造轮子。
- 移动端自动化框架应该开源,不但在名义上而且在精神和实践上都要实至名归。
那么 Appium 项目的架构如何实现这一理念呢?为了实现第一点要求,我们其实使用了系统自带的自动化框架。这样,我们不需要把 Appium 特定的或者第三方的代码编译进你的应用。
我们使用以下系统自带的自动化框架:
- iOS 9.3 及以上:苹果的 XCUITest
- iOS 9.3 及以下:苹果的 UIAutomation
- Android 4.2+: 谷歌的 UiAutomator
- Android 2.3+: 谷歌的 Instrumentation(通过绑定另外的项目—— Selendroid 提供 Instrumentation 的支持)
- Windows: 微软的 WinAppDriver
为了实现第二点要求,我们把这些(系统本身的)供应商提供的框架包装进一套 API —— WebDriver API 中。WebDriver(也叫 "Selenium WebDriver")规定了一个客户端-服务器协议(称为 JSON Wire Protocol),按照这种客户端-服务器架构,可以使用任何语言编写的客户端向服务器发送适当的 HTTP 请求。
我们以同样的方式实现第三点要求:WebDriver 已经成为 Web 浏览器自动化事实上的标准,并且是一个 W3C 工作草案。
Appium 是用 Node.js 写的服务器。
Appium 的核心是暴露 REST API 的网络服务器。它接受来自客户端的连接,监听命令并在移动设备上执行,答复表示执行结果的 HTTP 响应。
会话(session)
自动化始终在一个会话的上下文中执行,这些客户端程序库以各自的方式发起与服务器的会话,但都以发给服务器一个 POST /session 请求结束,请求中包含一个被称作 'desired capabilities' 的 JSON 对象。这时服务器就会开启这个自动化会话,并返回一个用于发送后续命令的会话 ID。
Desired Capabilities
Desired capabilities 是一些发送给 Appium 服务器的键值对集合 (比如 map 或 hash),告诉服务器我们想要启动什么类型的自动化会话。也有各种可以在自动化运行时修改服务器行为的 capabilities。例如,我们可以把 platformName capability 设置为 iOS,告诉 Appium 我们想要 iOS 会话,而不是 Android 或者 Windows 会话。我们也可以设置 safariAllowPopups capability 为 true ,确保我们在 Safari 自动化会话中可以使用 javascript 打开新窗口。
自动化混合应用
Appium 需要知道你是想测试原生部分呢还是web部分。
在 Appium 测试里,你需要以下几步来和 web 页面交涉:
- 切到 webview 部分
- 调用 GET session/:sessionId/contexts
- 这会返回一个我们能访问的 context 的列表,比如 'NATIVE_APP' 或者 'WEBVIEW_1'
- 用 context 的 id 作为参数,调用POST session/:sessionId/context方法,切换到 webview 中去。
- (这会将你的 Appium session 放入一个模式, 在这个模式下,所有的命令都会被解释成自动化 web 视图而不是原生的部分。比如,当你运行 getElementByTagName,它会在 web 视图的 DOM 上操作,而不是返回 UIAElements。当然,一个 Webdriver 的方法只能在一个上下文中有意义,所以如果在错误的上下文,你会收到错误信息。)
- 如果你想停止 web 视图的自动化,回到原生部分,你可以简单地用
context
调用来离开 web 层,参数传原生 context id 即可。
自动化 Android 的混合应用
Appium 通过 Chromedriver 内建混合应用支持。Appium 也可以使用 Selendroid 支持 4.4 之前的设备的 webview 测试。
自动化 iOS 混合应用
Appium 使用 remote debugger 创建和 webview 的交互连接。当在模拟器上执行下面例子的时候,我们可以直接建立连接,因为模拟器和 appium 服务器在同一台机器上。
在 iOS 真机上运行
当在真机上运行用例时,appium 无法直接访问 web 视图,所以我们需要通过 USB 线缆来建立连接。我们使用 ios-webkit-debugger-proxy建立连接。
网友评论