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基础教程] ...
随机推荐
- SpringBoot热启动让开发更便捷
在开发过程中,当写完一个功能我们需要运行应用程序测试,可能这个小功能中存在多个小bug,我们需要改正后重启服务器,这无形之中拖慢了开发的速度增加了开发时间,SpringBoot提供了spring-bo ...
- 故事板(StoryBoards)和动画(Animations)
Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations) 正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend ...
- mvc 登陆界面+后台代码
上代码 前端+js(懒得分文件了) @{ ViewBag.Title = "MVC权限系统架构学习-登录"; Layout = "/Views/Shared/_LoadJ ...
- python selenium2 模拟点击+拖动 测试对象 58同城验证码
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...
- springcloud必知功能使用教程
springcloud Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路 ...
- cmder 增强型命令行工具
下载 https://github.com/cmderdev/cmder/releases/download/1.3.13/cmder.zip Cmder加到右键菜单 https://www.jian ...
- ActiveMQ入门系列三:发布/订阅模式
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
- vue项目在IE浏览器和360兼容模式下页面不显示问题,亲测有效
解决方法:安装 "babel-polyfill" 1.命令:cnpm install --save-dev babel-polyfill 2.在入口main.js文件引入:impo ...
- Flutter 35: 图解自定义 View 之 Canvas (二)
小菜前几天整理了以下 Canvas 的部分方法,今天小菜继续学习 Canvas 第二部分. drawXXX drawShadow 绘制阴影 drawShadow 用于绘制阴影,第一个参数时绘制一个图形 ...
- Ubuntu + Django(DRF) + channels(websocket)+NGINX + uwsgi 环境部署
原来uwsgi并不能启动 asgi 呀!现在才知道,就因为这一点我花了一周时间才成功啊!!!!!!!! 是呀!你启动uwsgi 是将你的项目启动了,可是你也发现虽然启动了,但是你的websocke ...