python+adb
#!/usr/bin/python env
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
from time import sleepimport logging
logging.basicConfig(level=logging.DEBUG)
class ScreenCapture():def get_screen_size(self):"""获取手机分辨率"""action = subprocess.Popen(['adb', 'shell', 'wm', 'size'], stdout=subprocess.PIPE)result = action.stdout.read()_, size = result.decode().split(':')self.width,self.height = size.strip().split('x')print(f'获取到手机分辨率为:{self.width},{self.height}') # 1080,2436# return int(width), int(height)# print(f"result是{result}")# print(result.decode())# ss=result.decode().split(':')# aaa=ss[1].strip()self.x1=int(self.width)/2self.x2=int(self.width)/2self.y1=int(self.height)/4self.y2=int(self.height)/1.5print(f"x1是{self.x1},x2是{self.x2},y1是{self.y1},y2是{self.y2}")@staticmethoddef show_menu():print("========================================================== ")print("|| <1>远程连接设备 <2>向左滑动 <3>向右滑动 ||\n")print("|| <4>向上滑动 <5>向下滑动 <6>跑Monkey ||\n")print("|| <7>单场景chrome测试 <8> <9> ||\n")print(" ========================================================= \n")# subprocess.Popen(# ['adb', 'shell', 'input', 'swipe', str(self.x1), str(self.y1), str(self.x1), str(self.y2), '500'],# stdout=subprocess.PIPE)# return int(width), int(height)# self.ScreenCapture(y1, y2, height)# subprocess.Popen(['adb', 'shell', 'input', 'swipe', str(self.x1), str(self.y1), str(self.x1), str(self.y2), '500'],stdout=subprocess.PIPE)def up_swipe(self):up_num = int(input("向上滑动多少次,用数字替代:"))interval_time = int(input("输入间隔的时间:"))for i in range(up_num):subprocess.Popen(['adb', 'shell', 'input', 'swipe', str(self.x1), str(self.y1), str(self.x1), str(self.y2), '500'],stdout=subprocess.PIPE)print("第{}次滑动".format(i + 1))sleep(interval_time)print("滑动结束,退出。。")sys.exit()def down_swipe(self):up_num = int(input("向下滑动多少次,用数字替代:"))interval_time=int(input("输入间隔的时间:"))for i in range(up_num):subprocess.Popen(['adb', '-s',{self.ip_input},'shell', 'input', 'swipe', str(self.x1), str(self.y2), str(self.x1), str(self.y1), '500'],stdout=subprocess.PIPE)sleep(interval_time)print("滑动结束,退出。。")sys.exit()def left_swipe(self):x1=str(int(self.width)*0.8)x2=str(int(self.width)*0.2)y1=str(int(self.height)*0.5)print(x1)print("滑动开始前")up_num = int(input("向左滑动多少次,用数字替代:"))for i in range(up_num):subprocess.Popen(['adb', 'shell', 'input', 'swipe', x2, y1, x1, y1, '500'],stdout=subprocess.PIPE)print("第{}次滑动".format(i+1))sleep(3)print("滑动结束,退出。。")sys.exit()def right_swipe(self):x1 = str(int(self.width) * 0.8)x2 = str(int(self.width) * 0.2)y1 = str(int(self.height) * 0.5)print(x1)print("滑动开始前")up_num = int(input("向左滑动多少次,用数字替代:"))for i in range(up_num):subprocess.Popen(['adb', 'shell', 'input', 'swipe', x1, y1, x2, y1, '300'],stdout=subprocess.PIPE)print("第{}次滑动".format(i + 1))sleep(3)print("滑动结束,退出。。")sys.exit()def get_device_id(self):self.adb_devices=os.popen("adb devices").read()self.adb_output = self.adb_devices.split("List of devices attached\n", 1)[1]lines = self.adb_output.strip().split('\n')# 遍历每一行,提取设备号self.device_ids = []for line in lines:# 如果行不是空的,并且包含"device",则提取设备号if line and "device" in line:device_id, _ = line.split(maxsplit=1) # maxsplit=1确保只分割一次self.device_ids.append(device_id.strip())self.device_ids=self.device_ids[0]logging.info(f'device_ids号是: {self.device_ids}')return self.device_idsdef adb_connect(self, device_ip):adb_command = ['adb', 'connect', f'{device_ip}:5555']try:subprocess.Popen("adb tcpip 5555", stdout=subprocess.PIPE)# subprocess.check_call("adb -s {} tcp ip 5555", stdout=subprocess.PIPE) #output = subprocess.check_output(adb_command, shell=True, stderr=subprocess.STDOUT)print(f"Connected to device at {device_ip}:5555")print(output.decode())except:print(f"Failed to connect to device at {device_ip}:5555", "请检查错误")sys.exit()def get_and_connect_ip(self):# 将原本在if num == 1下的代码移到这个方法中adb deip_command = f'adb -s {self.get_device_id()} shell ip route'result = subprocess.check_output(ip_command, shell=True, text=True)# 提取 IP 地址(这里假设IP地址是route命令输出的最后一行最后一个元素)ip_address = result.strip('\n').strip(' ').split(' ')[-1]print(f"Detected IP address: {ip_address},远程连接需拔掉USB设备")self.ip_input = input("输入你的IP地址(或者按回车使用检测到的IP):")if not self.ip_input:self.ip_input = ip_address # 如果用户没有输入,则使用检测到的IPself.adb_connect(self.ip_input)self.run() # 连接后重新显示菜单def chrome_switch(self):os.system("adb devices")while True:os.system(f'adb -s {self.ip_input} shell am start -a android.intent.action.VIEW -d "http://baidu.com"')sleep(5)for i in range(20):subprocess.Popen(['adb', '-s',self.ip_input,'shell', 'input', 'swipe', str(self.x1), str(self.y2),str(self.x1), str(self.y1), '500'],stdout=subprocess.PIPE)sleep(3)os.system(f'adb -s {self.ip_input} shell am start -a android.intent.action.VIEW -d "http://163.com"')sleep(5)for i in range(20):subprocess.Popen(['adb', '-s', self.ip_input, 'shell', 'input', 'swipe', str(self.x1), str(self.y2),str(self.x1),str(self.y1), '500'],stdout=subprocess.PIPE)sleep(3)#def adb_connect(self, ip_input):# 假设此方法用于连接ADB#print(f"Connecting to ADB with IP: {ip_input}")# ... 省略实际连接ADB的代码def run(self):ScreenCapture.show_menu() # 假设ScreenCapture是另一个模块或类,并且有show_menu方法num = int(input("输入你要选择的功能,用数字替代:"))# 定义动作字典action_mapping = {1: self.get_and_connect_ip,2: self.left_swipe,3: self.right_swipe,4: self.up_swipe,5: self.down_swipe,7: self.chrome_switch,}# 检查输入是否在映射中if num in action_mapping:action_mapping[num]()elif num == 6:# 对于特定的num值,可以直接处理passelse:print("\n\t输入有误!!!\t\n")self.run() # 递归调用,重新显示菜单和接收输入if __name__ == '__main__':ScreenCapture().run()
相关文章:
python+adb
#!/usr/bin/python env # -*- coding: utf-8 -*- import os import sys import subprocess from time import sleepimport logging logging.basicConfig(levellogging.DEBUG) class ScreenCapture():def get_screen_size(self):"""获取手机分辨率""&q…...
AIGC文本生成
文本生成是一种人工智能技术,它基于深度学习算法,根据给定的提示信息创作出有逻辑、连贯的文本内容。 文本生成所需的输入(提示或Prompt)可以是简单的关键词、一句话概述或是更复杂的指令和上下文信息。文本生成模型通过分析大量…...
系统架构设计师教程 第5章 5.4 软件测试 笔记
5.4 软件测试 5.4.1 测试方法 ★★★★★ 软件测试方法的分类有很多种, 以测试过程中程序执行状态为依据可分为静态测试 (Static Testing,ST) 和动态测试 (Dynamic Testing,DT); 以具体实现算法细节和系统内部结构的相关情况为根据可分黑盒测试、白盒测试和灰盒测…...
ASPICE评估全流程解析:汽车软件开发组织能力的系统化评估
ASPICE(Automotive SPICE)评估的过程是一个系统化和详尽的流程,旨在评估汽车软件开发组织在软件开发过程方面的能力。 以下是ASPICE评估过程的详细描述: 1. 评估准备阶段 a. 确定评估目标和范围 明确评估的目标,如评…...
合并RAR分卷压缩包
因为文件压缩之后体积仍然过大,大家可能会选择进行分卷压缩,那么rar分卷压缩包之后如何合并成一个压缩包文件呢?今天我们来学习rar分卷压缩包,合并成一个的方法。 最基础的方法就是将分卷压缩包解压出来之后,再将文件…...
重生奇迹MU 想去哪就去哪玩 轻松玩转翅膀属性
在重生奇迹MU这个游戏中,玩家需要扫荡各种怪物,勇斗BOSS,与其他玩家激战。在这个充满冒险的旅程中,翅膀是最重要的装备之一。拥有一个属性强大的翅膀,代表着玩家的成长与强大。穿上它,加速你的冒险之旅吧&a…...
Lnux-gcc/g++使用
目录 1.gcc/g介绍 1.什么是 gcc / g 2.gcc/g指令格式 2. gcc / g 实现程序翻译的过程 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.连接(生成可执行文件或库文件) 1.gcc/g介绍 1.什么…...
用Python创建一个键盘输入捕获程序
目录 简介 环境准备 安装依赖 项目结构 编写代码 1. 导入库 2. 定义回调函数 3. 启动键盘监听器 4. 整合代码 运行程序 结论 简介 在这篇博文中,我们将探索如何使用Python编写一个简单的键盘输入捕获程序。这个程序将实时捕获用户的键盘输入并在控制台中显示出来。…...
Mybatis中Like模糊查询三种处理方式
目录 Mybatis中Like模糊查询三种处理方式 1.通过单引号拼接${} 1)mapper接口 2)Mapper.xml 3)测试代码 4) 测试结果 2.通过concat()函数拼接(个人推荐使用这种) 1)mapper接口 2)Mapper.xml 3)测试代码 4) 测…...
STL值list
list容器 头文件:#include<list> - list是一个双向链表容器,可高效地进行插入删除元素 - list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符 注:list使用迭代器访问数据时可以一步一步走自增自减(即…...
结构体的内存对齐
对⻬规则: 1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。 对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。 但一些编译器下并没有默认对其数 3.结…...
Web 创建设计
Web 创建设计 Web 创建设计是一个涉及多个方面的过程,它包括网站的视觉设计、用户界面设计、用户体验设计、前端开发以及后端开发等。本文将详细介绍这些方面,并探讨如何创建一个既美观又实用的网站。 1. 视觉设计 视觉设计是网站创建设计的第一步,它决定了网站的外观和感…...
2024年9月16日历史上的今天大事件早读
1151年9月16日 南宋名将韩世忠逝世 1782年9月16日 清朝道光帝旻宁出生 1810年9月16日 墨西哥独立日 1856年9月16日 云南杜文秀领导回民起义 1880年9月16日 左宗棠创办的兰州机器织呢局开工 1908年9月16日 美国通用汽车公司成立 1919年9月16日 周恩来组织参加的觉悟社成立…...
记录工作中遇到的问题(持续更新~)
跨域问题(待排查) 2024-09-15 【前提】:前端配置了nignx转发,后端设置了跨域拦截,对http://xxxx做了允许跨域。但是访问http://xxx被拦截了,返回403 Forbidden。同样的配置放在另外一套部署的环境上就完全…...
六西格玛咨询:石油机械制造企业的成本控制与优化专家
一、石油机械制造行业现状及主要困扰 随着全球能源需求的日益增长,石油开采和生产设备需求不断增加,石油机械制造行业在过去数十年里得到了迅猛发展。然而,石油机械制造作为一个高度复杂且技术密集的行业,也面临着多重挑战。首先…...
Redis基础数据结构之 quicklist 和 listpack 源码解读
目录标题 quicklist为什么要设计 quicklist?quicklist特点ziplist quicklist数据结构 listpacklistpack是什么?listpack数据结构ziplist干啥去了?为什么有listpack?什么是ziplist的连锁更新?listpack 如何避免连锁更新࿱…...
深入理解Go语言的方法定义与使用
在Go语言编程中,方法(Method) 是附属于特定类型的函数,使我们能够以面向对象的方式编写代码。通过方法,我们可以更自然地对类型进行操作。本文将通过实际的代码示例,深入探讨Go语言中方法的定义与使用。 一…...
堆排序,快速排序
目录 1.堆排序 2.快速排序 1.hoare版本 2.挖坑法 3.前后指针法 注意点 1.堆排序 void Swap(int* a, int* b) {int tmp *a;*a *b;*b tmp; } void adjustdown(int* a, int n, int parent) {int child parent * 2 1;while (child < n){if (child 1 < n &&am…...
系统架构师---数据库设计的四个阶段
需求分析、概念设计、逻辑设计和物理设计是数据库设计中的四个关键阶段,每个阶段都有其独特的任务和目标,以下是对这四个阶段的区别的详细阐述: 需求分析阶段 目标:全面理解用户对数据库系统的需求,包括业务需求、信…...
MySQL_简介及安装、配置、卸载(超详细)
课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :…...
A53安全启动基石——TrustZone在A53中的硬件实现
该文章同步至公众号OneChan 开篇:回答上篇进阶思考 在上一篇探讨复位启动的种种陷阱后,我们留下的五个进阶思考问题,现在结合安全启动和TrustZone的特性进行分析: 1. 量子不确定性对复位电路的影响 量子隧穿效应:在…...
SAR信号处理中的汉宁窗优化——旁瓣抑制与分辨率平衡的艺术
1. 汉宁窗在SAR信号处理中的核心作用 我第一次接触汉宁窗是在处理火星探测器雷达数据时遇到的棘手问题。当时团队获取的火星次表层雷达图像出现了严重的旁瓣干扰,就像在干净的画布上泼洒了墨水点。导师随手调出汉宁窗函数说:"试试这个魔法棒"—…...
解决Flutter RefreshIndicator在单一列表项下的显示问题
在开发Flutter应用时,RefreshIndicator是一个非常有用的控件,它可以为列表视图提供下拉刷新的功能。然而,当列表中只有一个项目时,RefreshIndicator可能会遇到一个常见的问题:它不会显示。这篇博客将详细探讨这个问题的解决方案,并提供一个具体的实例。 问题描述 假设我…...
Android OTA包极速提取:payload-dumper-go完整实战指南 [特殊字符]
Android OTA包极速提取:payload-dumper-go完整实战指南 🚀 【免费下载链接】payload-dumper-go an android OTA payload dumper written in Go 项目地址: https://gitcode.com/gh_mirrors/pa/payload-dumper-go payload-dumper-go是一款专为Andro…...
快速掌握QQ空间历史说说备份:GetQzonehistory完整使用教程
快速掌握QQ空间历史说说备份:GetQzonehistory完整使用教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经担心QQ空间里的珍贵记忆会随着时间流逝而消失ÿ…...
[具身智能-241]:从OpenCV到CNN:人类认知模式在计算机视觉中的投影
人类大脑认知的两种模式:确定性的逻辑推演模式 不确定性的直觉经验模式,前者即“非此即彼的计算机技术”,后者即“数据经验主义的人工智能技术”。 人类的自然语言是模糊的,视觉亦是如此,OpenCV和CNN是这种思维模式的…...
RBF 神经网络车速预测模型功能说明书
基于RBF神经网络车速预测模型,根据历史车速信息,预测未来预测时域内的车速信息的时序预测模型,根据预测的信息对车辆进行控制可以对混动汽车的能量管理具有一定的参考意义 1.文件包括,训练工况(.mat数据,工…...
c语言实战:基于快马平台ai生成可部署的tcp聊天室服务器
今天想和大家分享一个用C语言实现的TCP聊天室服务器项目,这个项目完全在InsCode(快马)平台上完成,从代码生成到调试部署一气呵成。作为一个网络编程的经典案例,这个聊天室服务器涵盖了socket编程、多线程处理、IO复用等核心知识点,…...
你的Selenium爬虫被‘环境调试’弹窗卡住了吗?试试先清理浏览器缓存和Cookie
Selenium爬虫环境指纹污染解决方案:从缓存清理到浏览器隔离 环境指纹污染:爬虫开发者面临的新挑战 上周三凌晨3点,我的自动化数据采集系统突然发出警报——所有Selenium爬虫实例同时失效,目标网站清一色返回"环境异常"提…...
李慕婉-仙逆-造相Z-Turbo 生成Matlab算法脚本:从数学公式到可执行代码
李慕婉-仙逆-造相Z-Turbo 生成Matlab算法脚本:从数学公式到可执行代码 最近在帮一个做信号处理的朋友调试代码,他给我看了一页论文里的公式,问我怎么在Matlab里实现。我盯着那一堆希腊字母和矩阵运算,突然想到,要是能…...
