【基础教程】Appium自动化测试,太详细了!

news2025/7/17 0:03:42

Appium简介

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

  1. 全能: 支持iOS/Andorid/H5/混合App/WinApp

  1. 通用: 支持Win/Linux/Mac, 支持Java/Python/Ruby/Js/PHP等各种语言

  1. 开源: 免费

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完成基本的系统操作

  1. 向Android上部署bootstrap.jar

  1. bootstrap.jar Forward Android的端口到PC机器上

  1. PC上监听端口接收请求,使用webdriver协议

  1. 分析命令并通过forward 端口发给bootstrap.jar

  1. bootstrap.jar接收请求并把命令发给uiautomator

  1. ui automator执行命令

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

iOS

  1. client端 依然是 test script是我们的webdriver测试脚本。

  1. 中间是起的Appium的服务,Appium在服务端起了一个Server(4723端口),跟selenium Webdriver测试框架类似, Appium⽀持标准的WebDriver JSONWireProtocol。在这里提供它提供了一套REST的接口,Appium Server接收web driver client标准rest请求,解析请求内容,调⽤用对应的框架响应操作。

  1. appium server调用instruments.js 启动⼀一个socket server,同时分出一个⼦子进程运⾏instruments.app,将bootstrap.js(一个UIAutomation脚本)注⼊入到device⽤于和外界进行交互

  1. 最后Bootstrap.js将执行的结果返回给appium server

  1. 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 设备文件 本地目录

Copyadb 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下)
Copyaapt dump badging app-debug.apk
Copypackage: 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

Copyadb 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:

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

电商项目实战

web测试项目

web+App+h5+小程序 测试项目

接口自动化测试实战项目

Linux实战项目

面试资料

我们进阶学习自动化测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

以上资料,对于想要测试进阶的朋友们来说应该会很有帮助,需要的小伙伴可以后台私信找我免费领取。

总结

我见过很多leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了好几年,更夸张的是7、8年工作内容的重复性比较高,没有什么技术含量的工作。

凡事要趁早,特别是技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(二十)、完成个人中心页面的数据统计+设置详情页点赞用户的头像组【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1,个人中心页面的数据统计 数据统计包括两项内容:1.当前登录用户的点赞总数量。2.当前登录用户发布文章的总数量 1.1,在self页面data中定义对象 data() {return {totalObj:{artNum:0,likeNum:0}};},1.2,获取总数量的方法&#x…

多线程(初识线程)

线程的诞生 了解进程存在的意义 实现了并发编程的效果(并发编程:有可能是并发执行,也有可能是并行执行) 并发编程的目的:充分利用上多核CPU资源,提升运行效率 了解进程创建和销毁的过程带来的问题 进程是…

系列二、函数

一、定义 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码MySQL中 已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。二、字符串函数 2.1、案例 2.1.1、concat 字符串拼接 s…

js中?.、??的具体用法

1、?. (可选链运算符) 在javascript中如果一个值为null、undefined,直接访问下面的属性,会报 Uncaught TypeError: Cannot read properties of undefined 异常错误。而在真实的项目中是会出现这种情况,有这个值就读这…

泛型擦除(Generic erase)(内含教学视频+源代码)

泛型擦除(Generic erase)(内含教学视频源代码) 教学视频源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87473560 源代码中使用的泛型,在经过编辑后,代码中就看不到泛…

PX4之飞行控制框架

PX4的飞行控制程序通过模块来实现,与飞控相关的模块主要有commander,navigator,pos_control,att_control这几个,分别可以在src/modules目录中找到。 commander - 指令/事件处理模块,处理指令、遥控器输入和…

新C++(9):谈谈,翻转那些事儿

"相信羁绊,相信微光,相信一切无常。"一、AVL树翻转那些事儿(1)什么是AVL树?在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。…

网上插画教学哪家质量好,汇总5大插画培训班

网上插画教学哪家质量好?给大家梳理了国内5家专业的插画师培训班,最新五大插画班排行榜,各有优势和特色! 一:国内知名插画培训机构排名 1、轻微课(五颗星) 主打课程有日系插画、游戏原画、古风插…

Tencent OS下逻辑卷(LVM)创建和扩容

