系列文章

  1. 微信公众号数据采样试验
  2. mitmproxy实时数据处理
  3. appium对手机微信的自动化测试
  4. winAppDriver对桌面微信的自动化测试
  5. 场景文字识别的快速调研
  6. UI Automation对桌面微信的自动化测试
  7. 基于机器视觉的桌面窗体组件的目标检测.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import subprocess
import time
import uiautomation as auto

subprocess.Popen(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe", shell=True)

root = auto.GetRootControl()
wechatWindow = root.WindowControl(searchDepth=1, Name="微信")
wechatWindow.Maximize()

# 点击微信的通讯录、公众号, 找到公众号列表名单
wechatWindow.ButtonControl(searchDepth=4, Name="通讯录").Click()
wechatWindow.ListItemControl(searchDepth=7, Name="公众号").Click()

# 在公众号名单列表的面板, 点击"360家庭防火墙"公众号, 从而弹出资讯窗口.
wechatWindow.ButtonControl(searchDepth=10, Name="360家庭防火墙").Click()

# 从360家庭防火墙的资讯弹窗中, 提取资讯列表
wechatWindow.Hide()
publicAccountWindow = root.WindowControl(searchDepth=1, Name="公众号")
publicAccountWindow.SetFocus()
publicAccountWindow.Maximize()

# scroll down the window with mouse wheel
for i in range(0, 30):
publicAccountWindow.WheelDown(20)
time.sleep(0.1)

# show the main window of wechat, again
wechatWindow.Show()

事先打开并登录PC微信客户端, 然后运行上述代码, 可以看到微信客户端自动化地打开了”360家庭防火墙”公众号, 并且自动化地滚动弹窗、并翻阅了该公众号的资讯列表.

实现了这个功能, 相比于winAppDriver 对桌面微信的自动化测试已经可以算是一大进步了. 但是, 在这段代码中, 我还没有实现这个功能: 点击”360家庭防火墙”公众号中的网页链接.

结果讨论

其实, 基于UIA提供的方法, 我们是可以找到公众号的网页链接, 并自动化地依次点击网页列表. 但是这涉及到比较多的dirty work, 最大的麻烦在于:从无规律的树状结构中, 机械地提取出公众号的各个网页的element. 在我看来, 这种死板的”硬编码”既不”自动化”(尽量减少人为干预), 也不具备广泛的通用性(换个网页结构的公众号就歇菜).

因此, 我们需要一种更智能的方法去发现公众号的网页元素, 并对网页元素进行位置标记, 从而引导鼠标自动化点击目标元素.

网页链接等可视化元素的智能检测. 这自然而然让我联想到目标检测. 由于网页链接可视化元素总是与文字或图片相关, 因此, 我可以进一步将技术路线聚焦到场景文字检测图片检测. 我准备首先关注场景文字检测的理论知识和技术方法. 下面我将在新的文章[2]中简要记录这段历程.

参考资料