基于adb操作安卓手机封装的python库

ops/2024/9/20 4:02:54/ 标签: adb, android, 智能手机
import re
import shlex
import subprocessclass ADBClient:def __init__(self, ip, port):"""初始化ADBClient实例。:param ip: 远程设备的IP地址。:param port: 远程设备的端口号。"""self.ip = ipself.port = portdef is_app_running(self, package_name):"""检查指定的应用是否正在设备上运行。:param package_name: 应用的包名。:return: 如果应用正在运行,返回True;否则返回False。"""try:# 通过ADB命令获取当前运行中的应用列表,并检索目标应用包名result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}", "shell", "ps"], capture_output=True,text=True)output = result.stdout# 使用正则表达式搜索应用包名if re.search(package_name, output):return Trueelse:return Falseexcept subprocess.CalledProcessError as e:# 打印错误信息并返回False,表示未能成功执行ADB命令print(f"发生错误:{e}")return Falsedef open_app(self, package_name, activity_name):"""在设备上启动指定的应用。:param package_name: 应用的包名。:param activity_name: 应用要启动的Activity名称。:return: 如果应用成功启动,返回True;否则返回False。"""try:# 首先检查应用是否已经在运行if self.is_app_running(package_name):print("@@@应用已经在运行")return True# 如果应用未运行,则通过ADB命令启动应用subprocess.run(["adb", "-s", f"{self.ip}:{self.port}", "shell", "am", "start", "-n",f"{package_name}/{activity_name}"])except subprocess.CalledProcessError as e:# 如果ADB命令执行出错,打印错误信息print(f"发生错误:{e}")return Falsedef execute_adb_command(self, adb_command):"""执行ADB命令,并返回命令的输出和错误信息。参数:- adb_command: 要执行的ADB命令字符串。返回值:- 一个元组,包括命令的输出(stdout)和错误信息(stderr)。如果命令执行失败,返回None和错误信息。"""try:# 使用subprocess运行ADB命令,将命令字符串分割为列表,添加设备IP和端口信息result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}"] + adb_command.split(), capture_output=True,text=True)# 返回执行结果的输出和错误信息return result.stdout, result.stderrexcept subprocess.CalledProcessError as e:# 如果命令执行出错,返回错误信息return None, f"发生错误:{e}"def get_current_window_info(self):"""获取当前窗口的信息,包括包名和应用名称。该方法通过运行ADB命令,提取当前焦点窗口的包名和应用名称。返回:tuple: 成功时返回一个包含包名和应用名称的元组 (pkg, path);如果无法提取到信息,则返回 (None, None)。"""# 构造获取当前窗口信息的ADB命令cmd = 'shell dumpsys window | grep mCurrentFocus'# 运行ADB命令并获取输出result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}"] + cmd.split(), capture_output=True, text=True)output = result.stdout.strip()# 使用正则表达式提取包名和应用名称pattern = r"mCurrentFocus=Window\{.+?\s+(\S+)/(.+?)\}"match = re.search(pattern, output)if match:# 如果匹配成功,提取并返回包名和应用名称pkg = match.group(1)path = match.group(2)return pkg, pathelse:# 如果匹配失败,返回Nonereturn None, None# 坐标点击事件def tap_by_coordinates(self, x, y):try:# 构建 adb 命令cmd = ["adb", "-s", f"{self.ip}:{self.port}", "shell", "input", "tap", str(x), str(y)]# 执行点击事件subprocess.run(cmd, check=True)print(f"已点击坐标 ({x}, {y})")except subprocess.CalledProcessError as e:print(f"Error: {e}")# 跳转到path指定页面def toPath(self, action, param=None):"""根据指定的操作动作和参数,向应用发送命令,实现页面跳转或其他操作。参数:action: 字符串,指定要执行的操作,例如"settings"表示设置页面。param: 可选参数,字符串类型,当需要传递额外的参数给操作时使用,比如用户ID或视频ID等。返回值: True表示操作成功,False表示操作失败。"""commands = {# 某页面"settings": "am start -n ..."# 其他页面往这放}# 检查命令是否在映射中if action in commands:# 执行命令full_cmd = ["adb", "-s", f"{self.ip}:{self.port}", "shell"] + shlex.split(commands[action])subprocess.run(full_cmd, check=True)return Trueelse:# 如果命令不在映射中,返回Falsereturn False

食用方法

# 创建ADBClient实例,并尝试打开指定的应用
adb_client = ADBClient('192.168.1.5', '5003')
adb_client.open_app("com.zhiliaoapp.musically", "com.ss.android.ugc.aweme.splash.SplashActivity")
res = adb_client.execute_adb_command("root")
print("执行adb命令返回的结果:" + str(res))# 获取当前活动的应用程序包名称和页面ID
pkg, path = adb_client.get_current_window_info()
print("当前活动的应用程序包名称:", pkg)
print("当前活动的页面ID:", path)# 模拟点击"com.zhiliaoapp.musically:id/c5w"元素
adb_client.tap_by_coordinates(667, 633)# 跳转页面
adb_client.toPath('settings')

http://www.ppmy.cn/ops/15120.html

相关文章

git版本库瘦身你知道吗

1.问题缘由 新开发一个git项目时,可能会使用之前的代码库作为基准,并且之前的代码库中可能有许多git提交记录(.git文件夹下面有许多提交记录存储)。这时需要处理以下2种情况。 1)远程代码库中还未上传git提交记录&am…

使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具,比SpeechRecognition功能多安装也很简单; 官方介绍:FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD&#xff…

Android 水滴屏、全屏适配

Android 水滴屏、全屏适配 何谓刘海屏?何谓水滴屏? 上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖。 目前国内流行的手机厂商主要有:vivo、oppo、华为、小米。各厂商对刘海屏的…

