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: