当前位置: 首页 > news >正文

Qt Windows自定义GUI界面自动化测试——uiautomatio通过树节点属性定位控件

Qt Windows自定义GUI界面自动化测试

提示:点击链接跳转其他相关文章
Windows自定义GUI界面自动化测试框架选择
autoit
uiautomatio基本使用
uiautomatio通过树节点属性定位控件


uiautomatio通过树节点属性定位控件

  • Qt Windows自定义GUI界面自动化测试
  • 前言
  • 一、实现方式?
    • inspect.exe
    • uiautomation.py
    • 窗口相关
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结

前言

前面我们已经对与windows GUI应用自动化测试工具进行了大致介绍,并选用python搭建uiautomation的方式实现Qt应用程序的自动化测试,通过inspect.exe进行附注获取窗口界面控件及各个属性。
进行了简单的界面控件操作,我们发现通过调用uiautomation不管是获取item还是button都需要一个控件名或者Id(Name、uiautomationId)等参数,但是稍微复杂一点的Qt项目都涉及到许多自定义控件来封装自定义的样式或实现方法,这就使得uiautomation无法匹配到特定的类型,或通过其名称寻找到指定控件,考虑到直接控制鼠标到固定坐标点进行操作无法应对某些多变的响应情况,所以选用控件父子节点关系来选中到唯一指定的控件。
需要注意的是,某些界面中的控件存在动态显影效果,这会使得uiautomation无法实时获取对应的控件和位置,在史记操作中我们应该对此类控件的查找进行慎重考虑。


一、实现方式?

inspect.exe

快捷键功能
Ctrl+Shift+F6父节点
Ctrl+Shift+F7第一个子节点
Ctrl+Shift+F8下一个子节点
Ctrl+Shift+F9下一个相邻节点
Ctrl+Shift+F5上一个相邻节点

标记边框通过快捷键可以查看控件的关系(也可以通过查询窗口左侧的工程树直接查看)

uiautomation.py

获取节点相关函数及使用。
此处建议先浏览def WalkTree()函数属性一下相关操作原理。
下面是WalkTree()对应源码实现。

defWalkTree(top,getChildren:Callable[[TreeNode],List[TreeNode]]=None,getFirstChild:Callable[[TreeNode],TreeNode]=None,getNextSibling:Callable[[TreeNode],TreeNode]=None,yieldCondition:Callable[[TreeNode,int],bool]=None,includeTop:bool=False,maxDepth:int=0xFFFFFFFF):ifmaxDepth<=0:returndepth=0ifgetChildren:ifincludeTop:ifnotyieldConditionoryieldCondition(top,0):yieldtop,0,0children=getChildren(top)childList=[children]whiledepth>=0:# or while childList:lastItems=childList[-1]iflastItems:ifnotyieldConditionoryieldCondition(lastItems[0],depth+1):yieldlastItems[0],depth+1,len(lastItems)-1ifdepth+1<maxDepth:children=getChildren(lastItems[0])ifchildren:depth+=1childList.append(children)dellastItems[0]else:delchildList[depth]depth-=1elifgetFirstChildandgetNextSibling:ifincludeTop:ifnotyieldConditionoryieldCondition(top,0):yieldtop,0child=getFirstChild(top)childList=[child]whiledepth>=0:# or while childList:lastItem=childList[-1]iflastItem:ifnotyieldConditionoryieldCondition(lastItem,depth+1):yieldlastItem,depth+1child=getNextSibling(lastItem)childList[depth]=childifdepth+1<maxDepth:child=getFirstChild(lastItem)ifchild:depth+=1childList.append(child)else:delchildList[depth]depth-=1

函数说明:不使用递归算法遍历树。
top: 初始节点.
getChildren: 返回子节点listList[TreeNode].
getFirstChild: 返回第一个子节点TreeNode.
getNextSibling: 返回下一个邻节点TreeNode.
yieldCondition: 迭代条件
includeTop: 是否从top节点开始迭代
maxDepth: int, 遍历深度.

如果getChildren有效,则忽略getFirstChild和getNextSibling,迭代3 items元组:(treeNode,depth,在当前深度中保留子项计数)。
如果getChildren无效,则使用getFirstChild和getNextSibling,迭代2 items元组:(treeNode,depth)。
如果yieldCondition不为None,则只生成迭代条件(treeNode:treeNode,depth:int)->bool返回True的树节点。

代码如下(示例):

defGetDirChildren(dir_):ifos.path.isdir(dir_):return[os.path.join(dir_,it)foritinos.listdir(dir_)]forit,depth,leftCountinWalkTree('D:\\',getChildren=GetDirChildren):print(it,depth,leftCount)

窗口相关

