系列文章

  1. 微信公众号数据采样试验
  2. mitmproxy实时数据处理
  3. appium对手机微信的自动化测试
  4. winAppDriver对桌面微信的自动化测试
  5. 场景文字识别的快速调研
  6. UI Automation对桌面微信的自动化测试
  7. 基于机器视觉的桌面窗体组件的目标检测.notFinished

需求和目标

winAppDriver 对桌面微信的自动化测试中, 我们实现了通过抓取网络流量, 对公众号内容的收集. 为了更高效地对内容进行批量采集, 我们需要一种自动化的方法, 从而批量地激活网页流量. 因此, 在appium 对手机微信的自动化测试中, 我们试图用Appium对手机微信进行自动化操作, 同时以PC作为中间代理, 从而在PC上截获手机流量, 对内容进行爬取. 但这种方法存在两个缺陷:

  1. 需要对手机的Android进行root, 并植入用户证书. 而从Android12之后, 系统不再信任用户证书. 为了绕后系统安全措施, 我们需要进一步对手机微信app进行逆向;

  2. 通过手机微信进行爬取, 需要长时间无法使用手机. 如果任务量太大, 可能需要专门的手机. 成本太高.

所以需要反思: 我们是否问对了问题? 是否有其它的方式.

回到此项任务的需求, 我们只是需要点击微信公众号中的链接, 从而触发流量. 仅此而已. 手机上有微信, PC上也有微信客户端. 我们完全可以在PC上进行这项工作.

而在PC上对软件进行自动化操作, 我们选择相对靠近底层的方式. 这样的话, 就有WinAppDriver和UI Automation两个自动化框架.

开发环境配置

WinAppDriver, 全称为 Windows Application Driver, 它是 Windows 上一个类似 Selenium 的 UI 自动化驱动服务框架. 在Appium 2.0版本之后, WinAppDriver作为Appium的拓展驱动, 可以使用 Appium-Python-Client的python库完成对 Windows 桌面程序的自动化操作. 考虑到它的操作逻辑与Appium 2.0非常相似, 我希望通过对WinAppDriver的应用, 顺便掌握Appium的使用方法 — 这样以后在对Android的App进行自动化操作时会省力一些.

具体操作步骤和顺序如下文.

启用”开发者模式”

如下图, 在Windows 11中, 打开设置, 选择”隐私与安全性”, 然后开启”开发人员模式”.

winAppDriver对桌面微信的自动化测试-在windows11中启用开发者模式.png

安装配置Appium

1. 在Windows的`PowerShell`中, 安装`Appium`
1
npm i --location=global appium

然后测试运行Appium:

1
appium

如果遇到下述错误:

1
appium : 无法加载文件 C:\Users\nirvana\AppData\Roaming\npm\appium.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?Lin kID=135170 中的 about_Execution_Policies。

请以管理员权限打开PowerShell, 并执行如下命令: set-ExecutionPolicy RemoteSigned .

2. 为Appium安装WinAppDriver的驱动.

资料 [1] 提到: WinAppDriver可以单独运行, 也可以和Appium同时使用. 此处, 我们选择Appium+WinAppDriver的启动方式, 因为这种方式能让我们在日后的其它Android的App自动化工作具有一致性.

为此, 我们需要为Appium安装WinAppDriver的驱动 [2] . 利用如下指令, 为Appium 2.0 安装WinAppDriver的驱动:

1
appium driver install --source=npm appium-windows-driver
3. 为Appium安装类库python-client, 用python进行自动化测试

安装命令如下 [3]

1
pip install Appium-Python-Client

至此, 我们已经完成了Appium的安装和配置. 下面, 我们将进行自动化测试的编写.

代码测试

如下图所示, 启动Appium服务器:

winAppDriver对桌面微信的自动化测试-启动Appium服务器.png

从上图可以发现, 在多个IP地址上均打开了4723端口.

然后在PC上打开微信客户端. 接着执行如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from appium import webdriver
from appium.webdriver.common.appiumby import By
from appium.options.windows import WindowsOptions

classic_options = WindowsOptions()
classic_options.platform_name = "Windows"
classic_options.app = "C:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe"

drv = webdriver.Remote("http://127.0.0.1:4723", options=classic_options)
drv.maximize_window()
drv.find_element(By.NAME, "通讯录").click()
drv.find_element(By.NAME, "公众号").click()
drv.find_element(By.NAME, "5G智联车").click()

使用上述代码, 即可成功地自动地打开微信, 然后依次控制鼠标点击 “通讯论”、”公众号”、”5G智联车”(公众号). 因为涉及隐私, 这里不展示具体的动图.

至此, 我们利用WinAppDrive(在Appium框架下), 成功地打开了一个具体的公众号窗口, 如下图所示:

winAppDriver对桌面微信的自动化测试-打开的公众号界面.png

结果讨论

然而悲催的是, 我只走到了这一步就打算放弃了这条技术路线. 原因有三个:

  1. WinAppDriver无法灵活地获取主窗口外的其它窗口, 譬如弹出窗口. 在本例中, 公众号是有微信主窗口弹出的窗口.

WinAppDriver只提供了两个函数用于获取窗口句柄: current_window_handle用于获取当前窗口的句柄、window_handles用于获取当前driver的所有窗口句柄. 只靠这两个函数, 无法在多个窗口间自由、灵活地切换焦点.

  1. WinAppDriver的句柄的类型是str, 这种句柄类型与其它的窗口程序的句柄不兼容.

在python中,窗口句柄经常具有Pyhandle类型, 因此WinAppDriver的窗口句柄无法直接给其它的窗口操作函数使用. 更要命的是, 目前似乎还没有方法在strPyhandle直接转换.

  1. WinAppDrive对于复杂的窗口控件, 难以快捷、精确的定位和操作.

WinAppDriver提供了XPath方式定位窗口空间, 但是需要事先知道XPath的精确描述. 这样我们就陷入了”鸡生蛋、蛋生鸡”的怪圈. 我们做爬虫就是因为实现往往难以知道网页的文档结构, 如果必须知道文档结构才能爬取网页, 那我们要爬虫干嘛?!

基于上述原因, 对于具有多窗口、控件结构复杂的PC端软件的自动化操作, 我放弃了WinAppDrive这条技术路线. 回到本文开头, 我决定使用另外一条PC上的Windows软件自动化操作的技术路线, 即UI Automation (参见UI Automation 对桌面微信的自动化测试).

参考与注释