鱼C论坛

 找回密码
 立即注册
查看: 130|回复: 4

关于python自动化测试的问题,请大家来指点谢谢

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 混沌夜漩船长V 于 2025-1-20 12:25 编辑

我们公司使用的是定制的企业版微信,我需要收集某个群的所有信息,做到不重复不漏不错,因此尝试使用pywinauto库来获取窗口控件以监控大家发来的消息。可是问题来了:
1、我如果直接用pywinauto,只能获取到最顶层的几个窗口,使用print_control_dientifiers()即可知,只有5层窗口。
2、但如果我再打开inspect等刺探工具,刺探一下窗口的某个元素,再用print_control_dientifiers()打印结构树,就发现可以打印出十几层窗口,找到我想要的元素。
3、如果我关闭刺探工具,将企业微信关了再重开,又只能打印出5层窗口。
由于公司规定我不方便截图,想问下大家,这种情况有朋友遇到过吗?是什么问题导致的和如何解决呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
关于 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 加载控件来读取。你可以参考企业微信的开发文档:[url=企业版微信开发文档。]https://work.weixin.qq.com/api/doc]企业版微信开发文档[/url]。[/url]
  • 定时监控与去重逻辑:  
    为避免重复记录消息,可以使用数据库或集合数据结构来保存已处理的消息 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 昨天 10:05 | 显示全部楼层
FishC 发表于 2025-1-20 12:19
关于 Python 自动化测试读取企业微信消息的问题

根据你的问题描述,这里是一些可能的指导思路和建议:


我理解是这些工具肯定通过某种操作触发了企业微信的界面可读性,我想知道到底是什么操作导致的,而我自己能否通过代码复现这个操作,而不是要打开这些刺控工具才能读到想要的控件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 昨天 10:05 | 显示全部楼层
混沌夜漩船长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_UPDATEUISTATEWM_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 来拉取数据(参考:[url=企业微信开发文档)。]https://work.weixin.qq.com/api/doc]企业微信开发文档[/url])。[/url]
  • 结合 OCR 技术读取特定区域的文字。


希望这些方法能帮你复现刺探工具的触发逻辑,如果有进一步问题,欢迎继续讨论!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-24 02:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表