classWindowPattern():defClose(self,waitTime:float=OPERATION_WAIT_TIME)->bool:defIsModal(self)->bool:defIsTopmost(self)->bool:defWindowInteractionState(self)->int:#窗口交互状态classControl():defIsEnabled(self)->bool:defIsKeyboardFocusable(self)->bool:defGetAncestorControl(self,condition:Callable[['Control',int],bool])->'Control':defGetParentControl(self)->'Control':defGetFirstChildControl(self)->'Control':defGetLastChildControl(self)->'Control':defGetNextSiblingControl(self)->'Control':defGetPreviousSiblingControl(self)->'Control':defGetSiblingControl(self,condition:Callable[['Control'],bool],forward:bool=True)->'Control':defGetChildren(self)->List['Control']:defGetPosition(self,ratioX:float=0.5,ratioY:float=0.5)->Tuple[int,int]:defMoveCursorToMyCenter(self,simulateMove:bool=True)->Tuple[int,int]:defClick(self,x:int=None,y:int=None,ratioX:float=0.5,ratioY:float=0.5,simulateMove:bool=True,waitTime:float=OPERATION_WAIT_TIME)->None:defMiddleClick(self,x:int=None,y:int=None,ratioX:float=0.5,ratioY:float=0.5,simulateMove:bool=True,waitTime:float=OPERATION_WAIT_TIME)->None:defRightClick(self,x:int=None,y:int=None,ratioX:float=0.5,ratioY:float=0.5,simulateMove:bool=True,waitTime:float=OPERATION_WAIT_TIME)->None:defDoubleClick(self,x:int=None,y:int=None,ratioX:float=0.5,ratioY:float=0.5,simulateMove:bool=True,waitTime:float=OPERATION_WAIT_TIME)->None:defRightDragDrop(self,x1:int,y1:int,x2:int,y2:int,moveSpeed:float=1,waitTime:float=OPERATION_WAIT_TIME)->None:defWheelDown(self,x:int=None,y:int=None,ratioX:float=0.5,ratioY:float=0.5,wheelTimes:int=1,interval:float=0.05,waitTime:float=OPERATION_WAIT_TIME)->None:defWheelUp(self,x:int=None,y:int=None,ratioX:float=0.5,ratioY:float=0.5,wheelTimes:int=1,interval:float=0.05,waitTime:float=OPERATION_WAIT_TIME)->None:

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore')import ssl ssl._create_default_https_context=ssl._create_unverified_context

2.读入数据

代码如下(示例):

data=pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

http://www.jsqmd.com/news/588000/

相关文章:

  • 从手机信令到城市画像:数据驱动的精细化人口洞察与规划实践
  • 2026最权威的六大AI科研神器推荐
  • 雷电模拟器+Xposed框架抓包实战:解决Fiddler无法捕获APP流量的完整指南
  • 革新桌面笔记!Sticky让灵感捕捉效率提升300%
  • 图书管理系统(增删改查,附源码,包含数据库交互以及图形化界面)
  • 学习记录:从零开始学AI(一)——Scikit-learn加州房价机器学习例子学习笔记:第一个Scikit-learn机器学习例子(加州房价)
  • 终极Luban内存泄漏解决方案:从Handler到Context的全面优化指南
  • 国产替代新选择:实测IC封装网/CMS云下载PCB封装的完整流程与局限性
  • 3步实现Dell G15散热控制优化:开源替代AWCC的终极方案
  • 开源音频转换工具fre:ac全攻略:从入门到精通
  • WSA-Script技术指南:构建增强型安卓子系统环境
  • 全球SAR卫星大盘点与回波数据处理专栏目录
  • mysql 常用sql
  • 论文AI率降完还是不过?可能是这个降AI方法没选对
  • SystemBarTint与Google Maps集成:解决地图布局的终极方案 [特殊字符]️
  • 单服务器高性能模式
  • XREAL冲刺AR眼镜第一股:9年融22亿难盈利,年营收5亿净亏4亿
  • 残差块架构改进YOLOv26双层卷积与恒等映射协同突破
  • Dankoe新作《使命与收益》读书笔记11|一人公司,不是找风口,是成为解决问题的人
  • React Native原生开发环境搭建终极指南:Este框架iOS与Android配置全流程
  • 手把手教你用C语言实现Euromap63协议采集(附完整代码示例)
  • k8s蓝绿发布简介
  • 设计模式笔记
  • java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Maven/maven-repository/org/spring
  • 新手零基础入门:用快马AI生成你的第一个Python自动化测试脚本
  • 新手福音:快马一键生成鸿蒙pc镜像下载与入门指导应用
  • 消息保护神器:RevokeMsgPatcher让重要对话不再消失
  • SystemBarTint终极着色指南:从颜色到Drawable的完整实现教程
  • 优测云真机成本对比与落地实践解析
  • 知网检测AI率高怎么降效果好?这3种方法按情况选