测试环境是一个虚拟机,原配置1个虚拟盘。 创建4个虚拟盘,每盘2G并挂载在虚拟主机上,启动虚拟主机开始测试。 LVM英文是Logical Volume Manager,直接翻译为逻辑卷管理。 这种磁盘管理模式比较灵活,在磁盘空间不足的时…

深入浅出C++ ——容器适配器

文章目录一、容器适配器二、deque类简介1. deque的原理2. deque迭代器3. deque的优点和缺陷4. 为什么选择deque作为stack和queue的底层默认容器一、容器适配器 适配器的概念 适配器是STL六大核心组件之一,它是一种设计模式,该种模式是将一个类的接口转换…

大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s 📚️Reference: IoT 边缘计算系列文章 HashiCorp 解决方案 - Nomad Docker 简介 Nomad: 一个简单而灵活的调度器和编排器,…

网络工程课(二)

ensp配置vlan 一、配置计算机ip地址和子网掩码 二、配置交换机LSW1 system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface Ethernet0/0/1 [SW1-Ethernet0/0/1]port link-type access 将接口设为access接口 [SW1-Ethernet0/0/1]port default vlan 10 [SW1-E…

【MyBatis】源码学习 04 - 从 MapperMethod 简单分析一条 SQL 的映射操作流程

文章目录前言参考目录学习笔记1、测试代码说明2、binding 包的主要功能3、获取 Mapper 接口实例过程4、SQL 语句执行流程4.1、方法调用器4.2、MapperMethod 绑定方法4.2.1、SqlCommand4.2.2、MethodSignature4.3、MapperMethod#execute前言 本文内容对应的是书本第 13 章的内容…

【亲测2022年】网络工程师被问最多的面试笔试题

嗨罗~大家好久不见,主要是薄荷呢主业还是比较繁忙的啦,之前发了一个面试题大家都很喜欢,非常感谢各位大佬对薄荷的喜爱,嘻嘻然后呢~薄荷调研了身边的朋友和同事,发现我们之前去面试,写的面试题有很多共同的…

C++ Effictive 第6章 继承与面向对象设计 笔记

继承意味着"is-a"。如果B继承自A,那么B is-a A。 子类声明与父类函数同名的函数时,父类函数会被遮掩。 使用using Base::func(args...);父类所有func的重载函数都在子类中被声明。此举下,如果子类函数与父类函数参数也一…

不要对chatgpt过度反思 第一部分

最近一段时间,chatgpt很热,随意翻一些文章或视频,一些非常整齐一致的怪论,时不时都会冒出来。 为什么这种革命性创新又出现美国? 为什么我国互联网只会电商,没有创新? 为什么我们做不出来&…

列表推导式_Python教程

内容摘要 Python中存在一种特殊的表达式,名为推导式,它的作用是将一种数据结构作为输入,再经过过滤计算等处理,最后输出另一种数据结构。根据数据结构的不同会被分为列表推导式、 文章正文 Python中存在一种特殊的表达式&#x…

股票、指数、快照、逐笔... 不同行情数据源的实时关联分析应用

在进行数据分析时经常需要对多个不同的数据源进行关联操作,因此在各类数据库的 SQL 语言中均包含了丰富的 join 语句,以支持批计算中的多种关联操作。 DolphinDB 不仅通过 join 语法支持了对于全量历史数据的关联处理,而且在要求低延时的实时…

Qt信号与槽使用方法总结

前言 在图形界面编程中QT是为首选,组件之间如何实现通信是核心的技术内容。Qt 使用了信号与槽的机制,非常的高效、简单、易学,方便开发者的使用。本文详细的介绍了Qt 当中信号与槽的概念,并演示了各种信号与槽的连接方式。 什么…

你知道 GO 中的 协程可以无止境的开吗?

GO语言天生高并发的语言&#xff0c;那么是不是使用 go 开辟协程越多越好的&#xff0c;那么在 go 里面&#xff0c;协程是不是可以开无限多个呢&#xff1f; 那么我们就一起来看看尝试写写 demo 吧 尝试开辟尽可能多的 协程 写一个 demo &#xff0c;循环开 1 << 31 …