Airtest工具根据App页面文字信息提取坐标进行截图保存在自定义文件夹

Airtest工具根据App页面文字信息提取坐标进行截图保存在自定义文件夹

一、项目背景

  • 在一个项目中,选项被选中和未选中的节点元素的属性值无变化,通过AI识别率达不到百分百,想着通过计算图片的HSV值来判断选择能否被选中。(HSV比较友好,人更容易理解,为啥不要RGB是因为颜色模型太复杂,图片计算的RGB值不好判断颜色)回到正题上来,图片计算值时首先要扣出app选项的图片。看了网上好多资料,知识点比较零碎,我自己写了一个大体函数,有小伙伴遇到通用问题后就可以自己将函数粘贴的自己项目中,记住要带包。

二 、 解决思路及方法

  • airtest工具根据app页面信息提取坐标进行截图保存在自定义文件夹,关键词app页面信息就是页面上的文字,根据文字提取文字的坐标和尺寸(计算出的坐标和尺寸是相当App整个页面长宽百分比,需要获取整个页面的长宽,通过百分比计算定位到左上和右下坐标),通过坐标和尺寸计算出左上和右下的坐标值,通过这两个坐标值进行截图并保存在自定义文件下。在python自动化测试中,批量截图的文件命名以时间戳进行命名。直接上代码。

在这里插入图片描述

在这里插入图片描述

# -*- encoding=utf8 -*-
__author__ = "Administrator"

from airtest.core.api import *
from airtest.aircv import *

from airtest.core.api import *
from airtest.core.api import *
from airtest.aircv import *
from PIL import Image

from PIL import Image

auto_setup(__file__)


from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
# 刷脚本禁止写函数调用
screen = G.DEVICE.snapshot() 
# 局部截图

# 获取屏幕尺寸
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
android_poco= AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
screen_with, screen_height = android_poco.get_screen_size()
print("屏幕的宽度",screen_with,"屏幕的长度", screen_height)




def txt_zuo_biao_jie_tu(jiedian):
    
    print(len((jiedian)))
    for jiedian_i in range(len(jiedian)):
        print("开始计算")
        # 获取等级文本====成色
        jiedian_txt = jiedian[jiedian_i].child("android.view.View").get_text()
        print(jiedian_txt)
        # 获取元素节点

                
        jiedian_i_nod = jiedian[jiedian_i].child("android.view.View")
        # 获取节点坐标
        print(jiedian_i_nod.get_position())
        print(jiedian_i_nod.get_size())
        size_0 = jiedian_i_nod.get_size()
        position_0 = jiedian_i_nod.get_position()
        # 获取节点尺寸除以2

        for i_0 in range(len(size_0)):
            size_0[i_0] = size_0[i_0] / 2
        print(size_0)
#         # 计算坐标
        list_jia = []
        list_jian = []

        for index_0, item_0 in enumerate(position_0):
            list_jia.append(item_0 + size_0[index_0])

        print(list_jia)


        for index_0, item_0 in enumerate(position_0):
            list_jian.append(item_0 - size_0[index_0])

        print(list_jian)

        count = 1
        
        
        # 获取屏幕的大小
        
        
        list_jian_0 = []
        list_jia_0 = []
        # 获取坐标后开始截图
        list_jian_0.append(list_jian[0]*screen_with)
        list_jian_0.append(list_jian[1]*screen_height)

        list_jia_0.append(list_jia[0]*screen_with)
        list_jia_0.append(list_jia[1]*screen_height)
        
        
        

        c_0 = tuple(list_jian_0 + list_jia_0)
        print(c_0)
        # 截取图片区域
        screen = G.DEVICE.snapshot()

        # # 局部截图
        screen = aircv.crop_image(screen,c_0)

        # 保存局部截图到指定文件夹中
        pil_image = cv2_2_pil(screen)
        picture_name="{}_{}".format("截图颜色判断", time.strftime('%Y%m%d%H%M%S'))
        pil_image.save("G:/9月份pyqt项目/Airtest/代码/截图/untitled.air/{}.png".format(picture_name), quality=99, optimize=True)

    return("成功")

    
