winAppDriver对桌面微信的自动化测试
系列文章
- 微信公众号数据采样试验
- mitmproxy实时数据处理
- appium对手机微信的自动化测试
- winAppDriver对桌面微信的自动化测试
- 场景文字识别的快速调研
- UI Automation对桌面微信的自动化测试
- 基于机器视觉的桌面窗体组件的目标检测.notFinished
需求和目标
在winAppDriver 对桌面微信的自动化测试中, 我们实现了通过抓取网络流量, 对公众号内容的收集. 为了更高效地对内容进行批量采集, 我们需要一种自动化的方法, 从而批量地激活网页流量. 因此, 在appium 对手机微信的自动化测试中, 我们试图用Appium对手机微信进行自动化操作, 同时以PC作为中间代理, 从而在PC上截获手机流量, 对内容进行爬取. 但这种方法存在两个缺陷:
需要对手机的Android进行root, 并植入用户证书. 而从Android12之后, 系统不再信任用户证书. 为了绕后系统安全措施, 我们需要进一步对手机微信app进行逆向;
通过手机微信进行爬取, 需要长时间无法使用手机. 如果任务量太大, 可能需要专门的手机. 成本太高.
所以需要反思: 我们是否问对了问题? 是否有其它的方式.
回到此项任务的需求, 我们只是需要点击微信公众号中的链接, 从而触发流量. 仅此而已. 手机上有微信, 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中, 打开设置, 选择”隐私与安全性”, 然后开启”开发人员模式”.
安装配置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
.
资料 [1] 提到: WinAppDriver可以单独运行, 也可以和Appium同时使用. 此处, 我们选择Appium+WinAppDriver的启动方式, 因为这种方式能让我们在日后的其它Android的App自动化工作具有一致性.
为此, 我们需要为Appium安装WinAppDriver的驱动 [2] . 利用如下指令, 为Appium 2.0 安装WinAppDriver的驱动:
1 | appium driver install --source=npm appium-windows-driver |
安装命令如下 [3]
1 | pip install Appium-Python-Client |
至此, 我们已经完成了Appium的安装和配置. 下面, 我们将进行自动化测试的编写.
代码测试
如下图所示, 启动Appium服务器:
从上图可以发现, 在多个IP地址上均打开了4723端口.
然后在PC上打开微信客户端. 接着执行如下代码:
1 | from appium import webdriver |
使用上述代码, 即可成功地自动地打开微信, 然后依次控制鼠标点击 “通讯论”、”公众号”、”5G智联车”(公众号). 因为涉及隐私, 这里不展示具体的动图.
至此, 我们利用WinAppDrive(在Appium框架下), 成功地打开了一个具体的公众号窗口, 如下图所示:
结果讨论
然而悲催的是, 我只走到了这一步就打算放弃了这条技术路线. 原因有三个:
- WinAppDriver无法灵活地获取主窗口外的其它窗口, 譬如弹出窗口. 在本例中, 公众号是有微信主窗口弹出的窗口.
WinAppDriver只提供了两个函数用于获取窗口句柄:
current_window_handle
用于获取当前窗口的句柄、window_handles
用于获取当前driver的所有窗口句柄. 只靠这两个函数, 无法在多个窗口间自由、灵活地切换焦点.
- WinAppDriver的句柄的类型是
str
, 这种句柄类型与其它的窗口程序的句柄不兼容.
在python中,窗口句柄经常具有
Pyhandle
类型, 因此WinAppDriver的窗口句柄无法直接给其它的窗口操作函数使用. 更要命的是, 目前似乎还没有方法在str
和Pyhandle
直接转换.
- WinAppDrive对于复杂的窗口控件, 难以快捷、精确的定位和操作.
WinAppDriver提供了XPath方式定位窗口空间, 但是需要事先知道XPath的精确描述. 这样我们就陷入了”鸡生蛋、蛋生鸡”的怪圈. 我们做爬虫就是因为实现往往难以知道网页的文档结构, 如果必须知道文档结构才能爬取网页, 那我们要爬虫干嘛?!
基于上述原因, 对于具有多窗口、控件结构复杂的PC端软件的自动化操作, 我放弃了WinAppDrive这条技术路线. 回到本文开头, 我决定使用另外一条PC上的Windows软件自动化操作的技术路线, 即UI Automation (参见UI Automation 对桌面微信的自动化测试).