Appium基础教程
目录
Appium简介
Appium是一款开源的Appium自动化工具, 基于Webdriver协议, 主要有以下3个特点:
- 全能: 支持iOS/Andorid/H5/混合App/WinApp
- 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各种语言
- 开源: 免费
App自动化测试工具对比
iOS
官方:
- Uiautomation/XCUITest: 白盒, UI测试, JS
其他: - FastMonkey: 性能(仿Monkey), 张钊
Andorid
官方:
- Uiautomator/Uiautomtor2: UI测试, Java
- Monkey: app性能/稳定性测试, 随机操作
- MonkeyRunner: UI测试, Jpython, 只能通过坐标定位
- Robotium: 白盒, UI测试, Java, 支持Webview/Toast/menu/Dialog等, 无法跨进程
- Espresso: 官方推荐扩展测试包, 白盒,ui, 一般开发自测使用
- CTS: 兼容性测试, Java
其他:
- Python-Uiautomotor2: UI测试, 使用简单, 支持无线连接设备及使用weditor查看元素定位
- Adb-For-Test/adb-For-Robotium: 个人, 基于adb命令的封装
多平台支持
- Calabash: iOS/Andriod/混合app, Ruby, BDD模式, Api丰富
- Appium: iOS/Andriod/混合app/H5, Java/Python/Ruby/JS..
- Macaco: 阿里基于Appium进行的精简封装的一套框架, 支持Electron应用, 包含app-inspector和ui-recorder, 统一了iOS/Android操作的Api, 目前坑比较多, 环境搭建较麻烦
- Airtest(ATS): 网易推出的一款基于截图对比的App自动化测试工具, 可用于App游戏UI测试, 支持iOS/Android
云平台
- Sauce Labs: Appium官方推荐, 应用最广的云测平台, 收费
- Testin/腾讯云测等: 国内云平台, 收费
- OpenSTF: 开源手机集群管理平台, 免费
Appium实现原理
Andorid(uiautomator)
- 调用Android adb完成基本的系统操作
- 向Android上部署bootstrap.jar
- bootstrap.jar Forward Android的端口到PC机器上
- PC上监听端口接收请求,使用webdriver协议
- 分析命令并通过forward 端口发给bootstrap.jar
- bootstrap.jar接收请求并把命令发给uiautomator
- ui automator执行命令
Andorid-uiautomator2-driver: bootstrap.jar改为使用uiautomato2 server apk, 使用netty server代替原来的websocket与PC端通信
iOS
- client端 依然是 test script是我们的webdriver测试脚本。
- 中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。
- appium server调用instruments.js 启动⼀一个socket server,同时分出一个⼦子进程运⾏instruments.app,将bootstrap.js(一个UIAutomation脚本)注⼊入到device⽤于和外界进行交互
- 最后Bootstrap.js将执行的结果返回给appium server
- appium server再将结果返回给 appium client。
环境搭建
- 安装JDK, 配置环境变量
- 安装Android SDK, 配置环境变量
- 安装Appium-Windows-Desktop
- 安装Appium-Python-Client
- 安装模拟器
Mac Android/iOS环境搭建
Andorid介绍
基本架构
常见布局/视图
- 线性布局: LinerLayout
- 相对布局: RelativeLayout
- 帧布局: FrameLayout, 叠放
- 普通视图: View
- 切换视图: ListView, 注意, 其中的元素会动态变化
HierarchyViewer, uiautomatorviewer
基本控件
- TextView: 文本
- Button: 按钮
- EditText: 输入框
- ImageView: 图片
- 其他: Alert(警告框)/Toast(提示消息)/SeekBar(滑块)/Webview(嵌入网页)
控件常见属性
index: 索引, 用于排序
text: 控件名称(显示文本)
resource-id: 资源id
class: 控件类型(文本/按钮/输入框等)
content-desc: 控件描述
package: 所属包(一个包就是一个apk)
enabled: 是否可用
clickable: 是否可点击
focused: 是否聚焦状态
bounds: 坐标
Adb命令基础
Andorid sdk介绍
- add-ons: 附加库
- build-tools: 编译工具
- platform: 各版本sdk
- platforms-tools: 平台通用工具, 如adb
- tools: 常用工具
Adb介绍
Adb(Android Debug Bridge): Andoid设备调试桥梁, 可以再PC端通过命令调试Android设备, 如获取设备状态, 安装/卸载app, 上传/下载文件等操作
Adb常用命令
开启/关闭服务
- adb start-server: 开启服务
- adb kill-server: 关闭服务
连接设备/获取连接状态(自动开启服务)
- adb connect/disconnect 设备名或uuid: 连接/断开连接设备
- adb devices: 查看连接的设备
安装/卸载app
- adb install 安装包路径.apk
- adb uninstall apk包名
通过uiautomatorviewer可以获取获取apk包名
上传/下载文件
- 上传: adb push 本地文件 设备目录
- 下载: adb pull 设备文件 本地目录
adb push 1.txt /sdcard/
adb pull sdcard/1.txt .
adb shell: 可用于查看设备中的文件, exit退出
强大的adb shell
- pm: 应用及权限管理
adb shell pm list packages
- am: Activity操作
adb shell am start -n 包名/包名.主Activity名
- input: 模拟按键/输入
- 点击(触控)指定坐标:
adb shell input tap 50 250
- 输入文字:
adb shell input text hello
- 按键:
adb shell input keyevent 3
- 滑动:
adb shell input swipe 300 1000 300 500
- 点击(触控)指定坐标:
- logcat: 日志查看及过滤(问题定位)
- monkey: 性能/稳定性测试
- dumpsys: 性能分析
- screencap: 截图
adb shell screencap -p /sdcard/01.png
- screenrecord: 录屏
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
使用aapt获取包名, 主Activity(aapt位于Androidsdk/build-tools下)
aapt dump badging app-debug.apk
package: name='com.lqr.wechat'
...
launchable-activity: name='com.lqr.wechat.ui.activity.SplashActivity'
...
name中包含 包名.主Acitivty名
示例:
配合uiautomatorviewer查看元素坐标, 使用bounds中x,y的平均值, 屏幕分辨率1280*760, 滑动时可取平均值
- 安装高仿微信app
- 启动app
- 点击登录按钮
- 输入18010181267
- 按TAB键
- 输入123456
adb install app-debug.apk
adb am start -n com.lqr.wechat/com.lqr.wechat.com.lqr.wechat.ui.activity.SplashActivity
adb shell input tap 170 1197
adb shell input text 18010181267
adb shell input keyevent KEYCODE_TAB
adb adb shell input tap 360 498
adb shell input swipe 700 540 10 540 # 滑动时离开一定边界
adb shell screencap -p /sdcard/01.png
adb shell input keyevent 3 # 按HOME键
adb pull /sdcard/01.png . # 下载图片
支持的KEYCODE
- 0 --> "KEYCODE_UNKNOWN"
- 1 --> "KEYCODE_MENU"
- 2 --> "KEYCODE_SOFT_RIGHT"
- 3 --> "KEYCODE_HOME"
- 4 --> "KEYCODE_BACK"
- 5 --> "KEYCODE_CALL"
- 6 --> "KEYCODE_ENDCALL"
- 7 --> "KEYCODE_0"
- 8 --> "KEYCODE_1"
- 9 --> "KEYCODE_2"
- 10 --> "KEYCODE_3"
- 11 --> "KEYCODE_4"
- 12 --> "KEYCODE_5"
- 13 --> "KEYCODE_6"
- 14 --> "KEYCODE_7"
- 15 --> "KEYCODE_8"
- 16 --> "KEYCODE_9"
- 17 --> "KEYCODE_STAR"
- 18 --> "KEYCODE_POUND"
- 19 --> "KEYCODE_DPAD_UP"
- 20 --> "KEYCODE_DPAD_DOWN"
- 21 --> "KEYCODE_DPAD_LEFT"
- 22 --> "KEYCODE_DPAD_RIGHT"
- 23 --> "KEYCODE_DPAD_CENTER"
- 24 --> "KEYCODE_VOLUME_UP"
- 25 --> "KEYCODE_VOLUME_DOWN"
- 26 --> "KEYCODE_POWER"
- 27 --> "KEYCODE_CAMERA"
- 28 --> "KEYCODE_CLEAR"
- 29 --> "KEYCODE_A"
- 30 --> "KEYCODE_B"
- 31 --> "KEYCODE_C"
- 32 --> "KEYCODE_D"
- 33 --> "KEYCODE_E"
- 34 --> "KEYCODE_F"
- 35 --> "KEYCODE_G"
- 36 --> "KEYCODE_H"
- 37 --> "KEYCODE_I"
- 38 --> "KEYCODE_J"
- 39 --> "KEYCODE_K"
- 40 --> "KEYCODE_L"
- 41 --> "KEYCODE_M"
- 42 --> "KEYCODE_N"
- 43 --> "KEYCODE_O"
- 44 --> "KEYCODE_P"
- 45 --> "KEYCODE_Q"
- 46 --> "KEYCODE_R"
- 47 --> "KEYCODE_S"
- 48 --> "KEYCODE_T"
- 49 --> "KEYCODE_U"
- 50 --> "KEYCODE_V"
- 51 --> "KEYCODE_W"
- 52 --> "KEYCODE_X"
- 53 --> "KEYCODE_Y"
- 54 --> "KEYCODE_Z"
- 55 --> "KEYCODE_COMMA"
- 56 --> "KEYCODE_PERIOD"
- 57 --> "KEYCODE_ALT_LEFT"
- 58 --> "KEYCODE_ALT_RIGHT"
- 59 --> "KEYCODE_SHIFT_LEFT"
- 60 --> "KEYCODE_SHIFT_RIGHT"
- 61 --> "KEYCODE_TAB"
- 62 --> "KEYCODE_SPACE"
- 63 --> "KEYCODE_SYM"
- 64 --> "KEYCODE_EXPLORER"
- 65 --> "KEYCODE_ENVELOPE"
- 66 --> "KEYCODE_ENTER"
- 67 --> "KEYCODE_DEL"
- 68 --> "KEYCODE_GRAVE"
- 69 --> "KEYCODE_MINUS"
- 70 --> "KEYCODE_EQUALS"
- 71 --> "KEYCODE_LEFT_BRACKET"
- 72 --> "KEYCODE_RIGHT_BRACKET"
- 73 --> "KEYCODE_BACKSLASH"
- 74 --> "KEYCODE_SEMICOLON"
- 75 --> "KEYCODE_APOSTROPHE"
- 76 --> "KEYCODE_SLASH"
- 77 --> "KEYCODE_AT"
- 78 --> "KEYCODE_NUM"
- 79 --> "KEYCODE_HEADSETHOOK"
- 80 --> "KEYCODE_FOCUS"
- 81 --> "KEYCODE_PLUS"
- 82 --> "KEYCODE_MENU"
- 83 --> "KEYCODE_NOTIFICATION"
- 84 --> "KEYCODE_SEARCH"
- 85 --> "TAG_LAST_KEYCODE"
Appium使用
获取app的Package和Activity
desired_caps
元素定位
uiautoviewer
- id: resource_id
- name: text/content-desc
- xpath:
Appium基础教程的更多相关文章
- appium简明教程
appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...
- 转载乙醇大师的appium简明教程
appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统) 乙醇 2014-06-28 21:01 阅读:16406 评论:21 appium简明教程(10)——控件定 ...
- matlab基础教程——根据Andrew Ng的machine learning整理
matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...
- <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫
并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...
- Memcache教程 Memcache零基础教程
Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...
- Selenium IDE 基础教程
Selenium IDE 基础教程 1.下载安装 a 在火狐浏览其中搜索附件组件,查找 Selenium IDE b 下载安装,然后重启firefox 2.界面讲解 在菜单- ...
- html快速入门(基础教程+资源推荐)
1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...
- 转发-UI基础教程 – 原生App切图的那些事儿
UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...
- 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...
随机推荐
- Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制
服务模型 首先,Istio作为一个(微)服务治理的平台,和其他的微服务模型一样也提供了Service,ServiceInstance这样抽象服务模型.如Service的定义中所表达的,一个服务有一个全 ...
- 怎样判断浏览器是否支持canvas
1. 如果网页必须使用canvas, 则需要告知用户更换或更新浏览器. 这时可以通过在<canvas>标签之间添加替代元素进行 <canvas id="c1"&g ...
- Python利用PIL将数值矩阵转化为图像
要求:输入一个n*n的矩阵,矩阵包括从-1到1的浮点数,将其转化为可视化图像 调库 from PIL import Image import numpy as np import math 载入图像, ...
- MQTT图形化客户端比较
1 MQTT.fx (1)协议支持 TCP(tcp) TLS(tls) (2)特点 界面美观,操作便捷 不支持WebSocket协议 基于java开发 支持代理 通过Nashorn Engine的JS ...
- SpringBoot中获取spring.profiles.active的值
一.网上很多采用@Profile("dev")的方式获取,但是这个是类级别的 二.开发中可能需要代码级别 1.刚开始我想通过classpath下的文件读取方式,麻烦死了,于是换了个 ...
- Faster RCNN学习笔记
感谢知乎大神的分享 https://zhuanlan.zhihu.com/p/31426458 Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster R ...
- 基于Vue实现拖拽效果
参考地址:基于Vue实现拖拽效果 参考链接中讲的比较详细,我只使用了其中自定义指令的方法.整体代码如下: <template> <!-- 卡片 --> <div clas ...
- MySQL间隙锁问题
间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...
- PXC节点启动与关闭
PXC节点启动与关闭 最后关闭的PXC节点是安全退出时. cat /var/lib/mysql/grastate.dat,其中safe_to_bootstrap: 1,再次启动集群是则先启动该节点 s ...
- Django_03_后台管理
后台管理 站点分为内容发布和公共访问两部分 内容发布的部分由网站的管理员负责查看.添加.修改.删除数据,开发这些重复的功能是一件单调乏味.缺乏创造力的工作,为此,Django能够根据定义的模型类自动地 ...