if __name__ == '__main__':
    jiedian = poco("android.widget.FrameLayout").offspring("com.wuba.zhuanzhuan:id/fah").child("android.webkit.WebView").offspring("app").child("android.view.View").child("android.view.View").child("android.view.View")[5].child("android.view.View").child("android.view.View")[1].child("android.view.View")[0].offspring("android.widget.ListView").child("android.view.View")

    txt_zuo_biao_jie_tu(jiedian)
  • 思路值得参考,代码写的比较乱,大家可以作为参考,以后再遇到类似的问题,直接上代码。当然有不足之处,多多包涵,小伙伴就自己补充,争取项目在最短时间内,不烧脑细胞可以完活。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊我对AI Agents技术的一些看法

小伙伴们!我来兑现承诺啦~ ps:接下来期待什么内容,欢迎在评论区留言! 今天,我们就来聊聊大模型 Agent。 最近这几个月,Agent 这一概念可谓火出天际,从 AutoGPT 一周 6 万 star 刷新…

云安全—K8s APi Server 6443 攻击面

0x00 前言 在未授权的一文中,详细描述了k8s api中的8080端口未授权的问题,那么本篇主要来说6443端口的利用。 0x01 API连接攻击面 1.匿名用户访问 匿名开放方式:kubectl create clusterrolebinding cluster-system-anonymous --clusterro…

K8S部署时IP问题

本次环境搭建需要安装三台Centos服务器(一主二从);搭配的前提时做好ip的设置 主机IP规划 IP地址的设定需要根据自己主机来设置,在虚拟机的虚拟网络编辑器中看他给你的ip;不要查什么ipconfig了。 在虚拟网络编辑器中…

Ansible中的任务执行控制

循环 简单循环 {{item}} 迭代变量名称 loop: - value1 - value2 - ... //赋值列表{{item}} //迭代变量名称循环散列或字典列表 - name: create filehosts: host1tasks:- name: file moudleservice:name: "{{ item.name }}"state: "{{…

UG\NX二次开发 先设置默认颜色再创建对象

文章作者:里海 来源网站:里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 qq_42461973 订阅本专栏,非常感谢。 简介 有粉丝问,可不可以先设置默认颜色再创建对象?这个是可以的,下面是例子: 效果 代码 #include "me.hpp" using namespace std;

毅速丨3D打印结合拓扑优化让轻量化制造更容易

轻量化可以减少产品的重量,提高产品的性能和效率,同时减少能源消耗和排放。尤其在航空航天、汽车制造造等行业对轻量化追求更高。当前,随着制造技术的发展,拓扑优化结合3D打印为轻量化制造带来的显著的优势正在逐渐凸显。 首先&am…

APM建设踩了哪些坑?去哪儿旅行分布式链路追踪系统实践

一分钟精华速览 分布式链路追踪系统在企业的APM体系中扮演着重要的角色。本文分享了去哪儿旅行构建分布式链路追踪系统的实践经验。从APM整体架构设计入手,讲述了日志收集、Kafka传输和Flink任务处理等环节的性能优化实践和踩坑经验。 同时,作者结合丰…

绝地求生msvcp140.dll丢失报错怎么办,这四个方法都可以解决

