appium教程_4.adb常用命令
appium教程_4.adb常用命令
前言
pc端跟安卓设备的联系,可以通过adb命令来获取设备上信息和执行操作
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:
- 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
- 守护程序 (adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
- 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。
一些理论/原理的可以查看官方文档: https://developer.android.com/studio/command-line/adb?hl=zh-cn 我们可以通过adb工具来获取安卓设备信息和执行一些命令
常用命令
用python记性了简单的封装,简单看下
adb devices -- 查看已经连接到adb服务器的设备
获取当前应用包名和activity
adb_cmd = **'adb -s %s shell dumpsys window | grep mCurrentFocus' **% self.udid
获取设备语言
cmd = **'adb -s %s shell getprop persist.sys.locale' **% (self.udid)
判断是否安装了某个应用
adb_cmd = **'adb -s %s shell pm list packages | grep "%s"' **% (self.udid, app_id)
通过包名打开某个应用
adb_cmd = **'adb -s %s shell monkey -p %s -c android.intent.category.LAUNCHER 1' **% (self.udid, package_name)
关掉某个应用
adb_cmd = **'adb -s %s shell am force-stop %s' **% (self.udid, package_name)
通过坐标点击屏幕
adb_cmd = **'adb -s %s shell input tap %d %d ' **% (self.udid, x, y)
简单monkey测试
# 通过monkey工具随机模拟事件
# 该方法是50%的点击事件,50%的拖动事件,总计50次事件,每次事件间隔500毫秒
# 更多参数请参考:https://developer.android.com/studio/test/monkey
def monkey_app(self, package_name):
self.log.info("开始monkey测试")
self.close_app(package_name)
time.sleep(5)
adb_cmd = 'adb -s %s shell monkey -p %s --throttle 500 --ignore-crashes --ignore-timeouts --pct-touch 50 --pct-motion 50 -v 50' % (
self.udid, package_name)
cmd_result = SubProcess(adb_cmd).execute_cmd_v2()
time.sleep(5)
self.log.info("结束monkey测试")
切换设备语言
之前自动化测试时通过点击设置--语言这些动作来达到切换语言的目的,有个比较稳定的切换方式,通过ADL 应用来切换,应用在Google play市场(https://play.google.com/store/apps/details?id=net.sanapeli.adbchangelanguage)可以下载,国内的话(ADB Change Language)自行百度下
# 1. 安装ADL apk
# 2. 设置权限 adb shell pm grant net.sanapeli.adbchangelanguage android.permission.CHANGE_CONFIGURATION
# 3. 执行命令切换语言 zh-CN,ja-JP,ko-KR,en-US
LANGUAGE_COUNTRY_MAP = {
"CN": "zh-rCN",
"JP": "ja-rJP",
"KR": "ko-rKR",
"US": "en-rUS",
"RU": "ru-rRU",
"HK": "zh-rHK",
"UK": "en-rUK",
"TW": "zh-rTW",
"CA": "en-rCA",
"ID": "id-rID"
}
def change_language(self, language):
"""
:param udid:
:param language:
:return:
"""
cmd = 'adb -s %s shell am start -n net.sanapeli.adbchangelanguage/.AdbChangeLanguage -e language %s' % (
self.udid, language)
result = SubProcess(cmd).execute_cmd_v2()
if result is not None:
time.sleep(5)
self.log.info("切换语言(%s)成功" % language)
else:
self.log.info("切换语言(%s)失败" % language)
def change_language_by_country(self, country):
"""
:param country:
:return:
"""
self.change_language(LANGUAGE_COUNTRY_MAP.get(country, 'en-rUS'))
这样切的速度快,而且稳定
- Jsp开发中遇到的中文乱码问题及解决方法
- 开发中最常见的Java字符串问题总结
- .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)
- Java 8的函数式编程学习
- 在C++中反射调用.NET(一) 反射调用第一个.NET类的方法
- QuickPager分页控件,最简单的设置代码
- Java中有关Null的9问题
- 在C++中反射调用.NET(二) 定义数据接口 绑定委托方法 使用SOD DTO 对象 将.NET对象转换到C++结构体为何不使用序列化的问题
- Java阻塞队列线程集控制的实现方法
- 【自然框架】QuickPager分页控件,新增一种分页方式——伪URL分页(Postback版)
- 我们的漏洞Webug 3.0中级进阶攻略(上)
- 【自然框架】QuickPager分页控件的总体介绍和在线演示
- 在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++/CLI
- 如何使用树莓派自制网络监视器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用 Rust 和 N-API 开发高性能 NodeJS 扩展
- 教你 Linux 免密登录配置
- Linux阅码场 - Linux内核月报(2020年08月)
- 事务的本质和死锁的原理
- 深度神经网络conda环境下载
- 隧道构建:端口转发的原理和实现
- SAP Spartacus注入自定义的CurrentProductService
- Redis系列(十一)redis命令全集
- Jinkens+gitlab针对k8s集群实现CI/CD
- Vue 踩过的坑
- Java TCP/UDP/HttpClient简例
- 让你设计实现一个签到功能,到底用MySQL还是Redis?
- 如何防止MySQL重复插入数据,这篇文章会告诉你
- Spring AOP注解开发
- 快速学习-Jenkins CLI凭据