appium 自动化
1appium 的特点: 开源,跨平台(1测试脚本的跨平台 支持在如: mac linux windows 运行平台 ios Android windows firefoxos) 多语言支持 移动应用 自动化工具
测试对象: 原生app 混合(hybrid)app 移动web app 所谓原生app ,就是专门针对某一类移动设备(比如苹果、安卓)而开发的,所有界面和代码都是专门为平台设计的。而混合app主要是指它的一部分是原生界面和代码,而另一部分是内嵌web app 。这个大家应该有体会,可以打开网页浏览的app都是混合app,比如微信、支付宝、美团、移动营业厅、开发者头条等。比如微信的sms界面是原生,原生代码实现的。 而打开某个朋友圈,或者别人发来的的链接部分则是 web部分,内嵌了一个浏览器内核,由浏览器内核实现的。
测试对象App运行平台包括:
测试对象App运行平台包括:
iOS (就是苹果手机、平板、甚至iWatch等移动设备上运行的app)
Android(就是安卓手机、平板、等移动设备上运行的app)
]Windows (就是Widnows手机、平板等移动设备上运行的app,但是这种平台使用人数目前太少,少到基本可以忽略不计了,)
FirefoxOS (更少,更加可以忽略不计了)
测试对象App运行环境:
真实设备
模拟器
真实设备大家都知道,就是苹果安卓的手机、平板等移动设备
而模拟器则是通过在PC或者Mac电脑上的软件虚拟的 苹果安卓的手机、平板等移动设备。主要是方便我们测试用的。
测试程序语言:
appium支持多种程序语言开发测试程序,基本上Selenium支持的开发语言,appium都支持。
Python、java、Ruby、js、php、c#
自动化原理
Appium自动化架构和Selenium有很大的相似之处
包含了3个主体部分
Test script(我们的测试程序,是测试逻辑的实现部分。就像以前我们的Selenium自动化脚本。
而且和Selenium一样,可以使用多种语言,Appium 客户端库也支持多种语言。
一般运行在pc、上,或者苹果笔记本、台式机)
Appium Server :这是一个用 javascript代码实现的程序。是运行在Node.js里面的。
被测试app:运行在真实设备或者模拟器中
这个测试系统,运行起来,交互关系是这样的
首先:
我们开发的的自动化程序(Testscript)运行各种测试脚本
告诉Appium Server,我们要做什么操作
Appium Server接收到测试程序的命令后,又是怎么真正的控制移动设备上的app的呢?
原来appium是自己开发一个自动化模块(或者叫应用),安装在移动设备中的。
就行一个木马
appium开发的木马,通过使用 各个移动APP开发平台 自带的 自动化框架来实现的
appium在移动设备上会注入测试模块,测试模块会调用这些自动化框架提供库,从而控制设备和操作app。
node.js 是js程序的一个解释器 苹果 uiautomation/xctest 安卓 uiautomator
android 底层自动化工具 ios 底层自动化工具
2.3-4.1 selendroid ios 9.3 之前uiautomation
4.2+ uiautomator 9.3+ xcuitest
6+ uiautomator 2
安装appium python clinet 包
pip install appium-python-client pip install -u appium-python-client (自动更新依赖包)
安装
安装Appium Python Client包
根据原理图,我们知道测试程序需要调用客户端的库AppiumPython Client包来和Appium Server进行通信
所以先安装AppiumPython Client包。
https://github.com/appium/python-client
pip install Appium-Python-Client
从安装的信息可以发现,Appium Client底层是依赖Selenium的,它需要Selenium库的代码才能实现和 AppiumServer进行通信
Appium Server
更省事的方法是下载安装AppiumDesktop的安装包,
这个里面包含了Node.js和AppiumServer 的代码
下载地址 https://github.com/appium/appium-desktop/releases/latest
它是个windows的安装程序,只需要下载,安装就可以了,没有什么难度。
对于安卓app的自动化,Appium Server依赖 Android SDK。
因为要用到里面的一些工具,
典型的,最常用的,比如adb,要执行命令设置手机,传送文件,安装应用。
我们怎么安装Android sdk包?
谷歌是提供了方法:不去安装 android studio ,就只安装sdk包的
打开 https://developer.android.google.cn/studio/
建议先创建一个类似这样的目录
d:\android\sdk
下载后,选择解压到当前目录
会生成一个 tools目录
然后
sdkmanager "platform-tools" "platforms;android-28" "build-tools;28.0.3"
设置 sdk相关环境变量
配置一下ANDROID_HOME环境变量的值为 d:\tools\Android\sdk
将adb所在路径设置到 path环境变量中
Android\sdk\platform-tools\
安装JDK
有些安卓sdk中的工具(比如查看安卓app界面元素的uiautomatorviewer)需要有JDK才能运行。
比较简单,
但是大家要注意的是,一定要安装jdk8.x的版本,
1.7 ,1.6 1.9等版本都碰到过这样那样的问题。
jdk是oracle的,到官网下载
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载安装就可以
有时还需要环境变量中设置一下(有人的环境上需要,建议大家都添加一下)
JAVA_HOME d:\tools\java\jdk1.8.0_121
连接真实设备(15 min)
用usb线(有的淘宝线只能充电)连接到电脑,一头连手机,一头连电脑
2, [endif]进入手机设置,关于手机(),不断点击版本号(7次以上),
注意一定是版本号,不是其他号。
3, 退出到上级菜单,在开发者模式中,启动usb调试 ,这样appium才能驱动手机
4, [endif]在电脑上执行adb命令(这个adb在sdk\platform-tools\请大家设置路径在path环境变量中)
adb devices -l
List of devices attached
4d0035dc767a50bb device product:t03gxx model:GT_N7100 device:t03g
现在有的电脑安装了win10的,有的手机能够自动被系统识别,就会显示上面的信息,
有的电脑系统,比如win7 ,手机不能自动识别,因为还没有安装手机的usb驱动,需要我们去安装。
到哪里下载驱动呢?可以通过官方windows手机管理软件, 比如华为手机(安装华为手机助手)
我们以一个开发者头条的app,为例,演示一下自动化的过程
准备一些事情
即使安装好上述软件后。要自动化,还要准备一些事情。
首先当然需要有被测试的app应用了。
这里我用的app是从应用市场上下载下来。
在虚拟手机上没有应用市场,可以直接到官网下载app
当然实际项目中app是有开发团队发布给我们测试用的。
放在一个合适的目录中,这里我放在 d:\apk\
usb线连接手机
进入头条apk所在目录,
执行命令安装一下
d:\apk> adb install -r toutiao.apk
toutiao.apk: 1 file pushed. 4.5 MB/s (15351740 bytes in 3.268s)
pkg: /data/local/tmp/toutiao.apk
Success
范例代码
from appium import webdriverimport time,traceback# 这里定义的 desired_capabilities,作为下面 webdriver.Remote# 初始化一个webdriver的参数。# 这些键值对告诉appium server 测试程序希望进行的是什么什么样的测试# 比如下面 platformName 和 platformVersion 两个配置项desired_caps = {}desired_caps['platformName'] = 'Android' #测试平台,不能写错desired_caps['platformVersion'] = '6.0' #平台版本,不能写错#设备名称,其实没有太大的用处,只是给测试程序使用的,苹果手机一定要有desired_caps['deviceName'] = 'test'#apk 文件路径名,如果设备还没有此应用,则会安装。什么是apk文件?
# android application package安卓移动App安装包desired_caps['app'] = r'd:\apk\toutiao.apk'#app package名,一定要有,是开发者给app取的名字,可以唯一标识这个app # 安卓上运行某个app,不是根据它的路径而是appid ,也就是这package name# 怎么获取?后面会讲desired_caps['appPackage'] = 'io.manong.developerdaily'# app默认Activity,也是必须的参数。Activity 的概念后面会讲述,# 目前我们就理解为一个用户操作界面就可以了# 怎么获取?后面会讲desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'# 一定要有该参数,否则测试过程中无法输入中文#加上这个参数会新加一种unicode输入法desired_caps['unicodeKeyboard'] = True# 保证了app 测试前不会清除应用数据,缺省是会清除数据的,desired_caps['noReset'] = True# appiumserver认为和客户端之间无响应最大时间,超过这个时间就会停止服务desired_caps['newCommandTimeout'] = 6000# appiumserver在这个URI上接收 客户端发送的rest API请求driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)# 下面的操作是自动化一个用户登录的过程,大家课后自己尝试的时候,需要先注册用户# 怎么注册演示给大家看看,怎么登录也演示给大家看看,# 最后别忘了要退出登录,一遍自动化可以执行try: # 和Selenium含义一样,问问大家还记得吗? driver.implicitly_wait(10) # 根据id找到元素,并点击,id和 html 元素的id不同,
#和appiumserver、设备之间的消息流程类似于selenium,和 driver.find_element_by_id("io.manong.developerdaily:id/tab_bar_plus").click() time.sleep(1) driver.find_element_by_id("io.manong.developerdaily:id/btn_email").click() time.sleep(1) # 输入用户名、密码 ele = driver.find_element_by_id("io.manong.developerdaily:id/edt_email") ele.send_keys('jcyrss@163.com') ele = driver.find_element_by_id("io.manong.developerdaily:id/edt_password") ele.send_keys('sdfsdf') time.sleep(2) # 点击登录 driver.find_element_by_id('io.manong.developerdaily:id/btn_login').click() passexcept: print (traceback.format_exc())input('**** Press to quit..')driver.quit()