自动化测试(二):安卓机初探与Python实现andriod截图实例

news2024/11/28 6:54:20

目录

  • 1.安卓开发常用术语介绍
  • 2. 各种SDK的安装(陆续补充ing)
    • 2.1 JDK的安装
    • 2.2 单独安装Android SDK部分组件
    • 2.3 Android NDK的安装
  • 3. python+minicap实现andriod截图实例
  • 4. TODO

1.安卓开发常用术语介绍

  • IDE (Integrated Development Environment) : 集成开发环境,提供程序开发环境的应用程序,即编程的地方。一般包括代码编辑器、编译器、调试器和图形用户界面,比如Java的InterlliJ IDEA、Python的Jupyter和Pycharm。

  • SDK (Software Development Kit) : 软件开发工具包,辅助开发某一类软件的相关文档、API必需资料、范例和工具的集合都可以叫做 “SDK”。Android SDK为开发者提供了库文件以及其他开发所用到的工具,其和IDE组合就成了开发环境。

    • Android SDK是Java语言
    • 除了安卓开发中的Android SDK,还有其他平台和技术的SDK。例如,iOS开发使用的是iOS SDK,用于开发苹果设备上的应用程序。还有微软的Windows SDK,用于开发Windows操作系统上的应用程序。还有针对特定硬件和软件的SDK,如游戏开发中的Unity SDK和Unreal Engine SDK。
    • SDK通过提供API让开发者可以使用现成的函数、类、方法和属性,更轻松地访问底层功能、集成第三方服务和构建应用程序。
  • NDK (Native Development Kit) :属于SDK的一种。针对Android平台的一种开发工具包,它允许开发者使用C、C++和其他本地编程语言来开发Android应用程序的一部分或全部功能。

    • Android应用程序开发通常使用Java编写应用程序的高级逻辑和界面。但NDK是基于C语言的。其实Android也可以不使用NDK,但这就需要开发操作完全在Java语言的范畴内,不能调用C/C++的第三方库。但是如果涉及到比较底层的部分, C/C++语言是避不开的,比如说想要直接操作内存。NDK使得开发人员可以对C/C++的第三方库进行操作编译。
    • NDK提供的工具和库使开发者能够将C/C++代码与Java结合使用。开发者可以使用NDK编写本地代码模块(Native Code Modules),然后通过JNI(Java Native Interface)将其集成到Android应用程序中。
    • 优势:在某些情况下,比如图像和音频的处理、游戏开发测试、访问摄像头\传感器\蓝牙\NFC等硬件功能,使用本地编程语言可以提供更好的性能、访问底层硬件或利用现有的C/C++库。
    • 劣势:使用NDK开发的本地代码模块需要处理更多的复杂性,包括手动内存管理和跨平台兼容性(架构兼容性、本地库和功能依赖性等)。
  • JDK (Java Development Kit) :是面向Java开发人员使用的SDK。

    • IntelliJ IDEA 可以与 JDK 集成,但它本身并不包含 JDK,而是依赖于 JDK 的安装和配置。IntelliJ IDEA 可以 JDK 提供的编译器和虚拟机来编译和运行 Java 代码,以便开发者可以在 IDE 中轻松地配置和管理 JDK,并使用 JDK 提供的功能进行开发。

2. 各种SDK的安装(陆续补充ing)

后续发现还是用Andriod Studio进行进行管理更方便。

2.1 JDK的安装

安装过程参考JDK的下载与安装(详细过程)

如果出现javac无法运行参考windows 10 java命令可以运行,但是‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件(已解决)

2.2 单独安装Android SDK部分组件

Win10 配置ADB安装2023.7.12版本

2.3 Android NDK的安装

Win10 配置NDK安装2023.7.19版本

3. python+minicap实现andriod截图实例

