目录

Appium简介

Appium是一款开源的Appium自动化工具, 基于Webdriver协议, 主要有以下3个特点:

  1. 全能: 支持iOS/Andorid/H5/混合App/WinApp
  2. 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各种语言
  3. 开源: 免费

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)

  1. 调用Android adb完成基本的系统操作
  2. 向Android上部署bootstrap.jar
  3. bootstrap.jar Forward Android的端口到PC机器上
  4. PC上监听端口接收请求,使用webdriver协议
  5. 分析命令并通过forward 端口发给bootstrap.jar
  6. bootstrap.jar接收请求并把命令发给uiautomator
  7. ui automator执行命令

Andorid-uiautomator2-driver: bootstrap.jar改为使用uiautomato2 server apk, 使用netty server代替原来的websocket与PC端通信

iOS

  1. client端 依然是 test script是我们的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。

环境搭建

  • 安装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基础教程的更多相关文章

  1. appium简明教程

    appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...

  2. 转载乙醇大师的appium简明教程

    appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统) 乙醇 2014-06-28 21:01 阅读:16406 评论:21 appium简明教程(10)——控件定 ...

  3. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  4. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

  5. Memcache教程 Memcache零基础教程

    Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...

  6. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  7. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  8. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  9. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

随机推荐

  1. spark调优篇-spark on yarn web UI

    spark on yarn 的执行过程在 yarn RM 上无法直接查看,即 http://192.168.10.10:8088,这对于调试程序很不方便,所以需要手动配置 配置方法 1. 配置 spa ...

  2. S02_CH08_ ZYNQ 定时器中断实验

    S02_CH08_ ZYNQ 定时器中断实验 上一章实现了PS接受来自PL的中断,本章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 8.1中断原 ...

  3. 排序之快排(JS)

    快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...

  4. C++反汇编第一讲,不同作用域下的构造和析构的识别

    目录大纲: 1.全局(静态)对象的识别,(全局静态全局一样的,都是编译期间检查,所以当做全局对象看即可.) 1.1 探究本质,理解构造和析构的生成,以及调用方式(重要,如果不想知道,可以看总结.) 2 ...

  5. No database provider has been configured for this DbContext

    var context = ((IInfrastructure<IServiceProvider>)set).GetService<DbContext>(); 在EF Core ...

  6. ES6入门九:Symbol元编程

    JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有und ...

  7. Centos7.7安装swoole

    系统版本:centos 7.7(查看系统版本:cat /etc/redhat-release) 执行命令安装swoole: yum update -y && yum remove ph ...

  8. Linux 虚拟机扩容

    由于在装软件,原来的20G空间不够使用,需要扩容操作. 1.关闭虚拟机 2.点击编辑虚拟机设置 选中硬盘,添加,硬盘,推荐,确定大小,完成. 2.启动虚拟机 查看磁盘使用情况: [root@maste ...

  9. OSI网络通信工作流程的标准化 ----- 理论

    OSI 七层模型 1 应用层 [提供用户服务,具体功能由特定的程序而定] 2 表示层 [数据的压缩优化,加密] 3 会话层 [建立应用级的连接,选择传输服务] 4 传输层 [提供不同的传输服务,流量控 ...

  10. 移动端设备管理平台 atx server2实践

    目录 1.需求背景 2.初步调研 2.1.云测试平台 2.2.开源工具 2.3.VNC 2.4.企业内部自研云测试平台 3.ATX Server安装 依赖环境 安装rethinkdb 安装atx se ...