初识selendroid
Testerhome社区的lihuazhang对selendroid官网的部分内容进行了翻译和讲解。
以下内容均摘自lihuazhang。感谢lihuazhang的讲解。原文地址:https://github.com/lihuazhang/selendroid
一、什么是 Selendroid
简介
Selendroid 是一个测试自动化框架,支持 Android 的原生应用,混合应用和移动 Web。软件测试工程师可以使用 Selenium 2 的客户端 API 来写自动化测试脚本。Selendroid 由 eBay Software Foundation 发起,是一个开源项目,由众多人士支持。目前代码 base 在 github 上。
支持的设备
Selendroid 支持且仅支持 Android 的模拟器和真机。同时可以集成到 Selenium Grid 中去进行大规模或者并发测试。
如果想用 Webdriver 来测试 iOS 的原生应用,混合应用和移动 Web的话,我们推荐 iosdriver。
特性
- 完全兼容 Webdriver 的 JSON Wire Protocol
- 不需要为了自动化修改被测应用
- 使用一个 Android webview 应用来测试移动网页
- 原生和混合应用自动化采用同样的理念
- 使用不同的定位方式来查找 UI 元素
- 支持手势:高级用户交互接口
- Selendroid 可以同时和多台设备(模拟器或者真机)交互
- 可以自动启动模拟器
- 支持真机热插拔
- 可以充当一个节点完全整合进 Selenium Grid,进行大规模和并发测试。
- 支持多个 Android API (10到19)
- 提供 Inspector 简化测试脚本开发
- 可以扩展自己的插件!
二、Selendroid和其他框架的区别
Android 基于 UI 层面的自动化测试工具,都可以理解为是基于 Android 控件层面的,涉及原生控件和 WebView 两大类。
目前主流的测试方法主要有以下几种:
1. 通过 Android 提供的各种服务,来获取当前窗口的视图信息(通常是 dump 布局控件为 xml 文件)。然后,在当前视图内查找目标控件,并根据该控件属性信息计算出该控件中心点的坐标,进而构造出一个 Android Input 事件来实现对应用的自动化测试。其主要特点是:测试代码和被测应用各自运行在各自的进程内,相互独立。其代表有 Uiautomator。
2. 基于 Instrumentation,通过把测试代码和应用代码,确切地说是测试 APK 和被测 APK,运行在同一个进程中,通过 Java 反射机制,来获取当前窗口所有视图,并根据该视图查找到目标控件的属性信息,并计算出目标控件中心点坐标。然后,利用 Instrument 内部接口,实现点击操作。其代表有 Robotium。 Selendroid 属于第二种,基于 Instrumentation。
三、基本组件
Selendroid 有四大组件:
- Selendroid-Client:Java 客户端(基于 Selenium Webdriver API 实现的)
- Selendroid-Server:运行在安卓设备中 instrumentation server。和被测应用统一签名, 运行在同一进程。
- AndroidDriver-App:一个 android webview 应用,用来测试移动网页的。
- Selendroid-Standalone:大管家,负责将 Selendroid-Server 和 被测应用安装到设备中 去,同时负责管理不同的安卓设备。
Selendroid Client
你可以把 Selendroid Client 看成传统的 Webdriver Java Client + 移动特性的实现。
Selendroid 为在门户网页时代的自动化测试人员提供了无缝的接入。任何一个熟悉 Selenium Webdriver 的人都能轻易上手。
Selendroid Server
Selendroid Server 本身是一个 instrumentation,这个就像大家熟悉的 instrumentation 测试里面的测试应用。
- Selendroid Server 是一个 instrumentation apk。
- 这个 apk 里面起了一个 HTTP Server。
- 这个 HttpServer 实现了 Selenium Webdiver 的协议。 从Selendroid Client 过来的请求会映射到各个不同的处理方法中去。
- 而各个不同的处理方法,则是去通过 instrumentation 这个框架去和设备沟通,得到执行的结果,再由 HttpServer 返回到设备外部。
AndroidDriver-App
这个就是一个 Android APP。只有一个 WebViewActivity。
这个应用的作用只有一个,当测试移动网页的时候,客户端的 Capabilities 设置为 SelendroidCapabilities.android(),设备中就会使用这个 apk 来作为移动网页的载体。
说白了,其实就充当了一个浏览器的作用。
Selendroid-Standalone
在前面我们说了,Selendroid Server 和 AndroidDriver 都是 apk,那这些 apk 是怎么被安装到设备中去呢?
Selendroid Server 启动的 HttpServer 在设备中,客户端测试脚本在 PC 机上,他们又是怎么沟通的呢?
客户端脚本怎么知道去哪个设备执行用例呢?
这些问题就要问 Selendroid 的大总管 —— Selendroid-Standalone。
Selendroid-Standalone 在 selendroid-client 和 selendroid-server 之间扮演了一个代理的角色。
在执行 Selendroid 测试用例前,我们都需要招呼这个管家起来工作,所以准确来说这个管家主要会做以下几件事:
- 启动一个 HttpServer,接受来自客户端的请求。
- 对 selendroid-server,被测应用等 apk 进行统一签名。
- 根据客户端脚本参数初始化设备,比如和模拟器或者真机建立连接。
- 安装相关的应用。
- 将设备上的端口 forward 到 pc 机,打通selendroid-client 和 selendroid-server 之间的通讯。
- 实现了一些额外的接口,比如通过 adb 执行命令。
另外,大管家还维护两个池子:
- deviceStore: 大管家启动的时候,会找到机器上所有的 android 模拟器和连接的 android 设备,把这些设备信息添加到 deviceStore 中去,以备后续脚本使用。(大管家有两个监听器,分别对模拟器和真机的变化做监听,这样就可以实时更新池子。)
- appStore:我们启动大管家的时候会传 aut 给他,大管家会把这个 aut 加入到 appStore 中去。