GHO文件安装到Vmware的两种姿势

1、使用 Ghost11.5.1.2269 将gho转换为vmdk文件(虚拟机硬盘),Vmware新建虚拟机自定义配置,然后添加已有的虚拟硬盘文件。 注意ghost的版本,如果你是用Ghost11.5备份的gho文件,再用Ghost12把gho文件转换为vmdk,则vmdk文…

深度学习之视觉特征提取器——VGG系列

VGG 提出论文:1409.1556.pdf (arxiv.org) 引入 距离VGG网络的提出已经约十年,很难想象在深度学习高速发展的今天,一个模型能够历经十年而不衰。虽然如今已经有VGG的大量替代品,但是笔者研究的一些领域仍然有大量工作选择使用VG…

vue2响应式 VS vue3响应式

Vue2响应式 存在问题: 新增属性,删除属性,界面不会更新。 直接通过下标修改数组界面不会自动更新。 Vue2使用object.defineProperty来劫持数据是否发生改变,如下: 能监测到获取和修改属性: 新增的属性…

服务器数据恢复—存储硬盘坏道,指示灯亮黄色的数据恢复案例

服务器数据恢复环境&故障: 一台某品牌EqualLogic PS系列某型号存储,存储中有一组由16块SAS硬盘组建的RAID5磁盘阵列,RAID5上划分VMFS文件系统存放虚拟机文件。存储系统上层一共分了4个卷。 raid5阵列中磁盘出现故障,有2块硬盘…

安全评估报告 项目安全风险评估报告 信息安全评估报告

一、安全评估报告的意义 安全评估报告是对特定环境、设施或系统安全性进行全 面分析、评估和预测的重要工具。它通过对潜在风险的识别、分析和评价,帮助决策者了解当前安全形势,制定科学的安全策略,从而有 效预防和减少安全事故的发生。安全…

Hive安装与配置实战指南

Hive安装与配置实战指南 在大数据领域中,Hive以其类SQL的查询语言HQL、可扩展的数据仓库能力和对Hadoop生态系统的良好集成,成为了数据分析和处理的重要工具。本文将指导您完成Hive的安装与配置,帮助您快速搭建起自己的Hive环境。 一、环境…

C++静态变量

C语言中与“静态”相关的词包括,静态全局变量,静态局部变量和静态函数,关键词是static。C语言中的变量从作用域分,可以分为全局变量和局部变量;从存储方式分,可以分为静态存储方式和动态存储方式。 1. 静态…

C语言工程调用C++库解决方案

本文为C语言工程调用C库的解决方案。 应用场景: 需要C程序编译成的库提供函数接口,来解决C语言工程的需求。 人的出场顺序真的很重要,很多人如果换一个时间认识,换一个时间共处,一切都将是不一样的场景,不…

鸿蒙原生应用元服务-访问控制(权限)开发应用权限列表二

ohos.permission.ACCELEROMETER 允许应用读取加速度传感器的数据。 权限级别 :normal 授权方式 :system_grant ACL使能 :TRUE ohos.permission.GYROSCOPE 允许应用读取陀螺仪传感器的数据。 权限级别 :normal 授权方式 &a…

C++高级特性:异常概念与处理机制(十四)

1、异常的基本概念 异常:是指在程序运行的过程中发生的一些异常事件(如:除数为0,数组下标越界,栈溢出,访问非法内存等) C的异常机制相比C语言的异常处理: 函数的返回值可以忽略&…

Mongodb支持事务吗?

一、概念 1.1、MongoDB事务简介 MongoDB 是一个非关系型数据库管理系统,最初并不支持事务。然而,随着时间的推移,MongoDB 在其4.0版本中引入了多文档事务支持,使得在单个集合中执行多个操作成为可能。 In MongoDB, an operation…

C#面:阐述什么是泛型,泛型的优点有哪些?

泛型是 C# 中的一种特性,它允许我们编写可以在不同类型上工作的可重用代码。 通过使用泛型,我们可以编写更加灵活和通用的代码,而不需要为每种类型都编写重复的代码。 泛型的优点有以下几个方面: 代码重用:使用泛型可…

装饰器模式

一、实现原理 装饰器设计模式(Decorator)是一种结构型设计模式,它允许动态地为对象添加新的行为。它通过创建一个包装器来实现,即将对象放入一个装饰器类中,再将装饰器类放入另一个装饰器类中,以此类推&am…

nginx反向代理

简介 Nginx反向代理是一种服务器架构模式,它允许Nginx服务器接收客户端的请求,然后将这些请求转发到上游服务器(例如应用服务器)进行处理,并将处理后的响应返回给客户端。在这个过程中,Nginx充当了客户端和…

如何提交已暂存的更改到本地仓库?

文章目录 如何提交已暂存的更改到本地Git仓库?步骤1:确认并暂存更改步骤2:提交暂存的更改到本地仓库 如何提交已暂存的更改到本地Git仓库? 在Git版本控制系统中,当你对项目文件进行修改后,首先需要将这些更…

前端开发攻略---用原生JS在网页中也能实现 文本转语音!

1、原理 语音合成 (也被称作是文本转为语音,英语简写是 tts) 包括接收 app 中需要语音合成的文本,再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis,外加一些处理如何表示要被合成的文本 (也被称为 utte…

(避雷指引:管理页面超时问题)windows下载安装RabbitMQ

一、背景: 学习RabbitMQ过程中,由于个人电脑性能问题,直接装在windows去使用RabbitMQ,根据各大网友教程,去下载安装完之后,使用web端进行简单的入门操作时,总是一直提示超时,要么容…