原本winn10配置minicap需要安装git、ndk、adb等,参考在Windows下编译与运行minicap,很麻烦。参考使用minicap+python实现录屏功能中利用airtest实现。

  1. pip install airtest
    airtest是网易开源的一款基于 Python 的、跨平台的UI自动化测试框架。

  2. 代码

    import cv2
    import airtest.core.api as air_api
    from airtest.core.helper import G
    
    
    def init_device():
        # auto_setup(basedir=None, devices=None, logdir=None, project_root=None, compress=None)
        # auto_setup 是一个用来初始化环境的接口,
        # 5个参数可以设置当前脚本所在的路径basedir、指定运行脚本的设备devices、设置默认的log路径logdir、设置脚本父路径方便 using 接口的调用和屏幕截图的压缩比率。
        # 可设置脚本运行时的log保存路径,默认值为None则不保存log,如果设置为True则自动保存在<basedir>/log目录中。
        print(__file__)
        air_api.auto_setup(__file__, logdir=True, devices=["Android:///", ])
        # 如果当前文件包含在 sys.path 里面,那么 __file__ 返回一个相对路径
        # 如果当前文件不包含在 sys.path 里面,那么 __file__ 返回一个绝对路径(此处我的文件不包含在sys.path中)
    
    
    def img_scale(image, size=612):
        # 输入你想要resize的图像高。
        height, width = image.shape[0], image.shape[1]
        # 等比例缩放尺度。
        scale = height / size
        # 获得相应等比例的图像宽度。
        width_size = int(width / scale)
        # resize
        image_resize = cv2.resize(image, (width_size, size))
        return image_resize
    
    
    def resolution_log():
        # 以手机屏幕为例,iphonex像素分辨率为1125x2436,是指屏幕横向能显示1125个物理像素点,纵向能显示2436个物理像素点。
        width = G.DEVICE.display_info['width']
        height = G.DEVICE.display_info['height']
        print('device independent pixels:', width, '×', height)
    
    
    def lp_screen():
        if G.DEVICE.display_info['orientation'] in [1, 3]:
            print('landscape')
            height = G.DEVICE.display_info['width']
            width = G.DEVICE.display_info['height']
        else:
            print('portrait')
            height = G.DEVICE.display_info['height']
            width = G.DEVICE.display_info['width']
    
    
    def snap2show(show=True):
        img = G.DEVICE.snapshot()
        if show:
            img = img_scale(img)
            cv2.imshow("src_image1", img)
            cv2.waitKey(0)
    
    
    if __name__ == '__main__':
        init_device()  # 初始化设备
        lp_screen()  # 查看屏幕状态:横屏landscape or 竖屏portrait
        resolution_log()  # 查看分辨率device independent pixels
        import time
    
        s = time.time()
        snap2show(show=False)
        e = time.time()
        print('snap time:', e - s)
    
    
  3. 效果演示:
    在这里插入图片描述
    在这里插入图片描述
    截图效果:
    在这里插入图片描述

4. TODO

  1. 自学一下airtest框架,看看源码、使用文档
  2. 为什么airtest里的minicap截图仍然需要3.02s?看网上说minicap为0.8秒,对不上,需要看看airtest是怎么使用minicap的。

    在这里插入图片描述
    通过调试,在console里面进行,只需要0.2~0.3s,应该是完整运行时是第一次启动(手机中minicap相关进程第一次启动用时可能较长,启动后用minicap向手机进行请求时就只需要截图时间了)

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

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

相关文章

索引的本质与数据结构

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 正确合理的创建索引是提升数据库查询性能的基础&#xff0c;因此针对数据库来说&#xff0c;索引是必须要掌握的。 1 数据库索引的本质 我们一说到索引&#xff0c;如果大家想到是一个类似于字典的目录&#xff0…

Eclipse整合tomcat时要注意的几点

Eclipse整合tomcat时要注意的几点 1、安装目录及jdk 2、参数配置 注意&#xff1a;Arguments的配置&#xff0c;日志输出文件目录及java内存大小设置等&#xff0c;如下&#xff1a; -Dcatalina.base"E:\apache-tomcat-7.0.52" -Dcatalina.home"E:\apache-tomc…

【hadoop】Java API连接(操作)HDFS

Java API连接&#xff08;操作&#xff09;HDFS 直接连接遇到的问题设置执行的用户为root用户使用Java的-D参数来设置环境变量使用chmod的命令赋予权限修改参数配置 直接连接遇到的问题 直接运行下面的代码&#xff0c;会出现权限不够的问题 Test public void test1() throws…

Meta牵手Microsoft推出下一代Llama 2

官方消息 1、今天&#xff0c;我们将介绍 Llama 2 的可用性&#xff0c;这是我们的下一代开源大型语言模型。 2、Llama 2免费用于研究和商业用途。 3、Microsoft和 Meta 正在扩大他们的长期合作伙伴关系&#xff0c;Microsoft 是 Llama 2 的首选合作伙伴。 4、在技术、学术…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务&#xff0c;锁&#xff0c;子查询 事务有点像是原子操作&#xff0c;需要有完整性&#xff0c;要么全都完成了&#xff…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文&#xff1a;FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

