python进行简单的app自动化测试(pywinauto)+ 截屏微信二维码

news2024/11/18 21:48:34

一、开始需要了解准备

1、安装

pip install pywinauto

2、选择(后面会通过工具进行判断用哪个)

在这里插入图片描述

3、自动化控制进程的范围

在这里插入图片描述

示例

Application单进程
在这里插入图片描述

Desktop多进程

在这里插入图片描述

4、程序辅助检测工具

在这里插入图片描述
3中的下载连接
链接

点击放大镜拖到对应位置即可

二、简单的开始

1、打开应用程序

在这里插入图片描述

from pywinauto.application import Application

# 打开指定的程序
### 1、打开自带的记事本
app = Application(backend="uia").start("notepad.exe")

### 2、 打开qq r为转义符
app = Application(backend="uia").start(r"D:\qq\Bin\QQScLauncher.exe")

2、使用句柄工具

在这里插入图片描述
拖着放大镜到打开的应用上就可以看到信息
在这里插入图片描述

每次打开都会改变的

3、去连接你打开的应用程序(已经打开的窗口)

from pywinauto.application import Application

if __name__ == '__main__':
    # 通过进程号进行连接
    # app = Application("uia").connect(process=16264)
    # print(app)

    # 通过窗口句柄进行连接
    app = Application("uia").connect(handle=265004)
    print(app)

4、如何选择对应的窗口

ps注意这里win32打不开就去换成uia

在这里插入图片描述

from pywinauto.application import Application


if __name__ == '__main__':
    # 启动qq
    app = Application("win32").start(r"D:\qq\Bin\QQ.exe")
    # 方式一 app[类名/标题]  推荐
    # 使用类名选择窗口
    dlg = app["TXGuiFoundation"]
    # 通过窗口标题
    # dlg = app["QQ"]

    # 方式二 app.类名
    # dlg = app.TXGuiFoundation

    # 打印窗口所有的控件
    dlg.print_control_identifiers()

5、窗口的操作方法

from pywinauto.application import Application


if __name__ == '__main__':
    # 启动qq
    app = Application("win32").start(r"D:\qq\Bin\QQ.exe")
    # 方式一 app[类名/标题]  推荐
    # 使用类名选择窗口
    # dlg = app["TXGuiFoundation"]
    # 通过窗口标题
    # dlg = app["QQ"]

    # 方式二 app.类名
    dlg = app.TXGuiFoundation
    # 打印窗口所有的控件
    dlg.print_control_identifiers()
    # 窗口最大化
    dlg.maximize()
    # 窗口最小化 就是窗口的-的意思 qq最小化托盘
    dlg.minimize()
    #恢复
    dlg.restore()
    # 获取窗口状态
    state = dlg.get_show_state()
    # 坐标
    rect = dlg.rectangle()
    # 关闭窗口
    dlg.close()

下面是坐标
在这里插入图片描述

三、简单案例

上述的资料我没了解太多,万事开头难,上去就给我报了太多错就不看他们的资料学习了,这里换了一套看着比较简单

这是视频地址

1、标题(title_re ,在已经打开的时候会用到)re代表正则

鼠标停留在任务栏中
在这里插入图片描述

2、小技巧(获取窗口)

from pywinauto.findwindows import find_elements

if __name__ == '__main__':
    # 查看当前窗口都有哪些可选中 或者替换为win32
    wins = find_elements(backend="uia")
    print(wins)

3、简单点击事件

注意要把微信移到最前面并且不能动鼠标

from pywinauto import Application

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")
    # 查看窗口的对话框
    dlgs = app.windows()
    print(dlgs)
    #  进入对话框
    dlg = app.window(title="微信")
    # 找到对应文字
    btn = dlg['仅传输文件']
    # 点击事件
    btn.click_input()

4、显示选中的元素,用颜色框住

btn.draw_outline(colour='red')

from pywinauto import Application

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")
    #  进入对话框
    dlg = app.window(title="微信")
    # 找到对应文字
    btn = dlg['登录']
    btn.draw_outline(colour='red')
    # 点击事件
    # btn.click_input()

5、使用工具定位

在这里插入图片描述

6、获取微信获取更多信息的版本

在这里插入图片描述

1、定位到按钮

from pywinauto.application import Application

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")
    #  进入对话框
    dlg = app.window(title="微信")
    # 让微信还原到界面上
    dlg.restore()
    # 根据条件去匹配find_elements()函数中查看都有哪些字典值  dlg["设置及其他"]
    #  btn = dlg["设置及其他"]
    kwargs = {"title":"设置及其他"}
    btn = dlg.child_window(**kwargs)
    # 红圈
    btn.draw_outline(colour='red')
2、使用打印(不要动鼠标 不然打印白瞎)

由于现在1、中的这个设置会点击才可以展示,所以UISpy就定位不到对应的位置所以我们就打印


from pywinauto.application import Application

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")

    #  进入对话框
    dlg = app.window(title="微信")
    # 让微信还原到界面上
    dlg.restore()
    # 根据条件去匹配
    kwargs = {"title":"设置及其他"}
    btn = dlg.child_window(**kwargs)
    #
    btn.draw_outline(colour='red')
    dlg.print_control_identifiers()