在回答这个问题之前,我们先来了解一下什么是msvcp140.dll。msvcp140.dll是微软Visual C 2015 Redistributable的一个组件,它包含了许多运行库文件,用于支持各种应用程序的正常运行。当你在玩《绝地求生》(俗称“吃鸡”&#xff09…

深入了解 CPU 的型号、代际架构与微架构

大家好,我是飞哥! 在 10 月 16 号的时候,Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机,我给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在…

谈一谈SQLite、MySQL、PostgreSQL三大数据库

每一份付出,必将有一份收货,就像这个小小的果实,时间到了,也就会开花结果… 三大数据库概述 SQLite、MySQL 和 PostgreSQL 都是流行的关系型数据库管理系统(RDBMS),但它们在功能、适用场景和性…

力扣每日一题94:二叉树的中序遍历

题目描述: 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入&#x…

【第28例】IPD体系进阶 | 需求管理:需求实现过程

目录 简介 内容详解 CSDN学院相关推荐 作者简介 简介 继续 IPD 体系中的需求管理相关的专题。 先来看看整个需求管理涉及的过程内容: 需求管理流程主要包含五个阶段: 需求收集; 需求分析; 需求分发/分配;

EasyExcel动态复杂表头导出方法

目录 需求分析解决方案数据问题数据导入 需求分析 公司数据比较特殊有一部分数据需要动态修改导致信息导入时表头是不确定的,但其中又有一部分表头是固定的,如下图所示,如果表头全部是固定的话可以通过EasyExcel实体类的注解很轻松的解决&am…

Java自学第3课:Java语言流程控制和字符串

1 复合语句 复合语句是以区块为单位的语句&#xff0c;也就是{}内的内容。 2 条件语句 if (布尔表达式){语句序列}else{语句序列} 有个好玩的是&#xff0c;对年龄段的分段&#xff0c;其实以前的思维是有点冗余的&#xff0c;比如a<100 & a>90&#xff0c;在复合…

文本内容转换成语音播放的工具:Speech Mac

Speech Mac版是一款适用于Mac电脑的语音合成工具。它将macOS语音合成器的所有功能整合到一个易于使用的界面中。通过Speech Mac版&#xff0c;用户可以选择40多种声音和语言&#xff0c;方便地将文本转换为语音。用户可以将文本拖放或粘贴到Speech中&#xff0c;并随时更改语音…

巴黎奥运会将基于阿里云实现云上转播

10月31日&#xff0c;2023杭州云栖大会&#xff0c;奥林匹克广播服务公司与奥林匹克频道服务公司首席技术官索蒂里斯萨拉穆里斯&#xff08;Sotiris SALAMOURIS&#xff09;表示&#xff0c;过去5年阿里云作为奥运会转播的基础设施&#xff0c;让奥运故事触达了更多全球观众。 …

mybatis-plus技巧--动态表名-多语句-拼接sql--关于mybatis的mysql分页查询总数的优化思考

文章目录 动态表名xml表名填充表名拦截器每天按统计每次设置 多语句操作forEach动态拼接 参数构建java进行拼接sqlmysql分页查询总数count不要使用count&#xff08;常数&#xff09;&#xff0c;count&#xff08;列名&#xff09;代替count(*)自己计数 SQL_CALC_FOUND_ROWSxm…

性能优化之懒加载 - 基于观察者模式和单例模式的实现

一、引入 在前端性能优化中&#xff0c;关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时&#xff0c;才去请求加载对应的图像。 原理也很简单&#xff0c;通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)&#xff0c…

JavaScript设计模式之责任链模式

适用场景&#xff1a;一个完整的流程&#xff0c;中间分成多个环节&#xff0c;各个环节之间存在一定的顺序关系&#xff0c;同时中间的环节的个数不一定&#xff0c;可能添加环节&#xff0c;也可能减少环节&#xff0c;只要保证顺序关系就可以。 如下图&#xff1a; ES5写法…

flutter之bloc使用详解

flutter中一切皆为Widget&#xff0c;因此在我们开发中&#xff0c;往往业务和UI逻辑写在一起&#xff0c;这样不利于代码维护&#xff0c;因此状态管理框架久诞生了&#xff0c;这篇就开始讲一讲Bloc。 对于Bloc库有两个&#xff0c;如下图&#xff1a; flutter_bloc其实是对…