Appium简介和环境搭建
espresso 是白盒测试框架, 通常是给开发人员用的,
monkey 是任意的在应用界面乱点乱划,适合压力测试
monkeyrunner 有点类似UIAutomator,但是 通常是固定的根据坐标点击特点
特点
appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。
- “移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。
- “移动web应用”是指使用移动浏览器访问的应用(appium支持iOS上的Safari和Android上的 Chrome)。
- “混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 Phonegap,可以帮助开发者使用网页技术开发应用,然后用原生代码封装,这些就是混合应用。
重要的是,appium是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了iOS和Android测试套件间代码的复用性。
appium与Selenium
appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
appium客户端类库实现了Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和W3C WebDriver spec(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。
appium服务端定义了官方协议的扩展,为appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载App。这就是为什么我们需要appium特定的客户端,而不是通用的Selenium 客户端。当然,appium 客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium 客户端,所以他们仍然可以用来运行通用的Selenium会话。
appium是什么?有什么用
我们学习的移动应用自动化,是基于appium这样的一个自动化框架的
Appium是一个开源、跨平台(测试程序跨平台、支持多平台上的app测试)
多语言支持的(开发语言)移动应用 自动化工具
测试移动app 类型:
【原生app】是专门针对某一类移动设备(比如苹果、安卓)而开发的,所有界面和代码都是专门为平台设计的。比如:计算器【架构c/s】
【混合(Hybrid)app(H5)】主要是指 它的一部分是原生界面和代码,而另一部分是内嵌web app 。 这个大家应该有体会,可以打开网页浏览的app都是 混合app,比如微信、支付宝、美团、移动营业厅、开发者头条等。
比如微信的sms界面是原生,原生代码实现的。 【架构c/s】
而打开某个朋友圈,或者别人发来的的链接部分则是 web部分,内嵌了一个浏览器内核,由浏览器内核实现的。
现在混合型app很多,稍微功能全一些的都需要具备网页浏览的功能。
【移动web app】完全是用手机浏览器里打开的一个网址,web app 只能运行在浏览器里,靠浏览器解释执行。资源一般都在网络上。它其实就是一个触屏版的网站。【架构b/s】
Appium对这3种类型的app的测试都支持。
其他相关概念
C/S 架构
Client/Server,即客户端/服务器端架构,一种典型的两层架构。客户端包含一个或多个在用户的电脑上运行的程序。服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。
B/S 结构
B/S是Browser/Server,即浏览器/服务器架构。Browser指的是Web浏览器,极少数事务逻辑在前端实现,主要事务逻辑在服务器端实现,Browser客户端,WebApp服务器端和DB端构成所谓的三层架构。B/S架构的系统无须特别安装,只有Web浏览器即可。Appium就是这种架构。
被测试App运行平台:
iOS (就是苹果手机、平板、甚至iWatch等移动设备上运行的app)
Android(就是安卓手机、平板、等移动设备上运行的app)
Windows (就是Widnows手机、平板等移动设备上运行的app,但是这种平台使用人数目前太少,少到基本可以忽略不计了,)
FirefoxOS (更少,更加可以忽略不计了)
【如果运行iOS应用则需要appium server运行在Mac系统上,也就是说Mac系统才能做iOS应用自动化】
测试App运行环境:
【真实设备】 就是苹果安卓的手机、平板等移动设备
【模拟器】 则是通过在PC或者Mac电脑上的软件虚拟的 苹果安卓的手机、平板等移动设备。 主要是方便我们测试用的。
测试程序语言:
appium支持多种程序语言开发测试程序,基本上Selenium支持的开发语言,appium都支持。
Python、java、Ruby、js、php、c#
appium原理
appium的架构原理如图所示,由客户端和服务端组成,客户端与服务端通过JSON进行通信;
各部分的含义:
(1)Appium服务器。它是一个基于node.js的HTTP服务器。主要功能是接受从Appium客户端发起的链接,监听客户端发送来 命令,将命令发送到bootstrap.jar(IOS为bootstrap.js)执行,并将命令的结果通过HTTP应答反馈给Appium客户端。
(2)Bootstrap.jar。Bootstrap.jar是在Android手机上运行的一个应用程序,它在手机上扮演TCP服务器的角色,当appium服务器需要运行命令时,Appium服务器与Bootstrap.jar建立TCP通讯,并把命令发送给Bootstrap.jar;Bootstrap.jar负责运行测试命令。
(3)Appium客户端。主要是指实现了Appium功能的webdriver协议的客户端Library,他负责与Appium服务器建立连接,并将测试脚本的指令发送给服务端。包括:python、Java、Ruby等。
(4)Seesion。Appium的客户端和服务端之间进行通信必须在一个session的上下文中进行。客户端发起通信的时候会首先发送一个叫做“Desired Capabilities”的JSON对象给服务端。服务端接收到该数据后,会创建一个session并将session的ID返回给客户端,之后客户端会用该session的ID发送后续的命令。
(5)Desired Capalities。Desired Capalities是一组设置的键值对,用于通知Appium服务端建立需要的session,其中一些设置可以改变Appium的运行行为。
Appium在Android上基于UIAutomator实现了测试的代理程序(Bootstrap.jar),在iOS上基于UIAutomation实现了测试的代理程 序(Bootstrap.js)。当测试脚本运行时,每行WebDriver的脚本都将转换成Appium的指令发送给Appium服务器,而Appium服务器将 测试指令交给代理程序,将由代理程序负责执行测试。比如脚本上的一个点击操作,在Appium服务器上都是touch指令,当指令 发送到Android系统上时,Android系统上的Bootstrap.jar将调用UIAutomator的方法实现点击操作;而当指令发送到iOS系统上 时,iOS的Bootstrap.js将调用UIAutomation的方法实现点击操作。由于Appium有了这样的能力,同样的测试脚本可以实现跨平台运 行。
appium工作原理架构图
在Android端,appium基于WebDriver协议,利用Bootstrap.jar,最后通过调⽤用UiAutomator的命令,实现App的自动化测试
【如果appium环境搭建没有问题,执行脚本会自动安装驱动程序】
1.客户端是我们写的webdriver测试脚本。
2.中间是Appium的服务,Appium在服务端启动一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
3.appium server会把请求转发给中间件Bootstrap.jar ,它是用java写的,安装在手机上.Bootstrap监听4724端口并接收appium 的命令,最终通过调⽤用UiAutomator的命令来实现。
4.最后Bootstrap将执行的结果返回给appium server。
5.appium server再将结果返回给 appium client
appium-iOS工作流
在iOS端,appium同样使⽤WebDriver的一套协议。与Android端测试框架不同的是appium ios封装了apple的 Instruments框架,主要用了Instrument的UIAutomation(Apple的自动化测试框架),然后在设备中注入bootstrap.js进行监听。
1.客户端是我们写的webdriver测试脚本。
2.中间是Appium的服务,Appium在服务端启动一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
3.appium server调用instruments.js 启动⼀一个socket server,同时分出一个⼦子进程运⾏instruments.app,将bootstrap.js(UIAutomation脚本)注⼊入到device⽤于和外界进行交互。
4.最后Bootstrap.js将执行的结果返回给appium server。
5.appium server再将结果返回给 appium client。
Appium的加载流程
1)调用Andorid adb完成基本的系统操作
2)向Andriod上部署bootstrap.jar包并启动
3)Forward Android 的端口到PC的机器上
4)PC上监听端口接受请求,使用webdriver协议
5)分析命令并转通过forward的端口发给bootstrap.jar包
6)bootstrap接受请求并把命令发给UiAutomator或插桩体系
手机端驱动程序介绍
苹果
i0S 9.3 and above: Apple' s XCUITest
i0S 9.3 and lower: Apple' s UIAutomation
安卓
Android 4. 2+: Google' s
UiAutomator(android系统自带)/UiAutomator2(appium优化版本)
Windows
Microsoft‘s WinAppDriver
环境安装-windows+Android
硬件准备
Android手机(最低系统4.2+,推荐系统6.0+)一台(真机演示)
计算机配置(windows):
系统:Win10
内存:最小4G,推荐8G
硬盘可用空间:4G以上
分辨率:1280*800以上
安装
Appium客户端
安装Appium Python Clien包
pip install Appium-Python-Clien
要确保安装匹配版版的selenium和appium:pip install selenium -U # 更新selenium版本
Appium服务端
安装Appium Desktop(windows版本)--包含node.js 和 元素定位工具
下载地址 http://appium.io (推荐下载版本:1.13 或 1.17)
1.双击打开压缩包Appium
2.双击进行安装。
3.点击完成即可
电脑端环境
安装jdk1.8版本
解压后默认安装。
配置环境变量
1.在系统变量新建:JAVA_HOME,对应变量值为:E:\Program Files\Java\jdk1.8.0_172(jdk安装路径)
2.系统变量Path在安装系统之后就有了,我们只需为它增加新的值。
选中 Path 单击 “编辑” 按钮,单击 “新建”,添加下面的值。
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
3.系统变量中建立CLASSPATH,变量值输入:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (要加.表示当前路径)
输入 java -version,看到JDK版本 java version “1.8.0_60” 那么恭喜你安装成功了
下载sdk:https://www.androiddevtools.cn
使用sdkmanager相关命令安装build-tools, platforms, platform-tools
sdkmanager使用相关文档:
https://developer.android.com/studio/command-line/sdkmanager
进入路径下的tool/bin/目录下,首先运行:sdkmanager –list
如何使用sdkmanager升级sdk呢,查看https://blog.csdn.net/kai_1215/article/details/80731099
安装build-tools的25.0.2版本
sdkmanager "build-tools;25.0.2"
安装platform-tools,platforms的android-26版本
sdkmanager "platform-tools," "platforms;android-26"
配置环境变量
配置ANDROID_HOME
新建一个系统环境变量,变量名为ANDROID_HOME
系统的Path变量,%ANDROID_HOME%\platform-tools;% ANDROID_HOME%\tools
最后,测试一下是否成功:开始-运行-输入cmd-在终端输入
再输入命令:adb
显示以下视图则说明配置成功;
安装appium-server
打开appium,查看配置android_home和java_home是否与电脑配置一致,不一致 或 为空 手动添加
手机端设置
电脑端的手机驱动,确保电脑能识别出手机(win10默认不需要)
可以通过手机助手(驱动安装完成请卸载,否则会造成adb冲突)或者对应品牌的官网去下载
手机端开启USB设置(Android)
用usb线连接到电脑
进入手机设置-》关于手机,不但点击版本号(7次以上),激活开发者模式,退出到上级菜单,在开发者模式中,启动usb调试,手机端弹出授权弹窗,点击允许即可
手机端设置usb为文件传输(多媒体传输)模式
启动adb连接
打开终端,输入:adb devices -l ,显示device 表示连接成功
注意点:
确保电脑上没有其他的adb程序软件,如杀毒软件-安全管家- 手机助手---会占用手机端口号导致连接失败
确保手机端开发者选项中对应的adb权限全部打开(红色标注为 打开,蓝色标注为 关闭)
(可选)确保手机端appium相关的app对应权限打开
设置》应用管理》权限设置》找到对应的app,查看权限
代码验证环境是否搭建成功
执行代码
测试auto_boss.py
自动化配置信息文档:http://appium.io/docs/en/writing-running-appium/caps/#uiautomator2-only
导包
from appium import webdriver
准备自动化配置信息
desired_caps={
#移动设备平台 必填
'platformName':'Android',
#平台OS版本号,写整数位即可 必填
'plathformVersion':'7',
#设备的名称--值可以随便写,adb devices可以查看设备名称 必填
'deviceName':'621QADQT256Y6',
#提供被测app的信息-包名,入口信息: 必填
#adb shell dumpsys activity recents | findstr intent={
'appPackage':'com.hpbr.bosszhipin',
'appActivity':'.module.launcher.WelcomeActivity',
#确保自动化之后不重置app (不添加此项,自动化测试完之后会删除用户信息)
'noReset':True,
#设置session的超时时间,单位秒 默认60s(代码与服务端连接有延时,如果不添加,时间超时就会导致代码与服务端断开连接)
'newCommandTimeout':6000,
#设置底层测试驱动-1.15默认使用的底层驱动就是UiAutomator2
'automationName':'UiAutomator2',#或者UiAutomator1
# 'skipServerInstallation':True#跳过UI2的安装,如果第一次运行程序,不要添加该配置
}
初始化driver对象-用于控制手机-启动被测应用
IP-appium-server所在机器的网络ip,port-监听的端口号,path固定/wd/hub
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(10)#稳定元素
点击放大镜
eles=driver.find_elements_by_id('com.hpbr.bosszhipin:id/img_icon')#先取所有符合条件的元素
找到第二个元素--放大镜
btn=eles[1]
btn.click()
搜索框输入职位信息
search_input=driver.find_element_by_id('com.hpbr.bosszhipin:id/et_search')
search_input.send_keys('软件测试')#输入参数
选择符合条件的第一个搜索结果
driver.find_element_by_id('com.hpbr.bosszhipin:id/tv_filtered_name').click()
获取当前页面所有职位信息元素
job_msg=driver.find_elements_by_id('com.hpbr.bosszhipin:id/view_job_card')
for job in job_msg:
#输出岗位名称
name=job.find_element_by_id('com.hpbr.bosszhipin:id/tv_position_name')
# print(name.text)
#输出薪资
salray=job.find_element_by_id('com.hpbr.bosszhipin:id/tv_salary_statue')
# print(salray.text)
#输出公司名称
company=job.find_element_by_id('com.hpbr.bosszhipin:id/tv_company_name')
print('%s|%s|%s'%(name.text,salray.text,company.text))
input('......')
driver.quit()
发现appPackage fappActivity
未安装被测应用,使用SDK中的aapt进行抓取
SDK中下载最新的build-tools,通过aapt dump badging xxx.apk命令来查appPackage与appActivity。
打开 windows 终端,输入:
cd E:\androidsdk\build-tools\29.0.3
aapt dump badging xxx.apk (windows)
打开 Mac 终端,输入:
cd /usr/local/androidsdk/build-tools/29.0.3
./aapt dump badging xxx.apk
已安装被测应用,先打开被测应用,再在终端输入以下命令:
adb shell dumpsys activity recentsl findstr intent={
adb shell dumpsys activity recentsl findstr "intent={" > d:\info.txt && d:\info.txt
斜杠之前为appPackage,斜杠之后为appActivity
首次运行脚本会在手机上自动新增两个App
appium-settings--应用会自动安装并启用(无界面,打开后闪退,以服务形式存在)
UiAutomator2--appium优化后的Android底层自动化驱动(桌面看不到此app,也打不开)
以上两个app确保可以自动安装,并开启全部权限(以下两个应用没有启动,从设置 -> 全部应用-appium Settings/io.appium.uiautomantor2.serve -> 权限管理,开启全部权限)
Adb无线连接
usb有线连接
Wi-Fi无线连接
无线连接的优势
减少usb连接干扰
提高连接稳定性
脱离了有线的束缚(确保手机与电脑同一个局域网)
连接步骤:
先以usb有线连接的方式连接到计算机
激活手机adb的无线服务
终端命令行输入:adb tcpip 5555
计算机以无线方式连接到手机
终端命令行输入:adb connect <driverip>
如果手机重启,需要重新激活连接--重复操作无线连接步骤即可】
1、断开设备连接
adb kill-server #结束adb服务
adb start-server #启动adb服务
adb devices #获取adb设备列表
2、创建设备连接
adb connect xxx #创建与xxx的设备连接