小技巧我们可以看到打印的内容,也就dlg.这个方法就可以定位到元素 dlg.child_window(**kwargs) 改为文字横线一样会定位到
在这里插入图片描述
新点出来的一般在上面,你从打印开头开始找找到就接着写

import time

from pywinauto.application import Application

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")

    #  进入对话框
    dlg = app.window(title="微信")
    # 让微信还原到界面上
    dlg.restore()
    # 根据条件去匹配
    btn = dlg["设置及其他"]
    #点击
    btn.click_input()
    dlg.child_window(title="设置", control_type="Button").click_input()
3、最后结果

在这里插入图片描述

import time

from pywinauto.application import Application

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")

    #  进入对话框
    dlg = app.window(title="微信")
    # 让微信还原到界面上
    dlg.restore()
    # 根据条件去匹配
    btn = dlg["设置及其他"]
    #点击
    btn.click_input()
    dlg.child_window(title="设置", control_type="Button").click_input()

	#  切换窗口
    app1 = Application(backend="uia").connect(title_re="设置")
    dlg = app1.window(title="设置")
    dlg.restore()
    btn1 = dlg["关于微信"]
    btn1.click_input()
    version = dlg.child_window(title_re = "微信 .*").texts()
    print(version)

7、微信文件助手发送消息

1、输入文字 选中窗口
import time

from pywinauto.application import Application
from pywinauto.keyboard import send_keys

if __name__ == '__main__':
    app = Application(backend="uia").connect(title_re="微信")

    #  进入对话框
    dlg = app.window(title="微信")
    # 让微信还原到界面上
    dlg.restore()
    # 根据条件去匹配
    btn = dlg["聊天"]
    btn.click_input()
    dlg.child_window(title="搜索").click_input()
    send_keys("文件传输助手")
    dlg.child_window(title="文件传输助手", control_type="ListItem").click_input()
    # 选中文件传输助手 第二种方案
    """
    dlg.set_focus()  # 激活窗口
    time.sleep(1)
    send_keys("{ENTER}")
    """
2、发送

这边看发送定位按钮自己去点击即可,这边就不写了,自己玩玩吧

8、打开软件并且进行点击注册账号

import time

from pywinauto.application import Application
from pywinauto.keyboard import send_keys

if __name__ == '__main__':
    # 启动qq
    app = Application("uia").start(r"D:\qq\Bin\QQScLauncher.exe")

    time.sleep(1)
    con = app.connect(title_re = "QQ")
    qq = con.window(title="QQ")
    qq.child_window(title="注册帐号", control_type="Button").click_input()

四、截屏微信登录二维码

注意需要把界面app拿出来到页面上哦


from pywinauto.application import Application
from PIL import ImageGrab

if __name__ == '__main__':
    # 启动qq
    app = Application("uia").connect(title = "微信")

    wx = app.window(title="微信")

    rect = wx.child_window(title="二维码").rectangle()
	### 截屏坐标  不加参数就是全屏截图
    screenshot = ImageGrab.grab(bbox=(rect.left, rect.top, rect.right, rect.bottom))
    ### 展示图片是阻塞方法x掉后才会进行后面
    screenshot.show()

五、切换页面(模拟 Alt + Tab 切换窗口)

from pywinauto.keyboard import send_keys
# 模拟 Alt + Tab 切换窗口
send_keys('%{TAB}')

六、窗口顶置

import win32gui
import win32con
  
  # 获取目标窗口的句柄
    hwnd = win32gui.FindWindow(None, "QQ")  # 替换为你要置顶窗口的标题

    # 将目标窗口置顶
    if hwnd:
        win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
        win32gui.SetForegroundWindow(hwnd)

七、不用time.sleep等待元素出现

此方法本人没尝试 大概是可以的 也就是循环去判断元素是否出现没啥难度 自己也可以实现

from pywinauto import application
from pywinauto.timings import wait_until, TimeoutError

# 启动应用程序
app = application.Application().start('notepad.exe')

# 定义等待条件
def element_exists():
    try:
        # 尝试获取元素,如果找到就返回 True
        app['Untitled - Notepad'].Edit
        return True
    except Exception as e:
        return False

# 等待直到元素出现,最长等待时间为10秒 每隔0.5查一下
try:
    wait_until(10, 0.5, element_exists)
    print("元素出现了!")
except TimeoutError:
    print("超时,未找到元素")

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

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

相关文章

梦想贩卖机升级版知识付费源码,包含前后端源码,非线传,修复最新登录接口问题

梦想贩卖机升级版,变现宝吸收了资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用…

yolov8n 瑞芯微RKNN和地平线Horizon芯片仿真测试部署,部署工程难度小、模型推理速度快

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 因为之前写了几篇yolov8模型部署的博文,存在两个问题&…

【AI】AI和医疗大数据(3/3)

目录 六、AI和医疗大数据的结合案例——基于卷积神经网络CT图像检测 ——步骤: ——技术: ——案例: ——典型应用步骤详解: 第一步:数据预处理 第二步:训练集构建 第三步:预测 第四&a…

Serverless无服务

