核心实验:Appium的安装与快速测试
混合应用是指一种包裹了webview控件的原生应用,具备Web页面的便捷与通用性,又具备原生应用的强大功能,也是目前使用频率比较高的应用类型。
回顾上周内容,请点击:核心实验:Android应用的Monkey测试
实 验 简 介
Appium是一个移动端的UI自动化测试框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的,其官方网站为“http://appium.io”。
可用于IOS和Android等移动操作系统。原生的应用是指用Android或iOS的SDK编写的应用,移动网页应用是指WebApp应用(H5应用)。
混合应用是指一种包裹了webview控件的原生应用,具备Web页面的便捷与通用性,又具备原生应用的强大功能,也是目前使用频率比较高的应用类型。
另外,Appium是跨平台的,可以针对不同的平台用同一套API接口来编写测试用例。并且Appium是基于WebDriver规范的,支持Java或者Python等作为脚本语言来开发自动化测试脚本。
Appium的设计,遵循如下原则:
(1)使用自动化来测试一个App,但是不需要重新编译它。Appium是基于Android和iOS底层提供的自动化测试框架进行的二次封装。针对iOS来说,其封装的是iOS原生提供的框架UIAutomation,针对Android,则封装的是Android提供的原生测试框架UiAutomator。所以,即使我们不使用Appium,同样可以利用Android和iOS的原生测试框架完成自动化测试。但是正因为有了Appium的加持和二次封装,让我们在测试iOS和Android应用时,可以提供统一的一套接口和脚本,而不需要分别开发。
(2)写自动化测试脚本但,不需要学习特定的语言。Appium在设计之时便遵循了目前的Web自动化测试标准规范“WebDriver”,为什么要基于WebDriver呢来进行设计呢?WebDriver(也称Selenium WebDriver)其实是一个C/S架构的协议,叫做JSON Wire Protocol。通过这个协议,用任何语言写成的客户端都可以发送HTTP请求给服务器,所以我们只需要使用我们熟悉的编程语言就可以完成自动化测试脚本的开发。目前Appium官方主要支持Java,Python,Ruby,C#,PHP,JavaScript等编程语言,基本覆盖了主流的编程语言。
(3)一个自动化框架不需要重复造轮子。WebDriver目前已经成为事实上的Web自动化测试的标准规范。所以,Appium完全没有必要再去定义一套新的规范,所以读者在后续的学习和使用Appium的过程中,可以看到很多WebDriver的身影。同时,Appium除了提供WebDriver API之外,还额外增加了专门针对移动端操作的统一接口。
(4)一个自动化框架需要开源,在精神和实践上实现开源。对于这一点来说,是能够促进Appium在近几年快速发展的很重要的原因。
那么,Appium究竟是如何与手机端和测试脚本进行三方联动,进而达到测试的目的呢?在此我们必须要先理解一下Appium的架构体系和各主要功能模块。
Appium的运行过程由三个模块构成:
(1)自动化测试脚本:用任意支持的编程语言调用Appium官方针对不同编程语言提供的不同SDK进行调用,来向Appium Server端发送符合WebDriver规范的HTTP请求,并在测试执行的过程中,通过Appium Server获取测试结果的响应,从而进行断言。
(2)Appium Server:Appium Server事实上是由Node.js的Express框架开发的一个HTTP Server,同时遵守WebDriver规范,是Appium架构体系中最为核心的模块。
Appium Server主要解决了测试脚本与移动端进行交互通信的过程,无论测试脚本用何种编程语言开发,只要遵守WebDriver规范即可。Appium Server在收到自动化测试脚本发送来的请求后,将其转换成移动端可以理解的自动化测试指令。并通过ADB和TCP与移动端进行通信,完成自动化测试指令的下达。
(3)移动端代理:为了实现Appium Server的指令能够成功地被移动端理解和执行,我们必须要在移动端安装Appium的代理程序。其中最为核心的通信程序是Bootstrap.jar程序(在iOS设置中叫Bootstrap.js),一切的Appium的指令均通过该代理程序进行处理。同时,在移动端Appium还会自动安装额外的两个应用程序:Appium Settings和Unlock,这两个应用程序是无界面的,但是我们可以通过应用程序调用来进行系统设置和屏幕解锁操作。
Appium整体架构图如图所示。
实 验 目 的
(1)理解Appium的Desktop Server与无界面版Server的区别。
(2)熟练运用Appium完成针对App的自动化测试基本操作。
实 验 流 程
安装Appium Desktop Server
在Appium官网下载最新版本的Desktop Server,截止本书编写时,其最新版本为1.6.2,下载地址为:https://github.com/appium/appium-desktop/releases,可直接通过官网页面点击下载跳转到该地址。Appium Desktop Server主要提供了一个图形化操作界面,便于我们对Appium服务进行基本的启动,停止和参数配置等操作。
安装过程保持默认设置,点击下一步即可,如图所示。
安装完成后,运行appium-doctor命令行程序,检查一下Appium需要的环境是否设置完成。将命令行目录切换到Appium安装目录下的“node_modules\.bin”目录下,运行appium-doctor命令即可完成环境配置的检查。如图所示。
如果上述检查有未通过的项目,请完善相应的安装或者配置。如果检查项都是通过的,则我们直接可以启动Appium Desktop应用程序,启动界面如图所示。
从上图我们可以看出,要启动Appium Server,只需要提供两个关键参数:服务器需要绑定的IP地址和端口号即可。IP地址通常建议使用127.0.0.1,如果不设置,会默认使用localhost,也是可以 的。端口号可以自行指定,保持使用默认的4723也没有问题,只要没有其它应用程序占用该端口即可。但是如果我们需要启动多个Appium Server以为了能够连接多个移动端的话,那么每一个Server必须要有一个唯一的端口。如果出现以下画面,表示启动成功。
安装无界面版Appium Server
由于Appium本身是基于Node.js开发的一个WebDriver服务器端应用程序。所以除了使用自带界面的Appium Desktop Server外,我们还可以使用Node.js的npm程序直接安装Appium的原生Server,并通过命令行来启动服务器或者配置需要的参数。操作步骤如下:
(1)在Node.js官网“https://nodejs.org/en/”下载最新版本的Node.js并完成安装。
(2)在操作系统环境变量中将Node.js的安装目录配置到Path变量中,便于方便的执行相关命令。
(3)打开命令行程序,运行命令“node -v”和“npm -v”,确认安装是否成功。
(4)使用命令“npm install -g appium”在线安装Appium。但是由于安装过程会连接Google的国外站点,所以很有可能无法成功安装。
(5)使用国内镜像安装,运行如下命令“npm --registry http://registry.cnpmjs.org install -g appium”即可从国内镜像站点安装Appium。
(6)也可使用镜像npm install -g appium --registry https://registry.npm.taobao.org进行安装。
(7)默认情况下,npm会在命令行的当前目录下安装新的模块,比如笔者的Windows 10操作系统上,默认会安装在“C:\Users\Denny\AppData\Roaming\npm”目录中,如果需要指定安装路径,我们可以使用命令“npm config set prefix "D:\Folder\node_modules"”指定安装路径。
(8)运行命令“npm --registry http://registry.cnpmjs.org install -g appium-doctor”安装Appium Doctor检查程序。
(9)为安装模块的目录,如“C:\Users\Denny\AppData\Roaming\npm”设置到Path环境变量中,便于直接在命令行运行Appium或Appium Doctor程序。
(10)当Appium安装完成后,可以通过命令“appium -v”和“appium-doctor”来确认是否安装成功。
(11)如果通过运行Appium Doctor程序检查成功后,我们可以启动Appium Server,默认的启动命令为“appium”,如果需要停止服务器,只需要 按“Ctrl+C”即可。如图所示。
(12)如果我们需要重新指定启动的IP地址和端口号,只需要为appium命令添加如下参数即可。
appium -a 127.0.0.1 -p 4725 |
至此,一个无界面版本的Appium Server已经安装配置完成。无论是使用Appium Desktop界面版,还是使用Node.js的无界面版,对于本书后续的测试脚本开发没有任何影响。读者可自行选择自己喜欢的方式安装Appium即可。事实上,无论是界面版还是非界面版本,均基于Node.js,核心程序都是完全一致的,只是多了一个界面工具帮助我们去配置一些参数和完成启动停止而已,而后续我们如果需要开发一个云测试平台,在同一台电脑上完成对多台终端的同时连接和测试时,无界面版本反而更有用一些,更容易通过Python调用命令的方式来完成全自动化的操作。所以,后续的操作我们均基于纯命令行版本的Appium来进行。
快速执行安装测试
当完成Appium的安装并成功启动后,现在我们来完成一个简单的Python自动化测试脚本,对模拟器上的小米计算器进行一个简单的测试,操作步骤如下:
(1)为Python安装Appium Client库,命令为:“pip install Appium-Python-Client”。
(2)启动模拟器,运行小米计算器。
(3)进入Android SDK目录下的“tools”目录,并运行“uiautomatorviewer.bat”工具来对当前模拟器上的界面元素进行识别。比如我们可以通过该工具识别到小米计算器的按钮的属性特征(启动工具后点击“Device Screenshot”按钮即可开始识别当前界面元素),如图所示。
从上图可以看到,按钮“9”对应的文本内容即“text”属性显示为“9”,并且对应的“resource-id”为“com.miui.calculator:id/btn_9”(即按钮的唯一编号,与HTML元素的id属性是一致的),该按钮所属的“class”为“android.widget.Button”(与HTML元素的class属性也是一致的)。上述的这些属性都可以用作元素的识别属性。
另外一点需要注意的是,如果Appium已经启动,则UI Automator Viewer无法获取元素属性,所以要使用该工具,请先确保Appium已经停止。
(4) 查看当前模拟器的Android内核版本号,并记录下来。
(5) 运行命令“adb devices”查看当前模拟器的设备编号,并记录下来。
(6) 打开Pycharm,并完成如下代码的开发。详细说明请查看代码备注。
from appium import webdriver # 导入webdriver模块 from time import sleep desired_caps = {} # 定义webdriver的兼容性设置字典对象用于设置核心参数 desired_caps['platformName'] = 'Android' # 指定测试Android平台 desired_caps['platformVersion'] = '4.4.2' # 指定移动端的版本号 desired_caps['deviceName'] = 'Appium' # 指定设备名称 desired_caps['appPackage'] = 'com.miui.calculator' # 指定要启动的包 desired_caps['appActivity'] = '.cal.CalculatorActivity' # 指定启动的主类程序 desired_caps['udid'] = '127.0.0.1:62001' # 指定设备编号(adb devices输出结果) # 实例化webdriver,并指定appium服务器访问地址,一定要加上/wd/hub driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) sleep(3) # 利用与webdriver一样的API接口实现对象操作 driver.find_element_by_id("btn_c_1").click() driver.find_element_by_id("com.miui.calculator:id/btn_5").click() driver.find_element_by_id("btn_plus").click() driver.find_element_by_id("btn_7").click() #resouce-id属性可以简写 driver.find_element_by_xpath("//android.widget.ImageView[@content-desc='等于']").click() # 利用xpath查找运行结果并进行断言 result = driver.find_element_by_xpath("//android.widget.TextView[@text='12']") # 由于运算结果无法直接定位,所以利用text=12来定位该元素,如果没有找到该元素,则断言失败 if result != None and result.get_attribute("text") == "12": print("测试成功.") else: print("测试失败.") |
(7)确保Android移动端没有被锁屏,确保Appium正常启动,运行上述代码,观察Android模拟器的变化。确认是否正常安装了“Appium Settings”和“Unlock”两个应用程序,并正常启动了小米计算器进行自动化测试。
由于我们已经对Selenium的操作非常熟悉了,包括元素定位,包括断言方式和常规操作等,所以对上述测试脚本的作用也是一目了然的。所以基本的操作部分本章内容将不再追述,而将更多精力关注在与Appium直接相关的与移动端相结合的一些测试技术上来。