基于大模型的Text2SQL微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

(转载)基于 BP_Adaboost 的强分类器设计(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数…

Postman传递对象参数(包含有集合对象)

postman通常需要传递各式各样的参数&#xff0c;本文主要介绍了Postman传递对象参数(包含有集合对象)&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 项目场景&#xff1a; postman通常需要传递各式各样的参数&#xff0c;这样的话&#xff0c;进行…

自然语言处理与词嵌入

1、词表特征 前面介绍过表征单词的方式是首先建立一个较大的词汇表&#xff08;例如10000&#xff09;&#xff0c;然后使用one-hot的方式对每个单词进行编码。例如单词Man&#xff0c;Woman&#xff0c;King&#xff0c;Queen&#xff0c;Apple&#xff0c;Orange分别出现在词…

Docker数据管理和网络通信 dockerfile

Docker数据管理和网络通信 dockerfile 一&#xff1a;Docker 的数据管理1&#xff0e;数据卷2&#xff0e;数据卷容器 二&#xff1a;端口映射三&#xff1a;容器互联&#xff08;使用centos镜像&#xff09;四&#xff1a;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&am…

C++入门先填坑

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习也有一定的帮助。 C入门先填坑系列主要内容会围绕以下方面 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计不…

servlet Filter与spring的OncePerRequestFilter

servlet 规范 javax.servlet Filter 任何的servlet容器都要实现的&#xff0c;例如tomcat、undertow、jetty等等。类似于jdbc规范&#xff0c;制定好了一个约束&#xff0c;各家数据库厂商根据规范开发对应的驱动来实现访问自己的数据库。 spring 对于Filter的自定义实现 所…

NLP(六十)Baichuan-13B-Chat模型使用体验

2023年7月11日&#xff0c;百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。   本文将介绍大模型BaiChuan-13B-Chat的使用体验&#xff0c;其HuggingFace网址为&#xff1a;https://huggingface.co/bai…

【C语言day02】

转义字符 \\ 表示字符\&#xff0c;\123表示字符{&#xff0c;\t表示制表符&#xff0c;这些都是一个字符宏只是替换 替换后NUM的样子是(211)*21/2常量指针与指针常量 const和* 来区别&#xff0c;如果是const * 这样的顺序就是常量指针&#xff0c;所以说他的本质是指针&am…

uni-app:请求后端数据uni.request

完整代码&#xff1a; onLoad() {uni.request({url: getApp().globalData.position Produce/select_employee,data: {username: getApp().globalData.username,},method: POST,dataType: json,success: res > {this.employee_name res.data.info.employee_name;// consol…

uniapp 之 微信小程序、支付宝小程序 对于自定义导航栏的不同

目录 前言 微信小程序 代码 支付宝小程序 首页配置文件 二级菜单页面 配置 总结 不同 相同 前言 小程序都是 uni-app 写的 不是原生 微信小程序 代码 pages.json文件中配置 重点&#xff1a; "navigationStyle": "custom", // 导航栏样式…

安卓开发日记问题记录(隐藏标题栏中的应用名称)

当我们设置了显示标题栏&#xff0c;应用名也会显示出来&#xff0c;这对设置标题栏内容很不方便 可以在activity里的onCreate部分设置这句代码隐藏APP名字 getSupportActionBar().setDisplayShowTitleEnabled(false);或者改变它 getSupportActionBar().setTitle("new …

疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接)

疲劳驾驶检测和识别1&#xff1a; 疲劳驾驶检测和识别数据集(含下载链接) 目录 疲劳驾驶检测和识别1&#xff1a; 疲劳驾驶检测和识别数据集(含下载链接) 1. 前言 2. 疲劳驾驶类别说明 3. 疲劳驾驶检测数据集&#xff1a; &#xff08;1&#xff09;Drowsy-Driving-Det1 …

hadoop安全保护机制(kerberos + ldap)

信息安全理论&#xff1a; CIA模型&#xff1a;机密性、完整性和可用性 CIA模型能够帮助建议一些信息安全原则&#xff0c;但该模型并不是一个需要严格遵守的规则 hadoop平台可能设计多个CIA模型组件&#xff0c;也kennel一个也不涉及 机密性&#xff1a; 信息只应该被期望的…