软件工程的本质复杂度和次要复杂度 本质:如何从抽象的问题,发展出具体的概念上的解决方案(业务问题) 次要:指实现它的过程(技术手段) 过去解决了的次要复杂度(提升研发效率&#…

代币中的decimal精度代表了什么

精度的意义在于允许发送小数的代币。举例,一个CAT代币合约的精度为6。那么 你拥有1个CAT就意味着合约中的balance 1 * 10^6 , 转账 0.1CAT出去的话,就需要输入 0.1*10^6 10^5。 也就时在涉及代币时,查询到的余额、转账的代币数量 都和 代币…

用通俗易懂的方式讲解大模型分布式训练并行技术:MOE并行

前面的文章中讲述了数据并行、流水线并行、张量并行、序列并行、自动并行等多种并行技术。但现在的模型越来越大,训练样本越来越多,每个样本都需要经过模型的全部计算,这就导致了训练成本的平方级增长。 而当我们希望在牺牲极少的计算效率的…

使用numpy处理图片——90度旋转

在《使用numpy处理图片——镜像翻转和旋转》一文中,我们介绍了如何将图片旋转的方法。本文将使用更简单的方法旋转图片90度。 左旋转90度 import numpy as np import PIL.Image as Imagedata np.array(Image.open(the_starry_night.jpg))# left 90 rot90LeftWith…

电子学会C/C++编程等级考试2020年12月(二级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导

鸿蒙HarmonyOS兼容JS的类Web开发-开发指导 文章目录 鸿蒙HarmonyOS兼容JS的类Web开发-开发指导常用组件开发指导list开发指导创建list组件添加滚动条添加侧边索引栏实现列表折叠和展开场景示例 dialog开发指导创建dialog组件设置弹窗响应场景示例 form开发指导创建form组件实现…

一个完整的流程表单流转

1.写在前面 一个完整的流程表单审批&#xff08;起表单-->各环节审批-->回退-->重新审批-->完成&#xff09;&#xff0c;前端由Vue2jsElement UI升级为Vue3tsElement Plus&#xff0c;后端流程框架使用Flowable&#xff0c;项目参考了ruoyi-vue-pro(https://gite…

使用python读取yaml文件数据

使用python读取yaml文件&#xff1a; yaml文件数据&#xff1a;data.yaml login_data:url: http://www.baidu.comcase1:user1: password1: 12345errorText: 请输入用户名case2:user2: adminpassword2: errorText: 请输入密码case3:user3: adminpassword3: 123456errorText: 登…

视频监控设备通过onvif协议接入到视频监控平台

目 录 一、什么是onvif规范 1、onvif的定义 2、onvif的优势 二、AS-V1000监控平台对onvif的支持程度 二、通过onvif接入视频监控设备 1、onvif维护主页面 2、设备发现 3、设备验证 4、设备录入系统 5、通道配置 6、权限分配 三、对onvif设备进行…

【设计模式-6】建造者模式的实现与框架中的应用

建造者模式又被成为生成器模式&#xff0c;是一种使用频率比较低&#xff0c;相对复杂的创建型模式&#xff0c;在很多源码框架中可以看到建造者的使用场景&#xff0c;稍后我们会在本文末尾展示几个框架的使用案例。  建造者模式所构造的对象通常是比较复杂而且庞大的&#x…

C++ n皇后问题 || 深度优先搜索模版题

n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n 。 …

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码

SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码 HttpClient、HttpURLConnection、OkHttpClient区别切换HttpClient 源码分析总结切换HttpClient源码验证切换是否成功okHttpClient 切换源码分析总结 okHttpClient 切换源码同时开启 okHttp 与httpClient 会…

【数字人】8、EAT | 为数字人引入情感表情(ICCV2023)

论文&#xff1a;Efficient Emotional Adaptation for Audio-Driven Talking-Head Generation 代码&#xff1a;https://yuangan.github.io/eat/ 出处&#xff1a;ICCV2023 特点&#xff1a;能引入表情&#xff0c;但无法眨眼&#xff0c;需要 音频 pose 图片 同时作为输入…

Java文件自动生成文档

说明 此文章根据Gemini Pro 生成资料整理。 生成文档 javadoc -d mydoc -author -version HelloWorld.java javadoc -d mydoc -author -version HelloWorld.java 命令用于生成 Java 源文件的javadoc文档&#xff0c;并将javadoc文档输出到 mydoc 目录中。 javadoc&#xf…

Linux学习之网络编程2(socket,简单C/S模型)

写在前面 Linux网络编程我是看视频学的&#xff0c;Linux网络编程&#xff0c;看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 网络字节序 小端法&#xff1a;pc本地存储&#xff0c;高位存高地址&#xff0c;低位存低地…

AI技术已经发现了一种新材料,可以在电池制造中减少对锂的需求

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Docker 安装:在linux系统CentOS7 版本 安装Docker

目录 一&#xff0c;Docker介绍&#xff1a; 1.1Docker是什么&#xff1f; 1.2Docker组成 二&#xff0c;Docker安装&#xff1a; 三&#xff0c;Docker基本使用 3.1服务 3.2镜像 3.3容器 &#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&am…