UI Automation对桌面微信的自动化测试
系列文章
- 微信公众号数据采样试验
- mitmproxy实时数据处理
- appium对手机微信的自动化测试
- winAppDriver对桌面微信的自动化测试
- 场景文字识别的快速调研
- UI Automation对桌面微信的自动化测试
- 基于机器视觉的桌面窗体组件的目标检测.notFinished
方案设计
在尝试了手机端Appium、PC端WinAppDriver(基于Appium)的自动化测试失败之后, 我们在本文尝试了基于微软的UI Automation的PC端微信自动化测试的方案.
Microsoft UI Automation(UIA)是适用于Microsoft Windows的辅助功能框架. 它满足了辅助技术产品和自动化测试框架的需求, 通过提供对用户界面(UI)信息的编程访问来实现. 此外, UI Automation还使控件和应用程序开发人员能够使其产品具有辅助功能. 对于UIA的简要介绍可以参考此文 [1] ; 而明确此文中UIA的几个概念, 则是使用该框架的一个必要前提. 在本节我将用大白话将这几个概念做个备注. 它们是:
UI Automation tree(UI自动化树)
日常生活中, 当我们打开Windows系统、它也正常运行时, 系统中所有基于窗体的软件, 会在系统中以树状的结构有个”备案”. 当前的虚拟桌面是root; 每个软件窗体是leaf; 窗体中包含的控件(Control)又是窗体的leaf — 这样一层有一层地嵌套着, 对当前桌面中所有的窗体、及其包含的元素(Element)进行描述.
UI Automation elements(UI自动化元素)
如上一段所属, “元素”就是窗体包含的控件等.
UI Automation properties(UI自动化属性)
窗体所包含的控件的属性.
Control patterns(控件模式)
这个需要重点提示. 所谓的”控件模式”可以理解为控件所具备的功能集合. 每个功能集合又包含一组函数和属性. 可以简单地将 Control Pattern 理解为控件的子类. 这些子类的manual要去微软的网站上查手册.
UI Automation events(UI自动化事件)
Windows系统的运行是基于消息驱动的, 系统对各种消息进行处理. 而触发消息发射的, 就是”事件”. 这些事件可能是人为地点击了某个按钮, 也可能是系统自行启动的, 还有可能是外部网络引发的.
试验代码
首先安装Python的UIA库:
1 | pip install uiautomation |
然后再vscode中新建一个文件, 命名为testUIAutomation.py
, 内容如下:
1 | import subprocess |
事先打开并登录PC微信客户端, 然后运行上述代码, 可以看到微信客户端自动化地打开了”360家庭防火墙”公众号, 并且自动化地滚动弹窗、并翻阅了该公众号的资讯列表.
实现了这个功能, 相比于winAppDriver 对桌面微信的自动化测试已经可以算是一大进步了. 但是, 在这段代码中, 我还没有实现这个功能: 点击”360家庭防火墙”公众号中的网页链接.
结果讨论
其实, 基于UIA提供的方法, 我们是可以找到公众号的网页链接, 并自动化地依次点击网页列表. 但是这涉及到比较多的dirty work, 最大的麻烦在于:从无规律的树状结构中, 机械地提取出公众号的各个网页的element. 在我看来, 这种死板的”硬编码”既不”自动化”(尽量减少人为干预), 也不具备广泛的通用性(换个网页结构的公众号就歇菜).
因此, 我们需要一种更智能的方法去发现公众号的网页元素, 并对网页元素进行位置标记, 从而引导鼠标自动化点击目标元素.
网页链接等可视化元素的智能检测. 这自然而然让我联想到目标检测. 由于网页链接可视化元素总是与文字或图片相关, 因此, 我可以进一步将技术路线聚焦到场景文字检测和图片检测. 我准备首先关注场景文字检测的理论知识和技术方法. 下面我将在新的文章[2]中简要记录这段历程.