关于python自动化测试的问题,请大家来指点谢谢
本帖最后由 混沌夜漩船长V 于 2025-1-20 12:25 编辑我们公司使用的是定制的企业版微信,我需要收集某个群的所有信息,做到不重复不漏不错,因此尝试使用pywinauto库来获取窗口控件以监控大家发来的消息。可是问题来了:
1、我如果直接用pywinauto,只能获取到最顶层的几个窗口,使用print_control_dientifiers()即可知,只有5层窗口。
2、但如果我再打开inspect等刺探工具,刺探一下窗口的某个元素,再用print_control_dientifiers()打印结构树,就发现可以打印出十几层窗口,找到我想要的元素。
3、如果我关闭刺探工具,将企业微信关了再重开,又只能打印出5层窗口。
由于公司规定我不方便截图,想问下大家,这种情况有朋友遇到过吗?是什么问题导致的和如何解决呢? 混沌夜漩船长V 发表于 2025-01-23 10:05
FishC 发表于 2025-1-20 12:19
关于 Python 自动化测 ...
关于你的问题,非常有意思,确实很多工具在“刺探”窗口时,会触发某些隐藏的控件变得可见或可读,这可能跟操作系统的事件、焦点处理或者特定的窗口属性有关。
以下有几个可能导致界面可读性的操作,以及你可以尝试用代码复现的方式:
1. 刺探工具触发窗口更新的原因
[*] 刺探工具(如 Inspect)通常会强制刷新窗口树,向窗口发送某些请求,让它上报更多的控件结构。
[*] 通过这些工具,可能触发了 UI 树的 **Accessibility(辅助功能)** 接口,让隐藏的控件变得可读。
[*] 一些控件只有在特定焦点事件(如鼠标悬停、键盘聚焦)发生时才会加载信息。
2. 尝试通过代码复现触发操作
以下是几种常见的代码模拟操作,你可以尝试逐步排查:
(1)尝试使用 pywinauto 模拟焦点切换:
部分控件可能需要在得到焦点后才能完整暴露。这是使用 pywinauto 强制切换焦点与刷新控件树的方法:
from pywinauto import Application
from pywinauto.controls.uia_controls import ButtonWrapper
# 启动企业微信进程,具体进程路径需要替换
app = Application(backend='uia').connect(path="WeCom.exe")
window = app.window(title="企业微信")# 替换为窗口标题
# 强制切换焦点到窗口(可能触发刷新控件树)
window.set_focus()
# 模拟鼠标点击或者键盘操作
try:
some_button = window.child_window(title="某控件标题", control_type="Button")
ButtonWrapper(some_button).click_input()# 模拟实际操作
except Exception as e:
print("操作失败:", e)
# 再次打印控件树
window.print_control_identifiers()
(2)尝试使用鼠标悬停操作:
一些控件可能只有鼠标悬停或右击菜单时才上报信息,可通过 pywinauto 模拟:
from pywinauto.mouse import move, click
# 获取控件坐标位置
rect = some_button.rectangle()
center_x = rect.left + (rect.right - rect.left) // 2
center_y = rect.top + (rect.bottom - rect.top) // 2
# 移动鼠标并点击
move(coords=(center_x, center_y))
click(coords=(center_x, center_y))
(3)尝试使用 Windows 无障碍接口(Accessibility API):
使用 comtypes 调用 Windows 的辅助功能接口,直接通过焦点事件或刷新窗口树暴露更多控件。
(4)强制使用 SendMessage 模拟消息事件:
部分情况下,你也可以用 ctypes 手动向窗口(或控件)发送消息,例如 WM_UPDATEUISTATE、WM_PAINT 等。
import ctypes
from ctypes import wintypes
# 发送 WM_PAINT 消息强制刷新界面
user32 = ctypes.WinDLL('user32', use_last_error=True)
hwnd = window.handle# 获取窗口句柄
WM_PAINT = 0x000F
user32.SendMessageW(hwnd, WM_PAINT, 0, 0)
3. 确保后台运行环境一致
有时候控件的隐藏/暴露跟程序的运行状态有关,例如是否在前台运行、是否最小化窗口、操作过程中是否有延迟等。
可以通过以下步骤确保运行环境一致:
[*] 确保企业微信始终在前台:用 window.set_focus() 强制切换到前台。
[*] 控制操作的节奏:加 time.sleep(),避免快速操作忽略界面加载。
[*] 强制刷新窗口界面:通过模拟输入、滚动操作触发控件重绘。
4. 替代方案建议
如果仍然无法通过 pywinauto 或其他工具获取到目标控件,可以考虑:
[*] 使用 Selenium 自动化控制 Chrome 浏览器,通过微信网页版接入企业微信 API。
[*] 使用企业微信官方提供的 API 来拉取数据(参考:企业微信开发文档)。]https://work.weixin.qq.com/api/doc]企业微信开发文档)。
[*] 结合 OCR 技术读取特定区域的文字。
希望这些方法能帮你复现刺探工具的触发逻辑,如果有进一步问题,欢迎继续讨论!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 关于 Python 自动化测试读取企业微信消息的问题
根据你的问题描述,这里是一些可能的指导思路和建议:
[*] pywinauto 的局限性:
pywinauto 是针对 Windows GUI 应用的自动化库,但某些现代化的企业应用(如企业版微信)可能会加密界面或控件,从而导致 pywinauto 无法获取完整的控件信息。如果你发现使用 pywinauto 获取控件失败,可以尝试其他方法,例如 OCR 技术。
[*] OCR 技术破解控件限制:
可以使用光学字符识别(OCR)技术读取屏幕上的文本。例如:
from PIL import ImageGrab
import pytesseract
# 截取屏幕然后分析文字
screenshot = ImageGrab.grab(bbox=(左, 上, 右, 下))# 替换具体坐标
text = pytesseract.image_to_string(screenshot, lang='chi_sim')
print(text)
这种方法虽然不直接操作控件,但对读取固定区域的文字非常有效。
[*] 使用企业微信的开放接口:
部分企业微信支持开发者接口(API),可以通过调用官方的接口来获取群聊信息,这样可以避免直接用 GUI 加载控件来读取。你可以参考企业微信的开发文档:企业版微信开发文档。]https://work.weixin.qq.com/api/doc]企业版微信开发文档。
[*] 定时监控与去重逻辑:
为避免重复记录消息,可以使用数据库或集合数据结构来保存已处理的消息 ID。例如:
processed_ids = set()
def process_message(msg):
if msg['id'] not in processed_ids:
print("处理新消息:", msg['content'])
processed_ids.add(msg['id'])
这样能够确保对消息 不重复、不漏处理。
[*] 法律合规注意事项:
请确保你的自动化操作符合公司规定和隐私政策,不要违反相关法律法规哦!
如有进一步问题,可以详细描述具体的报错或需求,让大家更好地帮你解决! :)
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2025-1-20 12:19
关于 Python 自动化测试读取企业微信消息的问题
根据你的问题描述,这里是一些可能的指导思路和建议:
我理解是这些工具肯定通过某种操作触发了企业微信的界面可读性,我想知道到底是什么操作导致的,而我自己能否通过代码复现这个操作,而不是要打开这些刺控工具才能读到想要的控件。 解决方案和建议供参考:
1. 权限问题:确保您的脚本以管理员权限运行。有时,应用程序的权限设置会限制对窗口控件的访问。
2. 刷新控件树:在某些情况下,窗口控件的状态可能会被缓存。尝试在执行`print_control_identifiers()`之前,先添加一些延迟时间(例如使用`time.sleep()`),或者在获取控件前调用一些方法来刷新窗口状态。
3. 尝试其他库:除了`pywinauto`,您还可以考虑使用其他的库,如`pygetwindow`、`pyautogui`或`uiautomation`,这些库可能在某些情况下提供更好的窗口控制和信息获取能力。
4. Inspect工具的影响:有时,使用像Inspect这样的工具会影响到应用程序的状态。它可能会改变某些控件的可访问性或状态。确保在使用`pywinauto`时尽量避免其他工具的干扰。
5. 使用更高级的API:如果企业微信提供了API接口,考虑使用API来获取消息信息,这通常是更稳定和可靠的方式。
6. 查看文档或社区支持:访问`pywinauto`的官方文档或社区支持,看看是否有类似问题的讨论和解决方案。
页:
[1]