Windows技巧:轻松连接多进程窗口之一
一、前言
Windows
窗口的时候,有些同学会遇到一个应用但是打开了几个不同的进程窗口,但是在AirtestIDE搜索窗口只有一个或寻找窗口名称都是统一名称的时候,又应该如何处理呢?那么今天我们一起来探讨下这个问题吧~ 二、获取Windows应用进程相关信息方式
Windows
应用进程的相关信息,我们需要确保我们的 python
环境中含有下面几种库,建议在本地的 python
环境中进行修改,并将 AirtestIDE
的 python
环境更换为本地的 python
环境。 pip install psutil
pip install pywinauto
2.1 获取Windows所有进程
for proc in psutil.process_iter(['pid', 'name', 'create_time']):
print(proc.info)
2.2 获取进程异常类
#当在当前进程列表中找不到具有给定 pid的进程时,或者当进程不再存在时,由类方法引发。
psutil.NoSuchProcess(pid, name=None, msg=None)
#当由于权限不足而拒绝执行操作的权限时, 由类方法引发。
psutil.AccessDenied(pid=None, name=None, msg=None)
#如果超时并且进程仍然存在,则通过方法引发。
psutil.TimeoutExpired(seconds, pid=None, name=None, msg=None)
2.3 判断进程是否有界面
pywinauto
库下的 findwindows.find_window(process=pid)
获取窗口句柄去进行判断,当获取的窗口句柄长度大于0时,则证明该进程有界面。 def has_gui(pid):
try:
windows = findwindows.find_windows(process=pid)
return len(windows) > 0
except Exception as e:
return False
2.4 使用进程pid去连接特定进程
pid
号进行连接特定的进程窗口,就算有多个进程窗口,我们也可以根据不同窗口的进程 pid
去进行连接测试。 dev = connect_device(f"Windows:///?process=pid")
Windows
小技巧也可以查看我们教程文档: # 连接一个Windows窗口,窗口句柄为123456
dev = connect_device("Windows:///123456")
# 连接一个Windows窗口,窗口名称匹配某个正则表达式
dev = connect_device("Windows:///?title_re=Unity.*")
# 连接windows桌面,不指定任何窗口,对应IDE的桌面模式
dev = connect_device("Windows:///")
三、使用案例
pid
的方法,那么我们实际运用起来的效果会是怎么样的呢? pid
,再连接上对应的应用窗口并调出来,并进行测试操作。 # -*- encoding=utf8 -*-
__author__ = "Airtest"
import psutil
from pywinauto import findwindows
from airtest.core.api import *
# 获取所有进程信息
def get_process_info(process_name):
process_info_list = []
# 获取本地目前所有的进程并查找我们需要连接的进程
for proc in psutil.process_iter(['pid', 'name', 'create_time']):
#将需要搜索的进程信息加入到列表里,并在搜索结束后返回列表
try:
if process_name.lower() in proc.info['name'].lower():
process_info_list.append(proc.info)
#当出现异常时,直接跳过
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
return process_info_list
# 判断进程是否有界面
def has_gui(pid):
try:
#利用pid去获取窗口句柄,当窗口句柄大于0时,则证明该进程有窗口界面
windows = findwindows.find_windows(process=pid)
return len(windows) > 0
except Exception as e:
return False
# 选择特定进程
def select_process(process_info_list):
for proc_info in process_info_list:
# 判断进程是否有界面
if has_gui(proc_info['pid']):
return proc_info['pid']
return None
# 连接到特定进程并进行操作
def connect_and_operate(process_info):
if process_info:
try:
# 连接到特定进程窗口
dev = connect_device(f"Windows:///?process={process_info}")
print("Target process found.")
# 连接后可以进行自动化操作,例如点击、输入等,这里仅做截图操作
sleep(3.0)
snapshot(msg="当前界面截图", quality=90)
#遇到异常后,将异常信息抛出
except Exception as e:
print(f"Error during connecting or operating: {e}")
else:
print("No target process found.")
if __name__ == "__main__":
process_name = "有道云笔记.exe" # 示例应用程序名称
# 获取所有目标应用的进程信息
process_info_list = get_process_info(process_name)
print(f"Found processes: {process_info_list}")
# 选择特定进程(通过动态获取对应进程的pid,进行连接)
selected_process = select_process(process_info_list)
print(f"Selected process: {selected_process}")
# 连接到特定进程并进行操作
connect_and_operate(selected_process)
四、小结
Windows
上有关获取进程相关信息的方法,分别是: pid
去连接特定进程 本文分享自微信公众号 - AirtestProject(AirtestProject)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
🔥🔥🔥一款兼具 “高性能、高颜值、高活跃” 的分布式任务调度与重试平台 Beta3 版本正式发布
🔥🔥🔥 灵活,可靠和快速的分布式任务重试和分布式任务调度平台 ✅️ 可重放,可管控、为提高分布式业务系统一致性的分布式任务重试平台 ✅️ 支持秒级、可中断、可编排的高性能分布式任务调度平台 特别声明 📢特别声明 为了促进系统的更好发展,我们正式宣布自本版本起,EasyRetry将更名为 SnailJob,并从版本号 1.0.0 开始,请大家尽快迁移至 SnailJob。由于包路径和表结构的调整,新版本将不再兼容之前的EasyRetry版本,EasyRetry版本会继续做 BUG 修复。对此给大家带来的不便,我们深表歉意,并感谢大家的理解与支持 项目特性 易用性业务接入成本小。避免依赖研发人员的技术水平,保障稳定性 灵活性能够动态调整配置,启动 / 停止任务,以及终止运行中的任务 操作简单分钟上手,支持 WEB 页面对任务数据 CRUD 操作。 数据大盘实时管控系统任务数据 分布式重试任务支持多样化退避策略、多样化重试类型、流量管控等 分布式调度任务提供丰富的任务触发策略、任务分片、停止恢复、失败重试等 工作流任务编排仿钉钉设计的流程编排引擎,支持复杂的功能编排、失败重试、告警等...
- 下一篇
Rust 专用 IDE - RustRover 正式版发布,个人非商用免费!
自从八个月前宣布推出 RustRover 公开预览版以来,我们一直在致力于塑造我们对这款功能丰富的 Rust IDE 的愿景。现在,我们很高兴地宣布推出这款全新 IDE 的正式版,这款 IDE 现已加入我们的现有 JetBrains IDEs 系列。 我们要感谢所有早期采用者的信任、持续支持、积极测试和宝贵反馈,这使我们得以在产品正式发布之前解决最关键的问题。我们现在的目标是确保尽己所能提供最优质的 IDE,让您对 Rust 的热爱经久不息。 新的许可模式 今天不仅仅是要发布 RustRover 这款 JetBrains IDE。我们还有更多令人兴奋的消息要分享。对于 RustRover,我们现在将提供新的许可模式,其中包含两种方案: 免费个人非商业选项 付费商业选项 如果您是出于非商业目的而使用 RustRover 的个人,则可以免费使用该 IDE。但是,如果您计划将 RustRover 用于商业目的,则需要购买许可证,就像我们的其他产品一样。 为了降低价格,我们削减了一些较少被用到的功能。其中大多数功能仍会以付费或免费插件形式提供,以便您根据自身需求调整 IDE。 无论您是自雇还是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启