【python】UI自动化-uiautomation
UI自动化-uiautomation
- 0- 前言
- 1- inspect
- 2- uiautomation
- 3- 【实战】RustDesk软件自动 安装、指定服务器信息
- 4- 参考文章
0- 前言
做应用程序自动点击的记录,暂不完整,仅供参考。参考多位大佬文章,链接在后面
涉及工具
- inspect【应用程序元素定位辅助工具; UI SPY 这个软件好像也可以,见别人用过】
- uiautomation【本文自动化的重点】
- pyautogui【技术不到位,有些元素没法精确定位,用uiautomation获取旁边元素的位置坐标,再用这个模拟键鼠操作】
1- inspect
# --常用解析--# Name,有些程序有,有些没有
Name: "学习助手"# ControlType,控件类型,查找窗口的时候 不同控件类型,用不同方法
ControlType: UIA_WindowControlTypeId (0xC370)# BoundingRectangle,边界矩形,显示这个窗口或按钮、标签、文本框 的 位置信息【左上x坐标,左上y坐标,右下x坐标,右下y坐标】
BoundingRectangle: {l:88 t:110 r:358 b:309}# 这个 查找窗口的时候 用
ClassName: "TkTopLevel"
How found: Selected from tree...
Name: "微信"
ControlType: UIA_WindowControlTypeId (0xC370)
LocalizedControlType: "窗口"
BoundingRectangle: {l:-498 t:193 r:642 b:998}
IsEnabled: true
IsOffscreen: false
IsKeyboardFocusable: false
HasKeyboardFocus: false
AccessKey: ""
ProcessId: 2708
RuntimeId: [2A.2406AE]
FrameworkId: "Win32"
ClassName: "WeChatMainWndForPC"
NativeWindowHandle: 0x2406AE
IsControlElement: true
ProviderDescription: "[pid:2400,providerId:0x2406AE Main:Nested [pid:2708,providerId:0x2406AE Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main:Microsoft: MSAA Proxy (IAccessible2) (unmanaged:uiautomationcore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]"
AriaProperties: ""
IsPassword: false
IsRequiredForForm: false
IsDataValidForForm: true
HelpText: ""
Culture: 0
IsDialog: false
LegacyIAccessible.ChildId: 0
LegacyIAccessible.DefaultAction: ""
LegacyIAccessible.Description: ""
LegacyIAccessible.Help: ""
LegacyIAccessible.KeyboardShortcut: ""
LegacyIAccessible.Name: "微信"
LegacyIAccessible.Role: 客户端 (0xA)
LegacyIAccessible.State: 正常 (0x0)
LegacyIAccessible.Value: ""
Transform.CanMove: true
Transform.CanResize: true
Transform.CanRotate: false
Window.CanMaximize: true
Window.CanMinimize: true
Window.IsModal: false
Window.IsTopmost: false
Window.WindowInteractionState: ReadyForUserInteraction (2)
Window.WindowVisualState: Normal (0)
IsAnnotationPatternAvailable: false
IsDragPatternAvailable: false
IsDockPatternAvailable: false
IsDropTargetPatternAvailable: false
IsExpandCollapsePatternAvailable: false
IsGridItemPatternAvailable: false
IsGridPatternAvailable: false
IsInvokePatternAvailable: false
IsItemContainerPatternAvailable: false
IsLegacyIAccessiblePatternAvailable: true
IsMultipleViewPatternAvailable: false
IsObjectModelPatternAvailable: false
IsRangeValuePatternAvailable: false
IsScrollItemPatternAvailable: true
IsScrollPatternAvailable: false
IsSelectionItemPatternAvailable: false
IsSelectionPatternAvailable: false
IsSpreadsheetItemPatternAvailable: false
IsSpreadsheetPatternAvailable: false
IsStylesPatternAvailable: false
IsSynchronizedInputPatternAvailable: false
IsTableItemPatternAvailable: false
IsTablePatternAvailable: false
IsTextChildPatternAvailable: false
IsTextEditPatternAvailable: false
IsTextPatternAvailable: false
IsTextPattern2Available: false
IsTogglePatternAvailable: false
IsTransformPatternAvailable: true
IsTransform2PatternAvailable: false
IsValuePatternAvailable: false
IsVirtualizedItemPatternAvailable: false
IsWindowPatternAvailable: true
IsCustomNavigationPatternAvailable: false
IsSelectionPattern2Available: false
FirstChild: "" 窗格
LastChild: "" 窗格
Next: "【python】UI自动化-uiautomation.md• - Typora" 窗口
Previous: "Home - 360极速浏览器X 21.0" 窗口
Other Props: Object has no additional properties
Children: "" 窗格"" 窗格
Ancestors: "桌面 1" 窗格[ No Parent ]
2- uiautomation
一、uiautomation方法
方法 | 备注 |
---|---|
WindowContrl(searchDepth,ClassName,SubName) | 查找窗口中的程序,如果有中文则需用Unicode |
window.Exists(maxSearchSeconds) | 来判断此窗口是否存在 |
EditControl(searchFromControl) | 查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue(“string”)输入值 |
Win32API.SendKeys(“string”) | 如果已在编辑位置,则可用此方法来输入值,{Ctrl}为ctrl键,其他类似;{@8}格式可输入8个@,对于数字也可实现此功能,但对于字母不能…; |
MenuItemControl(searchFromControl,Name) | 查找菜单按钮 |
ComboBoxControl(searchFromControl,AutomationI) | 查找下拉框,然后在此基础上用Select(“name”)方法来选择需要的选项 |
import uiautomation
import subprocess# 查找窗口中的程序,如果有中文则需用Unicode;可用
uiautomation.WindowContrl(searchDepth,ClassName,SubName) # 来判断此窗口是否存在
uiautomation.window.Exists(maxSearchSeconds)# 查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue(“string”)输入值
uiautomation.EditControl(searchFromControl) # 查找菜单按钮
uiautomation.MenuItemControl(searchFromControl,Name) # 查找下拉框,然后在此基础上用Select(“name”)方法来选择需要的选项
uiautomation.ComboBoxControl(searchFromControl,AutomationI)# 查找按钮
uiautomation.BottonControl(searchFromControl,Name,SubName)
# Uiautomation元素获取方法如下程序窗口:uiautomation.WindowControl
按钮:uiautomation.ButtonControl
文本:uiautomation.TextControl
输入窗口:uiautomation.EditControl
文档控件:uiautomation.DocumentControl
单选控件:uiautomation.CheckBoxControl
复选控件:uiautomation.ComboBoxControl
日历控件:uiautomation.CalendarControl'''
ControlType为”ControlType.Window”
那么捕获窗口就用:uiautomation.WindowControl如果ControlType为”ControlType.Text”
那么捕获窗口就用:uiautomation.TextControl依次类推...
如果ControlType为”ControlType.Xxx”
那么捕获窗口就用:uiautomation.XxxControl如果类型不明确,则使用uiautomation.Control
'''
# 常用的操作有
DoubleClick()双击
Click()单击
RightClick()右键点击
SendKeys()发送字符
SetValue()传值
# 三、对windows程序常用操作subprocess.Popen(‘Name’) 用进程打开程序;window.Close() 关闭窗口;window.SetActive() 使用;window.SetTopMost() 设置为顶层window.ShowWindow(uiautomation.ShowWindow.Maximize) 窗口最大化window.CaptureToImage(‘Notepad.png’) 截图;
3- 【实战】RustDesk软件自动 安装、指定服务器信息
下面代码引入的文件 的内容
192.168.1.78
vEJU4Fasd/asdadagsdaasdgadfasdasfasfaasffffffddddddddddddddda6W8=
rustdesk-1.1.9-putes.exe---读取顺序---
---第1行 服务器ip---
---第2行 KEY---
---第3行 rustdesk安装包名字[要带拓展名]---功能:自动安装rustdesk客户端,安装后开启"允许IP直接访问",执行期间不要使用键盘鼠标
# -*- coding: utf-8 -*-
# @Time : 2022/11/18 9:06
# @File : UI自动化.py
# @Software: PyCharmimport time
import uiautomation as auto
import subprocessimport pyautogui
import pyperclip
import osf = open('key.txt', mode='r', encoding='utf-8')
key_list = f.read().split('\n')
f.close()# 打开软件
subprocess.Popen(key_list[2])
auto.uiautomation.SetGlobalSearchTimeout(5) # 设置全局搜索超时 5# 获取
print('----开始安装--请勿操作键盘鼠标----')
win_0 = auto.WindowControl(searchDepth=1, Name="", ClassName='H-SMILE-FRAME')
win_0.ButtonControl(Name='同意并安装').Click()
# time.sleep(int(key_list[2]))
time.sleep(10)
for i in range(1, 20):print(f'{i}')if os.access(r'C:\Users\Public\Desktop\RustDesk.lnk', os.X_OK):time.sleep(5)try:win_0 = auto.WindowControl(searchDepth=1, Name="", ClassName='H-SMILE-FRAME')win_0.ButtonControl(Name='关闭').Click()time.sleep(3)except:passbreakelse:time.sleep(1)# -------执行-----
print('打开软件')
subprocess.Popen(r"C:\Program Files\RustDesk\RustDesk.exe")
# os.system(r'start C:\"Program Files"\RustDesk\RustDesk.exe')
auto.uiautomation.SetGlobalSearchTimeout(5) # 设置全局搜索超时 5# 获取
win = auto.WindowControl(searchDepth=1, Name="", ClassName='H-SMILE-FRAME')
print(win.BoundingRectangle)# 点击最大化
# win.ButtonControl(Name="最大化").Click()# 控制的应用窗口前置
win.SetTopmost(True)# 获取 三个点 位置
button = win.TextControl(Name='你的桌面可以通过下面的ID和密码访问。')
# print(button.BoundingRectangle)# ---把三个点的位置转换成列表,并点击---
a = str(button.BoundingRectangle)a = list(map(int, a[1:a.find(')')].split(','))) # 把列表中的字符串转成整型print(a)# x,y 为 单击坐标,button 为 鼠标左或右键点击('left' / 'right')
pyautogui.click(a[2], a[3] + 20, button='left')
time.sleep(1)
# ---把三个点的位置转换成列表,并点击---END---# 设置
win.TextControl(Name='允许IP直接访问').Click()pyautogui.click(a[2], a[3] + 20, button='left')
time.sleep(1)
win.TextControl(Name='ID/中继服务器').Click()
time.sleep(1)# pyautogui.hotkey('ctrl', 'a') # 按下 ctrl + c 组合键。此次测试不生效
# ---------
def key_cv(c, v):""" 模拟执行快捷键 """pyautogui.keyDown(c)pyautogui.keyDown(v)pyautogui.keyUp(v)pyautogui.keyUp(c)key_cv('ctrl', 'a')pyperclip.copy(key_list[0]) # 复制
pyperclip.paste() # 粘贴key_cv('ctrl', 'v')# ---------time.sleep(0.5)
pyautogui.press('Tab')
pyautogui.press('Tab')
pyautogui.press('Tab')# ---------
key_cv('ctrl', 'a')pyperclip.copy(key_list[1]) # 复制
pyperclip.paste() # 粘贴key_cv('ctrl', 'v')time.sleep(1)
pyautogui.press('tab')
pyautogui.press('tab')
time.sleep(0.5)
pyautogui.press('enter')time.sleep(1)win.ButtonControl(Name='关闭').Click()
print('--------执行结束--------')
time.sleep(5)
4- 参考文章
# inspect
https://blog.csdn.net/knighthood2001/article/details/124297008# uiautomation
https://blog.csdn.net/yangzhichao_csdn/article/details/124799781
https://blog.csdn.net/chenmozhe22/article/details/106926071
https://blog.csdn.net/qq_21142893/article/details/84874406# PyautoGui
https://blog.csdn.net/weixin_38640052/article/details/112387653
【python】UI自动化-uiautomation相关推荐
- python ui自动化配置文件,python UI自动化实战记录八:添加配置
添加配置文件写入测试地址等,当环境切换时只需修改配置文件即可. 1 在项目目录下添加文件 config.ini 写入: [Domain] domain = http://test.domain.cn ...
- python ui自动化_pythonUI自动化整理
python实现UI自动化整理 1.用到的包 selenium 常见的浏览器操作 openpyxl 读写处理excel数据参数 PyMySQL(python3) 读写mysql数据库 unittest ...
- python UI自动化知识点总结
关于python自动化的知识点问答 使用selenium做自动化测试常见问题 1.selenium中如何判断元素是否存在? isElementPresent 2.selenium中hidden或者是d ...
- appium示例代码python_(appium+python)UI自动化_07_UI自动化实例【拼多多搜索商品为例】...
前言 初学UI自动化的小伙伴,在配置好appium+python自动化环境后,往往不知道如何下手实现自动化.小编在初期学习的时候也有这种疑惑,在此以拼多多搜索为实例,展示下appium是如何实现自动化 ...
- python 苹果试玩_(appium+python)UI自动化_01_自动化环境搭建【MAC版】
Appium简介 Appium是一个开源的.跨平台的测试框架,主要用来进行app UI自动化,适用于原生应用.混合应用和移动网页应用(H5页面).目前支持Python.JavaScript.Objec ...
- python ui自动化测试仪器_python UI自动化测试
为了减小维护成本: 1.UI自动化测试需要有较为稳定的环境 2.代码设计合理,那么我们就需要面向对象的设计一个框架,将重复的代码模块化 一.首先总结一下 UI自动化大概要哪些模块 1.config(配 ...
- python ui自动化脚本_ui自动化:python+appium----环境搭建
前言: appium可以说是app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本支持java和python.以下为python+appium的安装教程... 环境准备... ...
- python代码设计测试用例_(appium+python)UI自动化_08_unittest编写测试用例
前言 unittest是python自带的单元测试框架,类似于Junit(Java单元测试框架).支持自动化测试,可编写测试前置&后置条件,并且可批量运行测试用例并生成测试报告. 使用unit ...
- python ui自动化配置文件,Python+Selenium进行UI自动化测试项目中,常用的小技巧2:读取配置文件(configparser,.ini文件)...
在自动化测试项目中,可能会碰到一些经常使用的但 很少变化的配置信息,下面就来介绍使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [config ...
最新文章
- 昨夜,5G R16标准正式冻结!5G物联网扬帆起航
- 信息安全系统设计基础第十一周学习总结
- CodeForces - 632E Thief in a Shop 完全背包
- 开运算和闭运算_OpenCV计算机视觉学习(5)——形态学处理(腐蚀膨胀,开闭运算,礼帽黑帽,边缘检测)...
- java爬取新浪微博登陆_30行jsoup代码搞定新浪微博登录抓取爬虫
- php 跨二级域名 设置cookie
- php crypt mysql password_使用PHP 5.5的password_hash和password_verify函数
- 探地雷达(GPR)的 C-scan (三维图)的绘制
- 特斯拉员工薪酬曝光 最低54万元!
- 利用php利用root权限执行shell脚本必须进行以下几个步骤
- ERStudio使用细则
- linux化学公式软件下载,化学公式编辑器下载-Efofex FX Chem(化学公式编辑器)下载 v3.004.0 官方特别版-IT猫扑网...
- WIN10创建虚拟桌面
- android N编译
- Jenkins集成动态salve报错 连接测试报错:
- 移动apn接入点哪个快_51物联卡:使用物联网卡时为什么总要让你设置APN?
- 新的开始,fighting
- 魔改大西瓜源码下载之后画面显示只有一半的解决方法
- APP强制更新(uni-app)
- 前端面试题【131道】
热门文章
- android permission denial starting intent,adb shell 启动应用时的权限问题
- Office Online Server 文档在线预览编辑【速成篇】
- 通过一张图片分析拍摄地点
- php 便利jq,jquery怎样遍历数组?jquery遍历数组常用的两种方式
- Matlab之设定运行内核数量函数——parpool
- 我今年收到最特别的新年礼物!
- 如何使用ContentResolver
- 都说PHP简单,那新手开始如何入门PHP?
- 没人比得过的游吧看吧
- 报错 | {errMsg: “chooseWXPay:fail, the permission value is offline verifying“}errMsg: “chooseWXPay